40class PassManager :
virtual public Visitor,
virtual public Backtrack {
41 bool early_exit_flag =
false;
42 mutable int never_backtracks_cache = -1;
48 bool stop_on_error =
true;
51 void runDebugHooks(
const char *visitorName,
const IR::Node *node);
54 return Visitor::init_apply(root);
58 PassManager() =
default;
59 PassManager(
const PassManager &) =
default;
60 PassManager(PassManager &&) =
default;
63 friend class PassManager;
66 VisitorRef() : visitor(
nullptr) {}
67 VisitorRef(Visitor *v) : visitor(v) {}
68 VisitorRef(
const Visitor &v) : visitor(v.clone()) {
69 BUG_CHECK(visitor->check_clone(&v),
"Incorrect clone in PassManager");
76 typename std::enable_if<
77 std::is_convertible<
decltype(t(
nullptr)),
const IR::Node *>::value,
int>::type = 0)
82 typename std::enable_if<std::is_same<
decltype(t(
nullptr)),
void>::value,
int>::type = 0)
90 typename std::enable_if<std::is_same<
decltype(t()),
void>::value,
int>::type = 0)
97 PassManager(
const std::initializer_list<VisitorRef> &init) { addPasses(init); }
98 void addPasses(
const std::initializer_list<VisitorRef> &init) {
99 never_backtracks_cache = -1;
101 if (p.visitor) passes.emplace_back(p.visitor);
103 void removePasses(
const std::vector<cstring> &exclude);
104 void listPasses(std::ostream &, cstring sep)
const;
105 const IR::Node *apply_visitor(
const IR::Node *,
const char * = 0)
override;
106 bool backtrack(trigger &trig)
override;
107 bool never_backtracks()
override;
108 void setStopOnError(
bool stop) { stop_on_error = stop; }
109 void addDebugHook(
DebugHook h,
bool recursive =
false) {
110 debugHooks.push_back(h);
112 for (
auto pass : passes)
113 if (
auto child =
dynamic_cast<PassManager *
>(pass))
114 child->addDebugHook(h, recursive);
116 void addDebugHooks(std::vector<DebugHook> hooks,
bool recursive =
false) {
117 debugHooks.insert(debugHooks.end(), hooks.begin(), hooks.end());
119 for (
auto pass : passes)
120 if (
auto child =
dynamic_cast<PassManager *
>(pass))
121 child->addDebugHooks(hooks, recursive);
123 void early_exit() { early_exit_flag =
true; }
124 PassManager *clone()
const override {
return new PassManager(*
this); }
145class PassRepeated :
virtual public PassManager {
148 PassRepeated() : repeats(0) {}
149 explicit PassRepeated(
const std::initializer_list<VisitorRef> &init,
unsigned repeats = 0)
150 : PassManager(init), repeats(repeats) {}
151 explicit PassRepeated(
const PassManager &other,
unsigned repeats = 0)
152 : PassManager(other), repeats(repeats) {}
154 PassRepeated *setRepeats(
unsigned repeats) {
155 this->repeats = repeats;
158 PassRepeated *clone()
const override {
return new PassRepeated(*
this); }
161class PassRepeatUntil :
virtual public PassManager {
162 std::function<bool()> done;
165 explicit PassRepeatUntil(std::function<
bool()> done) : done(done) {}
166 PassRepeatUntil(
const std::initializer_list<VisitorRef> &init, std::function<
bool()> done)
167 : PassManager(init), done(done) {}
169 PassRepeatUntil *clone()
const override {
return new PassRepeatUntil(*
this); }
202class DynamicVisitor :
virtual public Visitor {
205 if (visitor)
return visitor->init_apply(root);
206 return Visitor::init_apply(root);
208 void end_apply(
const IR::Node *root)
override {
209 if (visitor) visitor->end_apply(root);
211 const IR::Node *apply_visitor(
const IR::Node *root,
const char *name = 0)
override {
212 if (visitor)
return visitor->apply_visitor(root, name);
217 DynamicVisitor() : visitor(
nullptr) {}
218 explicit DynamicVisitor(Visitor *v) : visitor(v) {}
219 void setVisitor(Visitor *v) { visitor = v; }
220 DynamicVisitor *clone()
const override {
return new DynamicVisitor(*
this); }
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24
std::function< void(const char *manager, unsigned seqNo, const char *pass, const IR::Node *node)> DebugHook
Definition ir/pass_manager.h:38