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:
@@ -308,6 +313,24 @@ class PassBuilder {
308
313
// / TargetMachine::registerDefaultAliasAnalyses().
309
314
AAManager buildDefaultAAPipeline ();
310
315
316
+ // / Build CodeGen pass pipeline.
317
+ // /
318
+ // / {{@
319
+ Expected<ModulePassManager>
320
+ buildDefaultCodeGenPipeline (raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
321
+ CodeGenFileType FileType, MCContext &Ctx);
322
+ Error buildDefaultCodeGenPipeline (ModulePassManager &MPM,
323
+ raw_pwrite_stream &Out,
324
+ raw_pwrite_stream *DwoOut,
325
+ CodeGenFileType FileType, MCContext &Ctx);
326
+ Error addRegAllocPass (MachineFunctionPassManager &MFPM,
327
+ StringRef Filter = " all" );
328
+ // TODO: Add method to build MC emission pipeline.
329
+ template <typename ... PassTs> void disablePass () {
330
+ (DisabledPasses.insert (PassTs::name ()), ...);
331
+ }
332
+ // / @}}
333
+
311
334
// / Parse a textual pass pipeline description into a \c
312
335
// / ModulePassManager.
313
336
// /
@@ -523,6 +546,133 @@ class PassBuilder {
523
546
FullLinkTimeOptimizationLastEPCallbacks.push_back (C);
524
547
}
525
548
549
+ // / Register target specific callbacks to extend codegen pipeline.
550
+ // / {{@
551
+
552
+ // / If target want its own pipeline, use this callback.
553
+ void setCustomCodeGenPipelineBuilderCallback (
554
+ const std::function<Error(ModulePassManager &, raw_pwrite_stream &,
555
+ raw_pwrite_stream *, CodeGenFileType,
556
+ MCContext &)>
557
+ C) {
558
+ CustomCodeGenPipelineBuilderCallback = C;
559
+ }
560
+
561
+ void registerCodeGenIREarlyEPCallback (
562
+ const std::function<void (ModulePassManager &)> C) {
563
+ CodeGenIREarlyEPCallbacks.push_back (C);
564
+ }
565
+
566
+ void registerGCLoweringEPCallback (
567
+ const std::function<void (FunctionPassManager &)> C) {
568
+ GCLoweringEPCallbacks.push_back (C);
569
+ }
570
+
571
+ void registerISelPrepareEPCallback (
572
+ const std::function<void (ModulePassManager &)> &C) {
573
+ ISelPrepareEPCallbacks.push_back (C);
574
+ }
575
+
576
+ void registerMachineSSAOptimizationEarlyEPCallback (
577
+ const std::function<void (MachineFunctionPassManager &)> &C) {
578
+ MachineSSAOptimizationEarlyEPCallbacks.push_back (C);
579
+ }
580
+
581
+ void registerILPOptsEPCallback (
582
+ const std::function<void (MachineFunctionPassManager &)> &C) {
583
+ ILPOptsEPCallbacks.push_back (C);
584
+ }
585
+
586
+ void registerMachineSSAOptimizationLastEPCallback (
587
+ const std::function<void (MachineFunctionPassManager &)> &C) {
588
+ MachineSSAOptimizationLastEPCallbacks.push_back (C);
589
+ }
590
+
591
+ void registerPreRegAllocEPCallback (
592
+ const std::function<void (MachineFunctionPassManager &)> &C) {
593
+ PreRegAllocEPCallbacks.push_back (C);
594
+ }
595
+
596
+ void registerPostRegAllocEPCallback (
597
+ const std::function<void (MachineFunctionPassManager &)> &C) {
598
+ PostRegAllocEPCallbacks.push_back (C);
599
+ }
600
+
601
+ void registerPreRegBankSelectEPCallback (
602
+ const std::function<void (MachineFunctionPassManager &)> &C) {
603
+ PreRegBankSelectEPCallbacks.push_back (C);
604
+ }
605
+
606
+ void registerPreGlobalInstructionSelectEPCallback (
607
+ const std::function<void (MachineFunctionPassManager &)> &C) {
608
+ PreGlobalInstructionSelectEPCallbacks.push_back (C);
609
+ }
610
+
611
+ void registerPostGlobalInstructionSelectEPCallback (
612
+ const std::function<void (MachineFunctionPassManager &)> &C) {
613
+ PostGlobalInstructionSelectEPCallbacks.push_back (C);
614
+ }
615
+
616
+ void registerMachineLateOptimizationEPCallback (
617
+ const std::function<void (MachineFunctionPassManager &)> &C) {
618
+ MachineLateOptimizationEPCallbacks.push_back (C);
619
+ }
620
+
621
+ void registerPreSched2EPCallback (
622
+ const std::function<void (MachineFunctionPassManager &)> &C) {
623
+ PreSched2EPCallbacks.push_back (C);
624
+ }
625
+
626
+ void registerPostRewriteEPCallback (
627
+ const std::function<void (MachineFunctionPassManager &)> &C) {
628
+ PostRewriteEPCallbacks.push_back (C);
629
+ }
630
+
631
+ void registerPreEmitEPCallback (
632
+ const std::function<void (MachineFunctionPassManager &)> &C) {
633
+ PreEmitEPCallbacks.push_back (C);
634
+ }
635
+
636
+ void registerPostBBSectionsEPCallback (
637
+ const std::function<void (MachineFunctionPassManager &)> &C) {
638
+ PostBBSectionsEPCallbacks.push_back (C);
639
+ }
640
+
641
+ void registerMIEmitEPCallback (
642
+ const std::function<void (MachineFunctionPassManager &)> &C) {
643
+ MIEmitEPCallbacks.push_back (C);
644
+ }
645
+
646
+ void setAddInstSelectorCallback (
647
+ const std::function<void (MachineFunctionPassManager &)> &C) {
648
+ AddInstSelectorCallback = C;
649
+ }
650
+
651
+ void setCodeGenPreparePassesCallback (
652
+ const std::function<void (ModulePassManager &)> C) {
653
+ AddCodeGenPreparePassesCallback = C;
654
+ }
655
+
656
+ void setRegAllocFastCallback (
657
+ const std::function<Error(MachineFunctionPassManager &)> &C) {
658
+ AddRegAllocFastCallback = C;
659
+ }
660
+
661
+ void setRegAllocOptimizedCallback (
662
+ const std::function<Error(MachineFunctionPassManager &)> &C) {
663
+ AddRegAllocOptimizedCallback = C;
664
+ }
665
+ // /@}}
666
+
667
+ // / Building block callbacks for codegen pipeline.
668
+ void addDefaultCodeGenPreparePasses (ModulePassManager &MPM);
669
+ Error addDefaultRegAllocFastPasses (MachineFunctionPassManager &MFPM);
670
+ Error addDefaultRegAllocOptimizedPasses (MachineFunctionPassManager &MFPM);
671
+
672
+ // New pass manager migration methods, don't use them
673
+ // outside llvm!
674
+ CGPassBuilderOption &getCGPBO () { return CGPBO; }
675
+
526
676
// / Register a callback for parsing an AliasAnalysis Name to populate
527
677
// / the given AAManager \p AA
528
678
void registerParseAACallback (
@@ -647,6 +797,28 @@ class PassBuilder {
647
797
OptimizationLevel Level,
648
798
ThinOrFullLTOPhase Phase);
649
799
800
+ void invokeCodeGenIREarlyEPCallbacks (ModulePassManager &MPM);
801
+ void invokeGCLoweringEPCallbacks (FunctionPassManager &FPM);
802
+ void invokeISelPrepareEPCallbacks (ModulePassManager &MPM);
803
+ void invokeMachineSSAOptimizationEarlyEPCallbacks (
804
+ MachineFunctionPassManager &MFPM);
805
+ void
806
+ invokeMachineSSAOptimizationLastEPCallbacks (MachineFunctionPassManager &MFPM);
807
+ void invokePreRegAllocEPCallbacks (MachineFunctionPassManager &MFPM);
808
+ void invokePostRegAllocEPCallbacks (MachineFunctionPassManager &MFPM);
809
+ void invokePreRegBankSelectEPCallbacks (MachineFunctionPassManager &MFPM);
810
+ void
811
+ invokePreGlobalInstructionSelectEPCallbacks (MachineFunctionPassManager &MFPM);
812
+ void invokePostGlobalInstructionSelectEPCallbacks (
813
+ MachineFunctionPassManager &MFPM);
814
+ void invokeILPOptsEPCallbacks (MachineFunctionPassManager &MFPM);
815
+ void
816
+ invokeMachineLateOptimizationEPCallbacks (MachineFunctionPassManager &MFPM);
817
+ void invokePreEmitEPCallbacks (MachineFunctionPassManager &MFPM);
818
+ void invokePostBBSectionsEPCallbacks (MachineFunctionPassManager &MFPM);
819
+ void invokeMIEmitEPCallbacks (MachineFunctionPassManager &MFPM);
820
+ void invokePreSched2EPCallbacks (MachineFunctionPassManager &MFPM);
821
+
650
822
static bool checkParametrizedPassName (StringRef Name, StringRef PassName) {
651
823
if (!Name.consume_front (PassName))
652
824
return false ;
@@ -711,6 +883,21 @@ class PassBuilder {
711
883
void addVectorPasses (OptimizationLevel Level, FunctionPassManager &FPM,
712
884
bool IsFullLTO);
713
885
886
+ Error addExceptionHandlingPasses (FunctionPassManager &FPM);
887
+
888
+ Error addInstructionSelectorPasses (MachineFunctionPassManager &MFPM);
889
+
890
+ void addMachineSSAOptimizationPasses (MachineFunctionPassManager &MFPM);
891
+
892
+ Error addMachinePasses (ModulePassManager &MPM, FunctionPassManager &FPM,
893
+ MachineFunctionPassManager &MFPM);
894
+
895
+ Error addRegisterAllocatorPasses (MachineFunctionPassManager &MFPM);
896
+
897
+ Error parseRegAllocOption (StringRef Text);
898
+
899
+ bool isOptimizedRegAlloc () const ;
900
+
714
901
static std::optional<std::vector<PipelineElement>>
715
902
parsePipelineText (StringRef Text);
716
903
@@ -779,6 +966,55 @@ class PassBuilder {
779
966
2 >
780
967
PipelineEarlySimplificationEPCallbacks;
781
968
969
+ // CodeGen extension point callbacks
970
+ std::function<Error(ModulePassManager &, raw_pwrite_stream &,
971
+ raw_pwrite_stream *, CodeGenFileType, MCContext &)>
972
+ CustomCodeGenPipelineBuilderCallback;
973
+
974
+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
975
+ CodeGenIREarlyEPCallbacks;
976
+ SmallVector<std::function<void (FunctionPassManager &)>, 2 >
977
+ GCLoweringEPCallbacks;
978
+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
979
+ ISelPrepareEPCallbacks;
980
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
981
+ MachineSSAOptimizationEarlyEPCallbacks;
982
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
983
+ MachineSSAOptimizationLastEPCallbacks;
984
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
985
+ PreRegAllocEPCallbacks;
986
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
987
+ PostRegAllocEPCallbacks;
988
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
989
+ PreRegBankSelectEPCallbacks;
990
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
991
+ PreGlobalInstructionSelectEPCallbacks;
992
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
993
+ PostGlobalInstructionSelectEPCallbacks;
994
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
995
+ ILPOptsEPCallbacks;
996
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
997
+ MachineLateOptimizationEPCallbacks;
998
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
999
+ PreSched2EPCallbacks;
1000
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
1001
+ PostRewriteEPCallbacks;
1002
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
1003
+ PreEmitEPCallbacks;
1004
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
1005
+ PostBBSectionsEPCallbacks;
1006
+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
1007
+ MIEmitEPCallbacks;
1008
+
1009
+ std::function<void (ModulePassManager &)> AddCodeGenPreparePassesCallback;
1010
+ std::function<void (MachineFunctionPassManager &)> AddInstSelectorCallback;
1011
+ std::function<Error(MachineFunctionPassManager &)> AddRegAllocFastCallback;
1012
+ std::function<Error(MachineFunctionPassManager &)>
1013
+ AddRegAllocOptimizedCallback;
1014
+ StringSet<> DisabledPasses;
1015
+ StringMap<MachineFunctionPassManager> RegAllocPasses;
1016
+ // TODO: Add methods in LLVMTargetMachine so we can get rid of it.
1017
+
782
1018
SmallVector<std::function<void (ModuleAnalysisManager &)>, 2 >
783
1019
ModuleAnalysisRegistrationCallbacks;
784
1020
SmallVector<std::function<bool (StringRef, ModulePassManager &,
0 commit comments