44
44
#include " llvm/CodeGen/ShadowStackGCLowering.h"
45
45
#include " llvm/CodeGen/SjLjEHPrepare.h"
46
46
#include " llvm/CodeGen/StackProtector.h"
47
- #include " llvm/CodeGen/TargetPassConfig.h"
48
47
#include " llvm/CodeGen/UnreachableBlockElim.h"
49
48
#include " llvm/CodeGen/WasmEHPrepare.h"
50
49
#include " llvm/CodeGen/WinEHPrepare.h"
@@ -177,80 +176,73 @@ template <typename DerivedT> class CodeGenPassBuilder {
177
176
// Function object to maintain state while adding codegen IR passes.
178
177
class AddIRPass {
179
178
public:
180
- AddIRPass (ModulePassManager &MPM, const DerivedT &PB ) : MPM(MPM), PB(PB ) {}
179
+ AddIRPass (ModulePassManager &MPM) : MPM(MPM) {}
181
180
~AddIRPass () {
182
181
if (!FPM.isEmpty ())
183
182
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (FPM)));
184
183
}
185
184
186
- template <typename PassT>
187
- void operator ()(PassT &&Pass, StringRef Name = PassT::name()) {
185
+ template <typename PassT> void operator ()(PassT &&Pass) {
188
186
static_assert ((is_detected<is_function_pass_t , PassT>::value ||
189
187
is_detected<is_module_pass_t , PassT>::value) &&
190
188
" Only module pass and function pass are supported." );
191
189
192
- if (!PB.runBeforeAdding (Name))
193
- return ;
194
-
195
190
// Add Function Pass
196
191
if constexpr (is_detected<is_function_pass_t , PassT>::value) {
197
192
FPM.addPass (std::forward<PassT>(Pass));
198
-
199
- for (auto &C : PB.AfterCallbacks )
200
- C (Name);
201
193
} else {
202
194
// Add Module Pass
203
195
if (!FPM.isEmpty ()) {
204
196
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (FPM)));
205
197
FPM = FunctionPassManager ();
206
198
}
207
-
208
199
MPM.addPass (std::forward<PassT>(Pass));
209
-
210
- for (auto &C : PB.AfterCallbacks )
211
- C (Name);
212
200
}
213
201
}
214
202
215
203
private:
216
204
ModulePassManager &MPM;
217
205
FunctionPassManager FPM;
218
- const DerivedT &PB;
219
206
};
220
207
221
208
// Function object to maintain state while adding codegen machine passes.
222
209
class AddMachinePass {
223
210
public:
224
- AddMachinePass (MachineFunctionPassManager &PM, const DerivedT &PB)
225
- : PM(PM), PB(PB) {}
211
+ AddMachinePass (MachineFunctionPassManager &PM) : PM(PM) {}
226
212
227
213
template <typename PassT> void operator ()(PassT &&Pass) {
228
214
static_assert (
229
215
is_detected<has_key_t , PassT>::value,
230
216
" Machine function pass must define a static member variable `Key`." );
231
-
232
- if (!PB.runBeforeAdding (PassT::name ()))
233
- return ;
234
-
217
+ for (auto &C : BeforeCallbacks)
218
+ if (!C (&PassT::Key))
219
+ return ;
235
220
PM.addPass (std::forward<PassT>(Pass));
236
-
237
- for (auto &C : PB.AfterCallbacks )
238
- C (PassT::name ());
221
+ for (auto &C : AfterCallbacks)
222
+ C (&PassT::Key);
239
223
}
240
224
241
225
template <typename PassT> void insertPass (MachinePassKey *ID, PassT Pass) {
242
- PB. AfterCallbacks .emplace_back (
226
+ AfterCallbacks.emplace_back (
243
227
[this , ID, Pass = std::move (Pass)](MachinePassKey *PassID) {
244
228
if (PassID == ID)
245
229
this ->PM .addPass (std::move (Pass));
246
230
});
247
231
}
248
232
233
+ void disablePass (MachinePassKey *ID) {
234
+ BeforeCallbacks.emplace_back (
235
+ [ID](MachinePassKey *PassID) { return PassID != ID; });
236
+ }
237
+
249
238
MachineFunctionPassManager releasePM () { return std::move (PM); }
250
239
251
240
private:
252
241
MachineFunctionPassManager &PM;
253
- const DerivedT &PB;
242
+ SmallVector<llvm::unique_function<bool (MachinePassKey *)>, 4 >
243
+ BeforeCallbacks;
244
+ SmallVector<llvm::unique_function<void (MachinePassKey *)>, 4 >
245
+ AfterCallbacks;
254
246
};
255
247
256
248
LLVMTargetMachine &TM;
@@ -481,43 +473,20 @@ template <typename DerivedT> class CodeGenPassBuilder {
481
473
const DerivedT &derived () const {
482
474
return static_cast <const DerivedT &>(*this );
483
475
}
484
-
485
- bool runBeforeAdding (StringRef Name) const {
486
- bool ShouldAdd = true ;
487
- for (auto &C : BeforeCallbacks)
488
- ShouldAdd &= C (Name);
489
- return ShouldAdd;
490
- }
491
-
492
- void setStartStopPasses (const TargetPassConfig::StartStopInfo &Info) const ;
493
-
494
- Error verifyStartStop (const TargetPassConfig::StartStopInfo &Info) const ;
495
-
496
- mutable SmallVector<llvm::unique_function<bool (StringRef)>, 4 >
497
- BeforeCallbacks;
498
- mutable SmallVector<llvm::unique_function<void (StringRef)>, 4 > AfterCallbacks;
499
-
500
- // / Helper variable for `-start-before/-start-after/-stop-before/-stop-after`
501
- mutable bool Started = true ;
502
- mutable bool Stopped = true ;
503
476
};
504
477
505
478
template <typename Derived>
506
479
Error CodeGenPassBuilder<Derived>::buildPipeline(
507
480
ModulePassManager &MPM, MachineFunctionPassManager &MFPM,
508
481
raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
509
482
CodeGenFileType FileType) const {
510
- auto StartStopInfo = TargetPassConfig::getStartStopInfo (*PIC);
511
- if (!StartStopInfo)
512
- return StartStopInfo.takeError ();
513
- setStartStopPasses (*StartStopInfo);
514
- AddIRPass addIRPass (MPM, derived ());
483
+ AddIRPass addIRPass (MPM);
515
484
// `ProfileSummaryInfo` is always valid.
516
485
addIRPass (RequireAnalysisPass<ProfileSummaryAnalysis, Module>());
517
486
addIRPass (RequireAnalysisPass<CollectorMetadataAnalysis, Module>());
518
487
addISelPasses (addIRPass);
519
488
520
- AddMachinePass addPass (MFPM, derived () );
489
+ AddMachinePass addPass (MFPM);
521
490
if (auto Err = addCoreISelPasses (addPass))
522
491
return std::move (Err);
523
492
@@ -530,68 +499,6 @@ Error CodeGenPassBuilder<Derived>::buildPipeline(
530
499
});
531
500
532
501
addPass (FreeMachineFunctionPass ());
533
- return verifyStartStop (*StartStopInfo);
534
- }
535
-
536
- template <typename Derived>
537
- void CodeGenPassBuilder<Derived>::setStartStopPasses(
538
- const TargetPassConfig::StartStopInfo &Info) const {
539
- if (!Info.StartPass .empty ()) {
540
- Started = false ;
541
- BeforeCallbacks.emplace_back ([this , &Info, AfterFlag = Info.StartAfter ,
542
- Count = 0u ](StringRef ClassName) mutable {
543
- if (Count == Info.StartInstanceNum ) {
544
- if (AfterFlag) {
545
- AfterFlag = false ;
546
- Started = true ;
547
- }
548
- return Started;
549
- }
550
-
551
- auto PassName = PIC->getPassNameForClassName (ClassName);
552
- if (Info.StartPass == PassName && ++Count == Info.StartInstanceNum )
553
- Started = !Info.StartAfter ;
554
-
555
- return Started;
556
- });
557
- }
558
-
559
- if (!Info.StopPass .empty ()) {
560
- Stopped = false ;
561
- BeforeCallbacks.emplace_back ([this , &Info, AfterFlag = Info.StopAfter ,
562
- Count = 0u ](StringRef ClassName) mutable {
563
- if (Count == Info.StopInstanceNum ) {
564
- if (AfterFlag) {
565
- AfterFlag = false ;
566
- Stopped = true ;
567
- }
568
- return !Stopped;
569
- }
570
-
571
- auto PassName = PIC->getPassNameForClassName (ClassName);
572
- if (Info.StopPass == PassName && ++Count == Info.StopInstanceNum )
573
- Stopped = !Info.StopAfter ;
574
- return !Stopped;
575
- });
576
- }
577
- }
578
-
579
- template <typename Derived>
580
- Error CodeGenPassBuilder<Derived>::verifyStartStop(
581
- const TargetPassConfig::StartStopInfo &Info) const {
582
- if (Started && Stopped)
583
- return Error::success ();
584
-
585
- if (!Started)
586
- return make_error<StringError>(
587
- " Can't find start pass \" " +
588
- PIC->getPassNameForClassName (Info.StartPass ) + " \" ." ,
589
- std::make_error_code (std::errc::invalid_argument));
590
- if (!Stopped)
591
- return make_error<StringError>(
592
- " Can't find stop pass \" " +
593
- PIC->getPassNameForClassName (Info.StopPass ) + " \" ." ,
594
- std::make_error_code (std::errc::invalid_argument));
595
502
return Error::success ();
596
503
}
597
504
0 commit comments