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:
@@ -306,6 +311,24 @@ class PassBuilder {
306311 // / TargetMachine::registerDefaultAliasAnalyses().
307312 AAManager buildDefaultAAPipeline ();
308313
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+
309332 // / Parse a textual pass pipeline description into a \c
310333 // / ModulePassManager.
311334 // /
@@ -518,6 +541,133 @@ class PassBuilder {
518541 FullLinkTimeOptimizationLastEPCallbacks.push_back (C);
519542 }
520543
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+
521671 // / Register a callback for parsing an AliasAnalysis Name to populate
522672 // / the given AAManager \p AA
523673 void registerParseAACallback (
@@ -639,6 +789,28 @@ class PassBuilder {
639789 void invokePipelineEarlySimplificationEPCallbacks (ModulePassManager &MPM,
640790 OptimizationLevel Level);
641791
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+
642814 static bool checkParametrizedPassName (StringRef Name, StringRef PassName) {
643815 if (!Name.consume_front (PassName))
644816 return false ;
@@ -703,6 +875,21 @@ class PassBuilder {
703875 void addVectorPasses (OptimizationLevel Level, FunctionPassManager &FPM,
704876 bool IsFullLTO);
705877
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+
706893 static std::optional<std::vector<PipelineElement>>
707894 parsePipelineText (StringRef Text);
708895
@@ -765,6 +952,55 @@ class PassBuilder {
765952 SmallVector<std::function<void (ModulePassManager &, OptimizationLevel)>, 2 >
766953 PipelineEarlySimplificationEPCallbacks;
767954
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+
7681004 SmallVector<std::function<void (ModuleAnalysisManager &)>, 2 >
7691005 ModuleAnalysisRegistrationCallbacks;
7701006 SmallVector<std::function<bool (StringRef, ModulePassManager &,
0 commit comments