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