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 registerGCLoweringEPCallback (
563
+ const std::function<void (FunctionPassManager &)> C) {
564
+ GCLoweringEPCallbacks.push_back (C);
565
+ }
566
+
567
+ void registerISelPrepareEPCallback (
568
+ const std::function<void (ModulePassManager &)> &C) {
569
+ ISelPrepareEPCallbacks.push_back (C);
570
+ }
571
+
572
+ void registerMachineSSAOptimizationEarlyEPCallback (
573
+ const std::function<void (MachineFunctionPassManager &)> &C) {
574
+ MachineSSAOptimizationEarlyEPCallbacks.push_back (C);
575
+ }
576
+
577
+ void registerILPOptsEPCallback (
578
+ const std::function<void (MachineFunctionPassManager &)> &C) {
579
+ ILPOptsEPCallbacks.push_back (C);
580
+ }
581
+
582
+ void registerMachineSSAOptimizationLastEPCallback (
583
+ const std::function<void (MachineFunctionPassManager &)> &C) {
584
+ MachineSSAOptimizationLastEPCallbacks.push_back (C);
585
+ }
586
+
587
+ void registerPreRegAllocEPCallback (
588
+ const std::function<void (MachineFunctionPassManager &)> &C) {
589
+ PreRegAllocEPCallbacks.push_back (C);
590
+ }
591
+
592
+ void registerPostRegAllocEPCallback (
593
+ const std::function<void (MachineFunctionPassManager &)> &C) {
594
+ PostRegAllocEPCallbacks.push_back (C);
595
+ }
596
+
597
+ void registerPreRegBankSelectEPCallback (
598
+ const std::function<void (MachineFunctionPassManager &)> &C) {
599
+ PreRegBankSelectEPCallbacks.push_back (C);
600
+ }
601
+
602
+ void registerPreGlobalInstructionSelectEPCallback (
603
+ const std::function<void (MachineFunctionPassManager &)> &C) {
604
+ PreGlobalInstructionSelectEPCallbacks.push_back (C);
605
+ }
606
+
607
+ void registerPostGlobalInstructionSelectEPCallback (
608
+ const std::function<void (MachineFunctionPassManager &)> &C) {
609
+ PostGlobalInstructionSelectEPCallbacks.push_back (C);
610
+ }
611
+
612
+ void registerMachineLateOptimizationEPCallback (
613
+ const std::function<void (MachineFunctionPassManager &)> &C) {
614
+ MachineLateOptimizationEPCallbacks.push_back (C);
615
+ }
616
+
617
+ void registerPreSched2EPCallback (
618
+ const std::function<void (MachineFunctionPassManager &)> &C) {
619
+ PreSched2EPCallbacks.push_back (C);
620
+ }
621
+
622
+ void registerPostRewriteEPCallback (
623
+ const std::function<void (MachineFunctionPassManager &)> &C) {
624
+ PostRewriteEPCallbacks.push_back (C);
625
+ }
626
+
627
+ void registerPreEmitEPCallback (
628
+ const std::function<void (MachineFunctionPassManager &)> &C) {
629
+ PreEmitEPCallbacks.push_back (C);
630
+ }
631
+
632
+ void registerPostBBSectionsEPCallback (
633
+ const std::function<void (MachineFunctionPassManager &)> &C) {
634
+ PostBBSectionsEPCallbacks.push_back (C);
635
+ }
636
+
637
+ void registerMIEmitEPCallback (
638
+ const std::function<void (MachineFunctionPassManager &)> &C) {
639
+ MIEmitEPCallbacks.push_back (C);
640
+ }
641
+
642
+ void setAddInstSelectorCallback (
643
+ const std::function<void (MachineFunctionPassManager &)> &C) {
644
+ AddInstSelectorCallback = C;
645
+ }
646
+
647
+ void setCodeGenPreparePassesCallback (
648
+ const std::function<void (ModulePassManager &)> C) {
649
+ AddCodeGenPreparePassesCallback = C;
650
+ }
651
+
652
+ void setRegAllocFastCallback (
653
+ const std::function<Error(MachineFunctionPassManager &)> &C) {
654
+ AddRegAllocFastCallback = C;
655
+ }
656
+
657
+ void setRegAllocOptimizedCallback (
658
+ const std::function<Error(MachineFunctionPassManager &)> &C) {
659
+ AddRegAllocOptimizedCallback = C;
660
+ }
661
+ // /@}}
662
+
663
+ // / Building block callbacks for codegen pipeline.
664
+ void addDefaultCodeGenPreparePasses (ModulePassManager &MPM);
665
+ Error addDefaultRegAllocFastPasses (MachineFunctionPassManager &MFPM);
666
+ Error addDefaultRegAllocOptimizedPasses (MachineFunctionPassManager &MFPM);
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,28 @@ class PassBuilder {
640
790
void invokePipelineEarlySimplificationEPCallbacks (ModulePassManager &MPM,
641
791
OptimizationLevel Level);
642
792
793
+ void invokeCodeGenIREarlyEPCallbacks (ModulePassManager &MPM);
794
+ void invokeGCLoweringEPCallbacks (FunctionPassManager &FPM);
795
+ void invokeISelPrepareEPCallbacks (ModulePassManager &MPM);
796
+ void invokeMachineSSAOptimizationEarlyEPCallbacks (
797
+ MachineFunctionPassManager &MFPM);
798
+ void
799
+ invokeMachineSSAOptimizationLastEPCallbacks (MachineFunctionPassManager &MFPM);
800
+ void invokePreRegAllocEPCallbacks (MachineFunctionPassManager &MFPM);
801
+ void invokePostRegAllocEPCallbacks (MachineFunctionPassManager &MFPM);
802
+ void invokePreRegBankSelectEPCallbacks (MachineFunctionPassManager &MFPM);
803
+ void
804
+ invokePreGlobalInstructionSelectEPCallbacks (MachineFunctionPassManager &MFPM);
805
+ void invokePostGlobalInstructionSelectEPCallbacks (
806
+ MachineFunctionPassManager &MFPM);
807
+ void invokeILPOptsEPCallbacks (MachineFunctionPassManager &MFPM);
808
+ void
809
+ invokeMachineLateOptimizationEPCallbacks (MachineFunctionPassManager &MFPM);
810
+ void invokePreEmitEPCallbacks (MachineFunctionPassManager &MFPM);
811
+ void invokePostBBSectionsEPCallbacks (MachineFunctionPassManager &MFPM);
812
+ void invokeMIEmitEPCallbacks (MachineFunctionPassManager &MFPM);
813
+ void invokePreSched2EPCallbacks (MachineFunctionPassManager &MFPM);
814
+
643
815
static bool checkParametrizedPassName (StringRef Name, StringRef PassName) {
644
816
if (!Name.consume_front (PassName))
645
817
return false ;
@@ -704,6 +876,21 @@ class PassBuilder {
704
876
void addVectorPasses (OptimizationLevel Level, FunctionPassManager &FPM,
705
877
bool IsFullLTO);
706
878
879
+ Error addExceptionHandlingPasses (FunctionPassManager &FPM);
880
+
881
+ Error addInstructionSelectorPasses (MachineFunctionPassManager &MFPM);
882
+
883
+ void addMachineSSAOptimizationPasses (MachineFunctionPassManager &MFPM);
884
+
885
+ Error addMachinePasses (ModulePassManager &MPM, FunctionPassManager &FPM,
886
+ MachineFunctionPassManager &MFPM);
887
+
888
+ Error addRegisterAllocatorPasses (MachineFunctionPassManager &MFPM);
889
+
890
+ Error parseRegAllocOption (StringRef Text);
891
+
892
+ bool isOptimizedRegAlloc () const ;
893
+
707
894
static std::optional<std::vector<PipelineElement>>
708
895
parsePipelineText (StringRef Text);
709
896
@@ -766,6 +953,55 @@ class PassBuilder {
766
953
SmallVector<std::function<void (ModulePassManager &, OptimizationLevel)>, 2 >
767
954
PipelineEarlySimplificationEPCallbacks;
768
955
956
+ // CodeGen extension point callbacks
957
+ std::function<Error(ModulePassManager &, raw_pwrite_stream &,
958
+ raw_pwrite_stream *, CodeGenFileType, MCContext &)>
959
+ CustomCodeGenPipelineBuilderCallback;
960
+
961
+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
962
+ CodeGenIREarlyEPCallbacks;
963
+ SmallVector<std::function<void (FunctionPassManager &)>, 2 >
964
+ GCLoweringEPCallbacks;
965
+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
966
+ ISelPrepareEPCallbacks;
967
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
968
+ MachineSSAOptimizationEarlyEPCallbacks;
969
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
970
+ MachineSSAOptimizationLastEPCallbacks;
971
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
972
+ PreRegAllocEPCallbacks;
973
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
974
+ PostRegAllocEPCallbacks;
975
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
976
+ PreRegBankSelectEPCallbacks;
977
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
978
+ PreGlobalInstructionSelectEPCallbacks;
979
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
980
+ PostGlobalInstructionSelectEPCallbacks;
981
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
982
+ ILPOptsEPCallbacks;
983
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
984
+ MachineLateOptimizationEPCallbacks;
985
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
986
+ PreSched2EPCallbacks;
987
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
988
+ PostRewriteEPCallbacks;
989
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
990
+ PreEmitEPCallbacks;
991
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
992
+ PostBBSectionsEPCallbacks;
993
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
994
+ MIEmitEPCallbacks;
995
+
996
+ std::function<void (ModulePassManager &)> AddCodeGenPreparePassesCallback;
997
+ std::function<void (MachineFunctionPassManager &)> AddInstSelectorCallback;
998
+ std::function<Error(MachineFunctionPassManager &)> AddRegAllocFastCallback;
999
+ std::function<Error(MachineFunctionPassManager &)>
1000
+ AddRegAllocOptimizedCallback;
1001
+ StringSet<> DisabledPasses;
1002
+ StringMap<MachineFunctionPassManager> RegAllocPasses;
1003
+ // TODO: Add methods in LLVMTargetMachine so we can get rid of it.
1004
+
769
1005
SmallVector<std::function<void (ModuleAnalysisManager &)>, 2 >
770
1006
ModuleAnalysisRegistrationCallbacks;
771
1007
SmallVector<std::function<bool (StringRef, ModulePassManager &,
0 commit comments