LLZK 2.1.1
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_DEF_ENFORCENOMEMBEROVERWRITEPASS
30} // namespace llzk
31
32#define DEBUG_TYPE "llzk-enforce-no-overwrites-pass"
33
34namespace {
35
36using namespace llzk;
37
38class PassImpl : public llzk::impl::EnforceNoMemberOverwritePassBase<PassImpl> {
39 using Base = EnforceNoMemberOverwritePassBase<PassImpl>;
40 using Base::Base;
41
42 void runOnOperation() override {
43 getOperation()->walk([this](component::StructDefOp structDef) {
44 auto result = analyzeStruct(structDef);
45 if (failed(result)) {
46 signalPassFailure();
47 }
48 const auto &[overwrites, written] = *result;
49
50 for (auto member : structDef.getMemberDefs()) {
51 if (!written.contains(member.getSymName())) {
52 signalPassFailure();
53 }
54 }
55
56 if (!overwrites.empty()) {
57 signalPassFailure();
58 }
59 });
60 }
61};
62
63} // namespace
::std::vector< MemberDefOp > getMemberDefs()
Get all MemberDefOp in this structure.
Definition Ops.cpp:458
llvm::FailureOr< std::pair< llvm::SetVector< Overwrite >, FuzzySet > > analyzeStruct(component::StructDefOp structDef)