1515#ifndef LLVM_PASSES_PASSBUILDER_H
1616#define LLVM_PASSES_PASSBUILDER_H
1717
18+ #include " llvm/ADT/StringSet.h"
1819#include " llvm/Analysis/CGSCCPassManager.h"
1920#include " llvm/CodeGen/MachinePassManager.h"
2021#include " llvm/CodeGen/RegAllocCommon.h"
2122#include " llvm/IR/PassManager.h"
2223#include " llvm/Passes/OptimizationLevel.h"
24+ #include " llvm/Support/CodeGen.h"
2325#include " llvm/Support/Error.h"
2426#include " llvm/Support/PGOOptions.h"
2527#include " llvm/Support/raw_ostream.h"
28+ #include " llvm/Target/CGPassBuilderOption.h"
2629#include " llvm/Transforms/IPO/Inliner.h"
2730#include " llvm/Transforms/IPO/ModuleInliner.h"
2831#include " llvm/Transforms/Scalar/LoopPassManager.h"
@@ -34,6 +37,7 @@ class StringRef;
3437class AAManager ;
3538class TargetMachine ;
3639class ModuleSummaryIndex ;
40+ class MCContext ;
3741template <typename T> class IntrusiveRefCntPtr ;
3842namespace vfs {
3943class FileSystem ;
@@ -106,6 +110,7 @@ class PassBuilder {
106110 TargetMachine *TM;
107111 PipelineTuningOptions PTO;
108112 std::optional<PGOOptions> PGOOpt;
113+ CGPassBuilderOption CGPBO;
109114 PassInstrumentationCallbacks *PIC;
110115
111116public:
@@ -308,6 +313,24 @@ class PassBuilder {
308313 // / TargetMachine::registerDefaultAliasAnalyses().
309314 AAManager buildDefaultAAPipeline ();
310315
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+
311334 // / Parse a textual pass pipeline description into a \c
312335 // / ModulePassManager.
313336 // /
@@ -523,6 +546,133 @@ class PassBuilder {
523546 FullLinkTimeOptimizationLastEPCallbacks.push_back (C);
524547 }
525548
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+
526676 // / Register a callback for parsing an AliasAnalysis Name to populate
527677 // / the given AAManager \p AA
528678 void registerParseAACallback (
@@ -647,6 +797,28 @@ class PassBuilder {
647797 OptimizationLevel Level,
648798 ThinOrFullLTOPhase Phase);
649799
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+
650822 static bool checkParametrizedPassName (StringRef Name, StringRef PassName) {
651823 if (!Name.consume_front (PassName))
652824 return false ;
@@ -711,6 +883,21 @@ class PassBuilder {
711883 void addVectorPasses (OptimizationLevel Level, FunctionPassManager &FPM,
712884 bool IsFullLTO);
713885
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+
714901 static std::optional<std::vector<PipelineElement>>
715902 parsePipelineText (StringRef Text);
716903
@@ -779,6 +966,55 @@ class PassBuilder {
779966 2 >
780967 PipelineEarlySimplificationEPCallbacks;
781968
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+
7821018 SmallVector<std::function<void (ModuleAnalysisManager &)>, 2 >
7831019 ModuleAnalysisRegistrationCallbacks;
7841020 SmallVector<std::function<bool (StringRef, ModulePassManager &,
0 commit comments