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/Instrumentation.h"
@@ -35,6 +38,7 @@ class StringRef;
3538class AAManager ;
3639class TargetMachine ;
3740class ModuleSummaryIndex ;
41+ class MCContext ;
3842template <typename T> class IntrusiveRefCntPtr ;
3943namespace vfs {
4044class FileSystem ;
@@ -107,6 +111,7 @@ class PassBuilder {
107111 TargetMachine *TM;
108112 PipelineTuningOptions PTO;
109113 std::optional<PGOOptions> PGOOpt;
114+ CGPassBuilderOption CGPBO;
110115 PassInstrumentationCallbacks *PIC;
111116
112117public:
@@ -307,6 +312,24 @@ class PassBuilder {
307312 // / TargetMachine::registerDefaultAliasAnalyses().
308313 AAManager buildDefaultAAPipeline ();
309314
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+
310333 // / Parse a textual pass pipeline description into a \c
311334 // / ModulePassManager.
312335 // /
@@ -519,6 +542,133 @@ class PassBuilder {
519542 FullLinkTimeOptimizationLastEPCallbacks.push_back (C);
520543 }
521544
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 registerCodeGenIRLateEPCallback (
563+ const std::function<void (ModulePassManager &)> C) {
564+ CodeGenIRLateEPCallbacks.push_back (C);
565+ }
566+
567+ void registerCodeGenIRFinalEPCallback (
568+ const std::function<void (FunctionPassManager &)> C) {
569+ CodeGenIRFinalEPCallbacks.push_back (C);
570+ }
571+
572+ void registerGCLoweringEPCallback (
573+ const std::function<void (FunctionPassManager &)> C) {
574+ GCLoweringEPCallbacks.push_back (C);
575+ }
576+
577+ void registerISelPrepareEPCallback (
578+ const std::function<void (ModulePassManager &)> &C) {
579+ ISelPrepareEPCallbacks.push_back (C);
580+ }
581+
582+ void registerMachineSSAOptimizationEarlyEPCallback (
583+ const std::function<void (MachineFunctionPassManager &)> &C) {
584+ MachineSSAOptimizationEarlyEPCallbacks.push_back (C);
585+ }
586+
587+ void registerILPOptsEPCallback (
588+ const std::function<void (MachineFunctionPassManager &)> &C) {
589+ ILPOptsEPCallbacks.push_back (C);
590+ }
591+
592+ void registerMachineSSAOptimizationLastEPCallback (
593+ const std::function<void (MachineFunctionPassManager &)> &C) {
594+ MachineSSAOptimizationLastEPCallbacks.push_back (C);
595+ }
596+
597+ void registerPreRegAllocEPCallback (
598+ const std::function<void (MachineFunctionPassManager &)> &C) {
599+ PreRegAllocEPCallbacks.push_back (C);
600+ }
601+
602+ void registerPostRegAllocEPCallback (
603+ const std::function<void (MachineFunctionPassManager &)> &C) {
604+ PostRegAllocEPCallbacks.push_back (C);
605+ }
606+
607+ void registerPreRegBankSelectEPCallback (
608+ const std::function<void (MachineFunctionPassManager &)> &C) {
609+ PreRegBankSelectEPCallbacks.push_back (C);
610+ }
611+
612+ void registerPreGlobalInstructionSelectEPCallback (
613+ const std::function<void (MachineFunctionPassManager &)> &C) {
614+ PreGlobalInstructionSelectEPCallbacks.push_back (C);
615+ }
616+
617+ void registerPostGlobalInstructionSelectEPCallback (
618+ const std::function<void (MachineFunctionPassManager &)> &C) {
619+ PostGlobalInstructionSelectEPCallbacks.push_back (C);
620+ }
621+
622+ void registerMachineLateOptimizationEPCallback (
623+ const std::function<void (MachineFunctionPassManager &)> &C) {
624+ MachineLateOptimizationEPCallbacks.push_back (C);
625+ }
626+
627+ void registerPreSched2EPCallback (
628+ const std::function<void (MachineFunctionPassManager &)> &C) {
629+ PreSched2EPCallbacks.push_back (C);
630+ }
631+
632+ void registerPostRewriteEPCallback (
633+ const std::function<void (MachineFunctionPassManager &)> &C) {
634+ PostRewriteEPCallbacks.push_back (C);
635+ }
636+
637+ void registerPreEmitEPCallback (
638+ const std::function<void (MachineFunctionPassManager &)> &C) {
639+ PreEmitEPCallbacks.push_back (C);
640+ }
641+
642+ void registerPostBBSectionsEPCallback (
643+ const std::function<void (MachineFunctionPassManager &)> &C) {
644+ PostBBSectionsEPCallbacks.push_back (C);
645+ }
646+
647+ void registerMIEmitEPCallback (
648+ const std::function<void (MachineFunctionPassManager &)> &C) {
649+ MIEmitEPCallbacks.push_back (C);
650+ }
651+
652+ void setAddInstSelectorCallback (
653+ const std::function<void (MachineFunctionPassManager &)> &C) {
654+ AddInstSelectorCallback = C;
655+ }
656+
657+ void setCustomFastRegAllocPipelineBuilder (
658+ const std::function<Error(MachineFunctionPassManager &)> &C) {
659+ AddFastRegAllocCallback = C;
660+ }
661+
662+ void setCustomOptimizedRegAllocPipelineBuilder (
663+ const std::function<Error(MachineFunctionPassManager &)> &C) {
664+ AddOptimizedRegAllocCallback = C;
665+ }
666+ // /@}}
667+
668+ // New pass manager migration methods, don't use them
669+ // outside llvm!
670+ CGPassBuilderOption &getCGPBO () { return CGPBO; }
671+
522672 // / Register a callback for parsing an AliasAnalysis Name to populate
523673 // / the given AAManager \p AA
524674 void registerParseAACallback (
@@ -640,6 +790,30 @@ class PassBuilder {
640790 void invokePipelineEarlySimplificationEPCallbacks (ModulePassManager &MPM,
641791 OptimizationLevel Level);
642792
793+ void invokeCodeGenIREarlyEPCallbacks (ModulePassManager &MPM);
794+ void invokeCodeGenIRLateEPCallbacks (ModulePassManager &MPM);
795+ void invokeCodeGenIRFinalEPCallbacks (FunctionPassManager &FPM);
796+ void invokeGCLoweringEPCallbacks (FunctionPassManager &FPM);
797+ void invokeISelPrepareEPCallbacks (ModulePassManager &MPM);
798+ void invokeMachineSSAOptimizationEarlyEPCallbacks (
799+ MachineFunctionPassManager &MFPM);
800+ void
801+ invokeMachineSSAOptimizationLastEPCallbacks (MachineFunctionPassManager &MFPM);
802+ void invokePreRegAllocEPCallbacks (MachineFunctionPassManager &MFPM);
803+ void invokePostRegAllocEPCallbacks (MachineFunctionPassManager &MFPM);
804+ void invokePreRegBankSelectEPCallbacks (MachineFunctionPassManager &MFPM);
805+ void
806+ invokePreGlobalInstructionSelectEPCallbacks (MachineFunctionPassManager &MFPM);
807+ void invokePostGlobalInstructionSelectEPCallbacks (
808+ MachineFunctionPassManager &MFPM);
809+ void invokeILPOptsEPCallbacks (MachineFunctionPassManager &MFPM);
810+ void
811+ invokeMachineLateOptimizationEPCallbacks (MachineFunctionPassManager &MFPM);
812+ void invokePreEmitEPCallbacks (MachineFunctionPassManager &MFPM);
813+ void invokePostBBSectionsEPCallbacks (MachineFunctionPassManager &MFPM);
814+ void invokeMIEmitEPCallbacks (MachineFunctionPassManager &MFPM);
815+ void invokePreSched2EPCallbacks (MachineFunctionPassManager &MFPM);
816+
643817 static bool checkParametrizedPassName (StringRef Name, StringRef PassName) {
644818 if (!Name.consume_front (PassName))
645819 return false ;
@@ -704,6 +878,21 @@ class PassBuilder {
704878 void addVectorPasses (OptimizationLevel Level, FunctionPassManager &FPM,
705879 bool IsFullLTO);
706880
881+ Error addExceptionHandlingPasses (FunctionPassManager &FPM);
882+
883+ Error addInstructionSelectorPasses (MachineFunctionPassManager &MFPM);
884+
885+ void addMachineSSAOptimizationPasses (MachineFunctionPassManager &MFPM);
886+
887+ Error addMachinePasses (ModulePassManager &MPM, FunctionPassManager &FPM,
888+ MachineFunctionPassManager &MFPM);
889+
890+ Error addRegisterAllocatorPasses (MachineFunctionPassManager &MFPM);
891+
892+ Error parseRegAllocOption (StringRef Text);
893+
894+ bool isOptimizedRegAlloc () const ;
895+
707896 static std::optional<std::vector<PipelineElement>>
708897 parsePipelineText (StringRef Text);
709898
@@ -766,6 +955,58 @@ class PassBuilder {
766955 SmallVector<std::function<void (ModulePassManager &, OptimizationLevel)>, 2 >
767956 PipelineEarlySimplificationEPCallbacks;
768957
958+ // CodeGen extension point callbacks
959+ std::function<Error(ModulePassManager &, raw_pwrite_stream &,
960+ raw_pwrite_stream *, CodeGenFileType, MCContext &)>
961+ CustomCodeGenPipelineBuilderCallback;
962+
963+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
964+ CodeGenIREarlyEPCallbacks;
965+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
966+ CodeGenIRLateEPCallbacks;
967+ SmallVector<std::function<void (FunctionPassManager &)>, 2 >
968+ CodeGenIRFinalEPCallbacks;
969+ SmallVector<std::function<void (FunctionPassManager &)>, 2 >
970+ GCLoweringEPCallbacks;
971+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
972+ ISelPrepareEPCallbacks;
973+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
974+ MachineSSAOptimizationEarlyEPCallbacks;
975+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
976+ MachineSSAOptimizationLastEPCallbacks;
977+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
978+ PreRegAllocEPCallbacks;
979+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
980+ PostRegAllocEPCallbacks;
981+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
982+ PreRegBankSelectEPCallbacks;
983+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
984+ PreGlobalInstructionSelectEPCallbacks;
985+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
986+ PostGlobalInstructionSelectEPCallbacks;
987+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
988+ ILPOptsEPCallbacks;
989+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
990+ MachineLateOptimizationEPCallbacks;
991+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
992+ PreSched2EPCallbacks;
993+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
994+ PostRewriteEPCallbacks;
995+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
996+ PreEmitEPCallbacks;
997+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
998+ PostBBSectionsEPCallbacks;
999+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
1000+ MIEmitEPCallbacks;
1001+
1002+ std::function<void (MachineFunctionPassManager &)> AddInstSelectorCallback;
1003+ std::function<Error(MachineFunctionPassManager &)> AddFastRegAllocCallback;
1004+ std::function<Error(MachineFunctionPassManager &)>
1005+ AddOptimizedRegAllocCallback;
1006+ StringSet<> DisabledPasses;
1007+ StringMap<MachineFunctionPassManager> RegAllocPasses;
1008+ // TODO: Add methods in LLVMTargetMachine so we can get rid of it.
1009+
7691010 SmallVector<std::function<void (ModuleAnalysisManager &)>, 2 >
7701011 ModuleAnalysisRegistrationCallbacks;
7711012 SmallVector<std::function<bool (StringRef, ModulePassManager &,
0 commit comments