LLZK 2.0.0
An open-source IR for Zero Knowledge (ZK) circuits
Loading...
Searching...
No Matches
LLZKValidationPasses.cpp
Go to the documentation of this file.
1//===-- LLZKValidationPasses.cpp - LLZK validation passes -------*- C++ -*-===//
2//
3// Part of the LLZK Project, under the Apache License v2.0.
4// See LICENSE.txt for license information.
5// Copyright 2025 Veridise Inc.
6// SPDX-License-Identifier: Apache-2.0
7//
8//===----------------------------------------------------------------------===//
14//===----------------------------------------------------------------------===//
15
17
21
22#include <mlir/IR/BuiltinOps.h>
23
24// Include the generated base pass class definitions.
25namespace llzk {
26#define GEN_PASS_DEF_MEMBERWRITEVALIDATORPASS
28} // namespace llzk
30using namespace mlir;
31using namespace llzk;
32using namespace llzk::component;
33using namespace llzk::function;
34
35namespace {
36class MemberWriteValidatorPass
37 : public llzk::impl::MemberWriteValidatorPassBase<MemberWriteValidatorPass> {
38 void runOnOperation() override {
39 StructDefOp structDef = getOperation();
41 auto result = analyzeStruct(structDef);
42 if (failed(result)) {
43 signalPassFailure();
44 }
45 const auto &[overwrites, written] = *result;
47 for (auto member : structDef.getMemberDefs()) {
48 if (!written.contains(member.getSymName())) {
49 member->emitWarning("member may not be written to").report();
50 }
51 }
52
53 for (auto [first, over] : overwrites) {
54 auto diag = over->emitWarning() << "may overwrite '" << MemberDefOp::getOperationName()
55 << "' \"@" << over.getMemberName() << '"';
56 diag.attachNote(first.getLoc()) << "previously written to here";
57 diag.report();
58 }
59
60 markAllAnalysesPreserved();
61 }
62};
63} // namespace
64
65std::unique_ptr<mlir::Pass> llzk::createMemberWriteValidatorPass() {
66 return std::make_unique<MemberWriteValidatorPass>();
67};
static constexpr ::llvm::StringLiteral getOperationName()
Definition Ops.h.inc:353
::std::vector< MemberDefOp > getMemberDefs()
Get all MemberDefOp in this structure.
Definition Ops.cpp:456
std::unique_ptr< mlir::Pass > createMemberWriteValidatorPass()
llvm::FailureOr< std::pair< llvm::SetVector< Overwrite >, FuzzySet > > analyzeStruct(component::StructDefOp structDef)