@@ -32,11 +32,20 @@ class Value;
3232// / Base class.
3333template <typename ParentPass, typename ContainedPass>
3434class PassManager : public ParentPass {
35+ public:
36+ // CreatePassFunc(StringRef PassName, StringRef PassArgs).
37+ using CreatePassFunc =
38+ std::function<std::unique_ptr<ContainedPass>(StringRef, StringRef)>;
39+
3540protected:
3641 // / The list of passes that this pass manager will run.
3742 SmallVector<std::unique_ptr<ContainedPass>> Passes;
3843
3944 PassManager (StringRef Name) : ParentPass(Name) {}
45+ PassManager (StringRef Name, StringRef Pipeline, CreatePassFunc CreatePass)
46+ : ParentPass(Name) {
47+ setPassPipeline (Pipeline, CreatePass);
48+ }
4049 PassManager (const PassManager &) = delete ;
4150 PassManager (PassManager &&) = default ;
4251 virtual ~PassManager () = default ;
@@ -49,9 +58,6 @@ class PassManager : public ParentPass {
4958 Passes.push_back (std::move (Pass));
5059 }
5160
52- using CreatePassFunc =
53- std::function<std::unique_ptr<ContainedPass>(StringRef, StringRef)>;
54-
5561 // / Parses \p Pipeline as a comma-separated sequence of pass names and sets
5662 // / the pass pipeline, using \p CreatePass to instantiate passes by name.
5763 // /
@@ -86,18 +92,6 @@ class PassManager : public ParentPass {
8692 std::string PipelineStr = std::string (Pipeline) + EndToken;
8793 Pipeline = StringRef (PipelineStr);
8894
89- enum {
90- ScanName, // reading a pass name
91- ScanArgs, // reading a list of args
92- ArgsEnded, // read the last '>' in an args list, must read delimiter next
93- } State;
94- State = ScanName;
95- int PassBeginIdx = 0 ;
96- int ArgsBeginIdx;
97- StringRef PassName;
98- StringRef PassArgs;
99- int NestedArgs = 0 ;
100-
10195 auto AddPass = [this , CreatePass](StringRef PassName, StringRef PassArgs) {
10296 if (PassName.empty ()) {
10397 errs () << " Found empty pass name.\n " ;
@@ -112,15 +106,25 @@ class PassManager : public ParentPass {
112106 }
113107 addPass (std::move (Pass));
114108 };
109+
110+ enum class State {
111+ ScanName, // reading a pass name
112+ ScanArgs, // reading a list of args
113+ ArgsEnded, // read the last '>' in an args list, must read delimiter next
114+ } CurrentState = State::ScanName;
115+ int PassBeginIdx = 0 ;
116+ int ArgsBeginIdx;
117+ StringRef PassName;
118+ int NestedArgs = 0 ;
115119 for (auto [Idx, C] : enumerate(Pipeline)) {
116- switch (State ) {
117- case ScanName:
120+ switch (CurrentState ) {
121+ case State:: ScanName:
118122 if (C == BeginArgsToken) {
119123 // Save pass name for later and begin scanning args.
120124 PassName = Pipeline.slice (PassBeginIdx, Idx);
121125 ArgsBeginIdx = Idx + 1 ;
122126 ++NestedArgs;
123- State = ScanArgs;
127+ CurrentState = State:: ScanArgs;
124128 break ;
125129 }
126130 if (C == EndArgsToken) {
@@ -134,7 +138,7 @@ class PassManager : public ParentPass {
134138 PassBeginIdx = Idx + 1 ;
135139 }
136140 break ;
137- case ScanArgs:
141+ case State:: ScanArgs:
138142 // While scanning args, we only care about making sure nesting of angle
139143 // brackets is correct.
140144 if (C == BeginArgsToken) {
@@ -145,11 +149,10 @@ class PassManager : public ParentPass {
145149 --NestedArgs;
146150 if (NestedArgs == 0 ) {
147151 // Done scanning args.
148- PassArgs = Pipeline.slice (ArgsBeginIdx, Idx);
149- AddPass (PassName, PassArgs);
150- State = ArgsEnded;
152+ AddPass (PassName, Pipeline.slice (ArgsBeginIdx, Idx));
153+ CurrentState = State::ArgsEnded;
151154 } else if (NestedArgs < 0 ) {
152- errs () << " Unbalanced '>' in pass pipeline.\n " ;
155+ errs () << " Unexpected '>' in pass pipeline.\n " ;
153156 exit (1 );
154157 }
155158 break ;
@@ -161,12 +164,12 @@ class PassManager : public ParentPass {
161164 exit (1 );
162165 }
163166 break ;
164- case ArgsEnded:
167+ case State:: ArgsEnded:
165168 // Once we're done scanning args, only a delimiter is valid. This avoids
166169 // accepting strings like "foo<args><more-args>" or "foo<args>bar".
167170 if (C == EndToken || C == PassDelimToken) {
168171 PassBeginIdx = Idx + 1 ;
169- State = ScanName;
172+ CurrentState = State:: ScanName;
170173 } else {
171174 errs () << " Expected delimiter or end-of-string after pass "
172175 " arguments.\n " ;
@@ -202,12 +205,18 @@ class FunctionPassManager final
202205 : public PassManager<FunctionPass, FunctionPass> {
203206public:
204207 FunctionPassManager (StringRef Name) : PassManager(Name) {}
208+ FunctionPassManager (StringRef Name, StringRef Pipeline,
209+ CreatePassFunc CreatePass)
210+ : PassManager(Name, Pipeline, CreatePass) {}
205211 bool runOnFunction (Function &F) final ;
206212};
207213
208214class RegionPassManager final : public PassManager<RegionPass, RegionPass> {
209215public:
210216 RegionPassManager (StringRef Name) : PassManager(Name) {}
217+ RegionPassManager (StringRef Name, StringRef Pipeline,
218+ CreatePassFunc CreatePass)
219+ : PassManager(Name, Pipeline, CreatePass) {}
211220 bool runOnRegion (Region &R) final ;
212221};
213222
0 commit comments