LLZK 2.0.0
An open-source IR for Zero Knowledge (ZK) circuits
Loading...
Searching...
No Matches
LLZKEnforceNoOverwritePass.cpp
Go to the documentation of this file.
1//===-- LLZKEnforceNoOverwritePass.cpp --------------------------*- C++ -*-===//
2//
3// Part of the LLZK Project, under the Apache License v2.0.
4// See LICENSE.txt for license information.
5// Copyright 2026 Project LLZK
6// SPDX-License-Identifier: Apache-2.0
7//
8//===----------------------------------------------------------------------===//
13//===----------------------------------------------------------------------===//
14
20
21#include <mlir/Analysis/DataFlowFramework.h>
22
23#include <llvm/Support/Debug.h>
24
25#include <memory>
26
27namespace llzk {
28#define GEN_PASS_DECL_ENFORCENOMEMBEROVERWRITEPASS
29#define GEN_PASS_DEF_ENFORCENOMEMBEROVERWRITEPASS
31} // namespace llzk
32
33#define DEBUG_TYPE "llzk-enforce-no-overwrites-pass"
34
35using std::make_unique;
36
37using namespace mlir;
38
39namespace llzk {
40
41using namespace function;
42using namespace component;
43
45 : public llzk::impl::EnforceNoMemberOverwritePassBase<EnforceNoMemberOverwritePass> {
46
47 void runOnOperation() override {
48 getOperation()->walk([this](StructDefOp structDef) {
49 auto result = analyzeStruct(structDef);
50 if (failed(result)) {
51 signalPassFailure();
52 }
53 const auto &[overwrites, written] = *result;
54
55 for (auto member : structDef.getMemberDefs()) {
56 if (!written.contains(member.getSymName())) {
57 signalPassFailure();
58 }
59 }
60
61 if (!overwrites.empty()) {
62 signalPassFailure();
63 }
64 });
65 }
66};
67
68std::unique_ptr<mlir::Pass> createNoOverwritesPass() {
69 return make_unique<EnforceNoMemberOverwritePass>();
70}
71} // namespace llzk
::std::vector< MemberDefOp > getMemberDefs()
Get all MemberDefOp in this structure.
Definition Ops.cpp:456
llvm::FailureOr< std::pair< llvm::SetVector< Overwrite >, FuzzySet > > analyzeStruct(component::StructDefOp structDef)
std::unique_ptr< mlir::Pass > createNoOverwritesPass()