15
15
#ifndef LLVM_PASSES_PASSBUILDER_H
16
16
#define LLVM_PASSES_PASSBUILDER_H
17
17
18
+ #include " llvm/ADT/StringSet.h"
18
19
#include " llvm/Analysis/CGSCCPassManager.h"
19
20
#include " llvm/CodeGen/MachinePassManager.h"
20
21
#include " llvm/CodeGen/RegAllocCommon.h"
21
22
#include " llvm/IR/PassManager.h"
22
23
#include " llvm/Passes/OptimizationLevel.h"
24
+ #include " llvm/Support/CodeGen.h"
23
25
#include " llvm/Support/Error.h"
24
26
#include " llvm/Support/PGOOptions.h"
25
27
#include " llvm/Support/raw_ostream.h"
28
+ #include " llvm/Target/CGPassBuilderOption.h"
26
29
#include " llvm/Transforms/IPO/Inliner.h"
27
30
#include " llvm/Transforms/IPO/ModuleInliner.h"
28
31
#include " llvm/Transforms/Instrumentation.h"
@@ -35,6 +38,7 @@ class StringRef;
35
38
class AAManager ;
36
39
class TargetMachine ;
37
40
class ModuleSummaryIndex ;
41
+ class MCContext ;
38
42
template <typename T> class IntrusiveRefCntPtr ;
39
43
namespace vfs {
40
44
class FileSystem ;
@@ -107,6 +111,7 @@ class PassBuilder {
107
111
TargetMachine *TM;
108
112
PipelineTuningOptions PTO;
109
113
std::optional<PGOOptions> PGOOpt;
114
+ CGPassBuilderOption CGPBO;
110
115
PassInstrumentationCallbacks *PIC;
111
116
112
117
public:
@@ -307,6 +312,24 @@ class PassBuilder {
307
312
// / TargetMachine::registerDefaultAliasAnalyses().
308
313
AAManager buildDefaultAAPipeline ();
309
314
315
+ // / Build CodeGen pass pipeline.
316
+ // /
317
+ // / {{@
318
+ Expected<ModulePassManager>
319
+ buildDefaultCodeGenPipeline (raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
320
+ CodeGenFileType FileType, MCContext &Ctx);
321
+ Error buildDefaultCodeGenPipeline (ModulePassManager &MPM,
322
+ raw_pwrite_stream &Out,
323
+ raw_pwrite_stream *DwoOut,
324
+ CodeGenFileType FileType, MCContext &Ctx);
325
+ Error addRegAllocPass (MachineFunctionPassManager &MFPM,
326
+ StringRef Filter = " all" );
327
+ // TODO: Add method to build MC emission pipeline.
328
+ template <typename ... PassTs> void disablePass () {
329
+ (DisabledPasses.insert (PassTs::name ()), ...);
330
+ }
331
+ // / @}}
332
+
310
333
// / Parse a textual pass pipeline description into a \c
311
334
// / ModulePassManager.
312
335
// /
@@ -519,6 +542,133 @@ class PassBuilder {
519
542
FullLinkTimeOptimizationLastEPCallbacks.push_back (C);
520
543
}
521
544
545
+ // / Register target specific callbacks to extend codegen pipeline.
546
+ // / {{@
547
+
548
+ // / If target want its own pipeline, use this callback.
549
+ void setCustomCodeGenPipelineBuilderCallback (
550
+ const std::function<Error(ModulePassManager &, raw_pwrite_stream &,
551
+ raw_pwrite_stream *, CodeGenFileType,
552
+ MCContext &)>
553
+ C) {
554
+ CustomCodeGenPipelineBuilderCallback = C;
555
+ }
556
+
557
+ void registerCodeGenIREarlyEPCallback (
558
+ const std::function<void (ModulePassManager &)> C) {
559
+ CodeGenIREarlyEPCallbacks.push_back (C);
560
+ }
561
+
562
+ void registerCodeGenIRLateEPCallback (
563
+ const std::function<void (ModulePassManager &)> C) {
564
+ CodeGenIRLateEPCallbacks.push_back (C);
565
+ }
566
+
567
+ void registerCodeGenIRFinalEPCallback (
568
+ const std::function<void (FunctionPassManager &)> C) {
569
+ CodeGenIRFinalEPCallbacks.push_back (C);
570
+ }
571
+
572
+ void registerGCLoweringEPCallback (
573
+ const std::function<void (FunctionPassManager &)> C) {
574
+ GCLoweringEPCallbacks.push_back (C);
575
+ }
576
+
577
+ void registerISelPrepareEPCallback (
578
+ const std::function<void (ModulePassManager &)> &C) {
579
+ ISelPrepareEPCallbacks.push_back (C);
580
+ }
581
+
582
+ void registerMachineSSAOptimizationEarlyEPCallback (
583
+ const std::function<void (MachineFunctionPassManager &)> &C) {
584
+ MachineSSAOptimizationEarlyEPCallbacks.push_back (C);
585
+ }
586
+
587
+ void registerILPOptsEPCallback (
588
+ const std::function<void (MachineFunctionPassManager &)> &C) {
589
+ ILPOptsEPCallbacks.push_back (C);
590
+ }
591
+
592
+ void registerMachineSSAOptimizationLastEPCallback (
593
+ const std::function<void (MachineFunctionPassManager &)> &C) {
594
+ MachineSSAOptimizationLastEPCallbacks.push_back (C);
595
+ }
596
+
597
+ void registerPreRegAllocEPCallback (
598
+ const std::function<void (MachineFunctionPassManager &)> &C) {
599
+ PreRegAllocEPCallbacks.push_back (C);
600
+ }
601
+
602
+ void registerPostRegAllocEPCallback (
603
+ const std::function<void (MachineFunctionPassManager &)> &C) {
604
+ PostRegAllocEPCallbacks.push_back (C);
605
+ }
606
+
607
+ void registerPreRegBankSelectEPCallback (
608
+ const std::function<void (MachineFunctionPassManager &)> &C) {
609
+ PreRegBankSelectEPCallbacks.push_back (C);
610
+ }
611
+
612
+ void registerPreGlobalInstructionSelectEPCallback (
613
+ const std::function<void (MachineFunctionPassManager &)> &C) {
614
+ PreGlobalInstructionSelectEPCallbacks.push_back (C);
615
+ }
616
+
617
+ void registerPostGlobalInstructionSelectEPCallback (
618
+ const std::function<void (MachineFunctionPassManager &)> &C) {
619
+ PostGlobalInstructionSelectEPCallbacks.push_back (C);
620
+ }
621
+
622
+ void registerMachineLateOptimizationEPCallback (
623
+ const std::function<void (MachineFunctionPassManager &)> &C) {
624
+ MachineLateOptimizationEPCallbacks.push_back (C);
625
+ }
626
+
627
+ void registerPreSched2EPCallback (
628
+ const std::function<void (MachineFunctionPassManager &)> &C) {
629
+ PreSched2EPCallbacks.push_back (C);
630
+ }
631
+
632
+ void registerPostRewriteEPCallback (
633
+ const std::function<void (MachineFunctionPassManager &)> &C) {
634
+ PostRewriteEPCallbacks.push_back (C);
635
+ }
636
+
637
+ void registerPreEmitEPCallback (
638
+ const std::function<void (MachineFunctionPassManager &)> &C) {
639
+ PreEmitEPCallbacks.push_back (C);
640
+ }
641
+
642
+ void registerPostBBSectionsEPCallback (
643
+ const std::function<void (MachineFunctionPassManager &)> &C) {
644
+ PostBBSectionsEPCallbacks.push_back (C);
645
+ }
646
+
647
+ void registerMIEmitEPCallback (
648
+ const std::function<void (MachineFunctionPassManager &)> &C) {
649
+ MIEmitEPCallbacks.push_back (C);
650
+ }
651
+
652
+ void setAddInstSelectorCallback (
653
+ const std::function<void (MachineFunctionPassManager &)> &C) {
654
+ AddInstSelectorCallback = C;
655
+ }
656
+
657
+ void setCustomFastRegAllocPipelineBuilder (
658
+ const std::function<Error(MachineFunctionPassManager &)> &C) {
659
+ AddFastRegAllocCallback = C;
660
+ }
661
+
662
+ void setCustomOptimizedRegAllocPipelineBuilder (
663
+ const std::function<Error(MachineFunctionPassManager &)> &C) {
664
+ AddOptimizedRegAllocCallback = C;
665
+ }
666
+ // /@}}
667
+
668
+ // New pass manager migration methods, don't use them
669
+ // outside llvm!
670
+ CGPassBuilderOption &getCGPBO () { return CGPBO; }
671
+
522
672
// / Register a callback for parsing an AliasAnalysis Name to populate
523
673
// / the given AAManager \p AA
524
674
void registerParseAACallback (
@@ -640,6 +790,30 @@ class PassBuilder {
640
790
void invokePipelineEarlySimplificationEPCallbacks (ModulePassManager &MPM,
641
791
OptimizationLevel Level);
642
792
793
+ void invokeCodeGenIREarlyEPCallbacks (ModulePassManager &MPM);
794
+ void invokeCodeGenIRLateEPCallbacks (ModulePassManager &MPM);
795
+ void invokeCodeGenIRFinalEPCallbacks (FunctionPassManager &FPM);
796
+ void invokeGCLoweringEPCallbacks (FunctionPassManager &FPM);
797
+ void invokeISelPrepareEPCallbacks (ModulePassManager &MPM);
798
+ void invokeMachineSSAOptimizationEarlyEPCallbacks (
799
+ MachineFunctionPassManager &MFPM);
800
+ void
801
+ invokeMachineSSAOptimizationLastEPCallbacks (MachineFunctionPassManager &MFPM);
802
+ void invokePreRegAllocEPCallbacks (MachineFunctionPassManager &MFPM);
803
+ void invokePostRegAllocEPCallbacks (MachineFunctionPassManager &MFPM);
804
+ void invokePreRegBankSelectEPCallbacks (MachineFunctionPassManager &MFPM);
805
+ void
806
+ invokePreGlobalInstructionSelectEPCallbacks (MachineFunctionPassManager &MFPM);
807
+ void invokePostGlobalInstructionSelectEPCallbacks (
808
+ MachineFunctionPassManager &MFPM);
809
+ void invokeILPOptsEPCallbacks (MachineFunctionPassManager &MFPM);
810
+ void
811
+ invokeMachineLateOptimizationEPCallbacks (MachineFunctionPassManager &MFPM);
812
+ void invokePreEmitEPCallbacks (MachineFunctionPassManager &MFPM);
813
+ void invokePostBBSectionsEPCallbacks (MachineFunctionPassManager &MFPM);
814
+ void invokeMIEmitEPCallbacks (MachineFunctionPassManager &MFPM);
815
+ void invokePreSched2EPCallbacks (MachineFunctionPassManager &MFPM);
816
+
643
817
static bool checkParametrizedPassName (StringRef Name, StringRef PassName) {
644
818
if (!Name.consume_front (PassName))
645
819
return false ;
@@ -704,6 +878,21 @@ class PassBuilder {
704
878
void addVectorPasses (OptimizationLevel Level, FunctionPassManager &FPM,
705
879
bool IsFullLTO);
706
880
881
+ Error addExceptionHandlingPasses (FunctionPassManager &FPM);
882
+
883
+ Error addInstructionSelectorPasses (MachineFunctionPassManager &MFPM);
884
+
885
+ void addMachineSSAOptimizationPasses (MachineFunctionPassManager &MFPM);
886
+
887
+ Error addMachinePasses (ModulePassManager &MPM, FunctionPassManager &FPM,
888
+ MachineFunctionPassManager &MFPM);
889
+
890
+ Error addRegisterAllocatorPasses (MachineFunctionPassManager &MFPM);
891
+
892
+ Error parseRegAllocOption (StringRef Text);
893
+
894
+ bool isOptimizedRegAlloc () const ;
895
+
707
896
static std::optional<std::vector<PipelineElement>>
708
897
parsePipelineText (StringRef Text);
709
898
@@ -766,6 +955,58 @@ class PassBuilder {
766
955
SmallVector<std::function<void (ModulePassManager &, OptimizationLevel)>, 2 >
767
956
PipelineEarlySimplificationEPCallbacks;
768
957
958
+ // CodeGen extension point callbacks
959
+ std::function<Error(ModulePassManager &, raw_pwrite_stream &,
960
+ raw_pwrite_stream *, CodeGenFileType, MCContext &)>
961
+ CustomCodeGenPipelineBuilderCallback;
962
+
963
+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
964
+ CodeGenIREarlyEPCallbacks;
965
+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
966
+ CodeGenIRLateEPCallbacks;
967
+ SmallVector<std::function<void (FunctionPassManager &)>, 2 >
968
+ CodeGenIRFinalEPCallbacks;
969
+ SmallVector<std::function<void (FunctionPassManager &)>, 2 >
970
+ GCLoweringEPCallbacks;
971
+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
972
+ ISelPrepareEPCallbacks;
973
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
974
+ MachineSSAOptimizationEarlyEPCallbacks;
975
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
976
+ MachineSSAOptimizationLastEPCallbacks;
977
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
978
+ PreRegAllocEPCallbacks;
979
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
980
+ PostRegAllocEPCallbacks;
981
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
982
+ PreRegBankSelectEPCallbacks;
983
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
984
+ PreGlobalInstructionSelectEPCallbacks;
985
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
986
+ PostGlobalInstructionSelectEPCallbacks;
987
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
988
+ ILPOptsEPCallbacks;
989
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
990
+ MachineLateOptimizationEPCallbacks;
991
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
992
+ PreSched2EPCallbacks;
993
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
994
+ PostRewriteEPCallbacks;
995
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
996
+ PreEmitEPCallbacks;
997
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
998
+ PostBBSectionsEPCallbacks;
999
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
1000
+ MIEmitEPCallbacks;
1001
+
1002
+ std::function<void (MachineFunctionPassManager &)> AddInstSelectorCallback;
1003
+ std::function<Error(MachineFunctionPassManager &)> AddFastRegAllocCallback;
1004
+ std::function<Error(MachineFunctionPassManager &)>
1005
+ AddOptimizedRegAllocCallback;
1006
+ StringSet<> DisabledPasses;
1007
+ StringMap<MachineFunctionPassManager> RegAllocPasses;
1008
+ // TODO: Add methods in LLVMTargetMachine so we can get rid of it.
1009
+
769
1010
SmallVector<std::function<void (ModuleAnalysisManager &)>, 2 >
770
1011
ModuleAnalysisRegistrationCallbacks;
771
1012
SmallVector<std::function<bool (StringRef, ModulePassManager &,
0 commit comments