LLZK
3.0.0
An open-source IR for Zero Knowledge (ZK) circuits
Toggle main menu visibility
Loading...
Searching...
No Matches
InlineIncludesPass.cpp
Go to the documentation of this file.
1
//===-- LLZKInlineIncludesPass.cpp - -llzk-inline-includes pass -*- 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
//===----------------------------------------------------------------------===//
13
//===----------------------------------------------------------------------===//
14
15
#include "
llzk/Dialect/Include/Transforms/InlineIncludesPass.h
"
16
17
#include "
llzk/Dialect/Include/IR/Ops.h
"
18
#include "
llzk/Dialect/Include/Util/IncludeHelper.h
"
19
20
#include <mlir/IR/BuiltinOps.h>
21
22
#include <llvm/Support/LogicalResult.h>
23
24
// Include the generated base pass class definitions.
25
namespace
llzk::include
{
26
#define GEN_PASS_DEF_INLINEINCLUDESPASS
27
#include "
llzk/Dialect/Include/Transforms/InlineIncludesPass.h.inc
"
28
}
// namespace llzk::include
29
30
using namespace
mlir
;
31
using namespace
llzk::include
;
32
33
namespace
{
34
using
IncludeStack = std::vector<std::pair<StringRef, Location>>;
35
36
inline
bool
contains(IncludeStack &stack, StringRef &&loc) {
37
auto
path_match = [loc](std::pair<StringRef, Location> &p) {
return
p.first == loc; };
38
return
std::find_if(stack.begin(), stack.end(), path_match) != stack.end();
39
}
40
41
class
PassImpl :
public
llzk::include::impl::InlineIncludesPassBase
<PassImpl> {
42
using
Base
=
InlineIncludesPassBase<PassImpl>
;
43
using
Base::Base
;
44
45
void
runOnOperation()
override
{
46
ModuleOp module = getOperation();
47
std::vector<std::pair<ModuleOp, IncludeStack>> currLevel = {
48
std::make_pair(module, IncludeStack())
49
};
50
do
{
51
std::vector<std::pair<ModuleOp, IncludeStack>> nextLevel = {};
52
for
(std::pair<ModuleOp, IncludeStack> &curr : currLevel) {
53
curr.first.walk([includeStack = std::move(curr.second),
54
&nextLevel](
IncludeOp
incOp)
mutable
{
55
// Check for cyclic includes
56
if (contains(includeStack, incOp.getPath())) {
57
auto err = incOp.emitError().append(
"found cyclic include"
);
58
for (auto it = includeStack.rbegin(); it != includeStack.rend(); ++it) {
59
err.attachNote(it->second).append(
"included from here"
);
60
}
61
err.report();
62
}
else
{
63
includeStack.push_back(std::make_pair(incOp.getPath(), incOp.getLoc()));
64
FailureOr<ModuleOp> result = incOp.inlineAndErase();
65
if (succeeded(result)) {
66
ModuleOp newMod = result.value();
67
assert(succeeded(newMod.verify()) &&
"newMod must pass verification"
);
68
nextLevel.push_back(make_pair(newMod, includeStack));
69
}
70
}
71
// Advance in either case so as many errors as possible are found in a single run.
72
return
WalkResult::advance();
73
});
74
}
75
currLevel = nextLevel;
76
}
while
(!currLevel.empty());
77
78
if
(failed(module.verify())) {
79
signalPassFailure();
80
return
;
81
}
82
markAllAnalysesPreserved();
83
}
84
};
85
86
}
// namespace
IncludeHelper.h
Ops.h
InlineIncludesPass.h.inc
InlineIncludesPass.h
llzk::include::IncludeOp
Definition
Ops.h.inc:137
llzk::include::impl::InlineIncludesPassBase
Definition
InlineIncludesPass.cpp:25
llzk::include::impl::InlineIncludesPassBase::InlineIncludesPassBase
InlineIncludesPassBase()
Definition
InlineIncludesPass.cpp:29
llzk::include::impl::InlineIncludesPassBase::Base
InlineIncludesPassBase Base
Definition
InlineIncludesPass.cpp:27
llzk::include
Definition
Ops.cpp:21
mlir
Definition
ValueModel.h:30
lib
Dialect
Include
Transforms
InlineIncludesPass.cpp
Generated by
1.17.0
Copyright 2025 Veridise Inc. under the Apache License v2.0. Copyright 2026 Project LLZK under the Apache License v2.0.