LLZK 2.1.1
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 llzk::component;
32namespace {
34class PassImpl : public llzk::impl::MemberWriteValidatorPassBase<PassImpl> {
36 using Base::Base;
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;
46
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
64} // namespace
static constexpr ::llvm::StringLiteral getOperationName()
Definition Ops.h.inc:353
::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)