31class PassManager :
virtual public Visitor,
virtual public Backtrack {
32 bool early_exit_flag =
false;
33 mutable int never_backtracks_cache = -1;
39 bool stop_on_error =
true;
42 void runDebugHooks(
const char *visitorName,
const IR::Node *node);
45 return Visitor::init_apply(root);
49 PassManager() =
default;
50 PassManager(
const PassManager &) =
default;
51 PassManager(PassManager &&) =
default;
54 friend class PassManager;
57 VisitorRef() : visitor(
nullptr) {}
58 VisitorRef(Visitor *v) : visitor(v) {}
59 VisitorRef(
const Visitor &v) : visitor(v.clone()) {
60 BUG_CHECK(visitor->check_clone(&v),
"Incorrect clone in PassManager");
67 typename std::enable_if<
68 std::is_convertible<
decltype(t(
nullptr)),
const IR::Node *>::value,
int>::type = 0)
73 typename std::enable_if<std::is_same<
decltype(t(
nullptr)),
void>::value,
int>::type = 0)
81 typename std::enable_if<std::is_same<
decltype(t()),
void>::value,
int>::type = 0)
88 PassManager(
const std::initializer_list<VisitorRef> &init) { addPasses(init); }
89 void addPasses(
const std::initializer_list<VisitorRef> &init) {
90 never_backtracks_cache = -1;
92 if (p.visitor) passes.emplace_back(p.visitor);
94 void removePasses(
const std::vector<cstring> &exclude);
95 void listPasses(std::ostream &, cstring sep)
const;
96 const IR::Node *apply_visitor(
const IR::Node *,
const char * = 0)
override;
97 bool backtrack(trigger &trig)
override;
98 bool never_backtracks()
override;
99 void setStopOnError(
bool stop) { stop_on_error = stop; }
100 void addDebugHook(
DebugHook h,
bool recursive =
false) {
101 debugHooks.push_back(h);
103 for (
auto pass : passes)
104 if (
auto child =
dynamic_cast<PassManager *
>(pass))
105 child->addDebugHook(h, recursive);
107 void addDebugHooks(std::vector<DebugHook> hooks,
bool recursive =
false) {
108 debugHooks.insert(debugHooks.end(), hooks.begin(), hooks.end());
110 for (
auto pass : passes)
111 if (
auto child =
dynamic_cast<PassManager *
>(pass))
112 child->addDebugHooks(hooks, recursive);
114 void early_exit() { early_exit_flag =
true; }
115 PassManager *clone()
const override {
return new PassManager(*
this); }
116 auto getPasses() {
return Util::iterator_range(passes); }
137class PassRepeated :
virtual public PassManager {
140 PassRepeated() : repeats(0) {}
141 explicit PassRepeated(
const std::initializer_list<VisitorRef> &init,
unsigned repeats = 0)
142 : PassManager(init), repeats(repeats) {}
143 explicit PassRepeated(
const PassManager &other,
unsigned repeats = 0)
144 : PassManager(other), repeats(repeats) {}
146 PassRepeated *setRepeats(
unsigned repeats) {
147 this->repeats = repeats;
150 PassRepeated *clone()
const override {
return new PassRepeated(*
this); }
153class PassRepeatUntil :
virtual public PassManager {
154 std::function<bool()> done;
157 explicit PassRepeatUntil(std::function<
bool()> done) : done(done) {}
158 PassRepeatUntil(
const std::initializer_list<VisitorRef> &init, std::function<
bool()> done)
159 : PassManager(init), done(done) {}
161 PassRepeatUntil *clone()
const override {
return new PassRepeatUntil(*
this); }
194class DynamicVisitor :
virtual public Visitor {
197 if (visitor)
return visitor->init_apply(root);
198 return Visitor::init_apply(root);
200 void end_apply(
const IR::Node *root)
override {
201 if (visitor) visitor->end_apply(root);
203 const IR::Node *apply_visitor(
const IR::Node *root,
const char *name = 0)
override {
204 if (visitor)
return visitor->apply_visitor(root, name);
209 DynamicVisitor() : visitor(
nullptr) {}
210 explicit DynamicVisitor(Visitor *v) : visitor(v) {}
211 void setVisitor(Visitor *v) { visitor = v; }
212 DynamicVisitor *clone()
const override {
return new DynamicVisitor(*
this); }
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13
std::function< void(const char *manager, unsigned seqNo, const char *pass, const IR::Node *node)> DebugHook
Definition ir/pass_manager.h:29