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 registerGCLoweringEPCallback (
563+ const std::function<void (FunctionPassManager &)> C) {
564+ GCLoweringEPCallbacks.push_back (C);
565+ }
566+
567+ void registerISelPrepareEPCallback (
568+ const std::function<void (ModulePassManager &)> &C) {
569+ ISelPrepareEPCallbacks.push_back (C);
570+ }
571+
572+ void registerMachineSSAOptimizationEarlyEPCallback (
573+ const std::function<void (MachineFunctionPassManager &)> &C) {
574+ MachineSSAOptimizationEarlyEPCallbacks.push_back (C);
575+ }
576+
577+ void registerILPOptsEPCallback (
578+ const std::function<void (MachineFunctionPassManager &)> &C) {
579+ ILPOptsEPCallbacks.push_back (C);
580+ }
581+
582+ void registerMachineSSAOptimizationLastEPCallback (
583+ const std::function<void (MachineFunctionPassManager &)> &C) {
584+ MachineSSAOptimizationLastEPCallbacks.push_back (C);
585+ }
586+
587+ void registerPreRegAllocEPCallback (
588+ const std::function<void (MachineFunctionPassManager &)> &C) {
589+ PreRegAllocEPCallbacks.push_back (C);
590+ }
591+
592+ void registerPostRegAllocEPCallback (
593+ const std::function<void (MachineFunctionPassManager &)> &C) {
594+ PostRegAllocEPCallbacks.push_back (C);
595+ }
596+
597+ void registerPreRegBankSelectEPCallback (
598+ const std::function<void (MachineFunctionPassManager &)> &C) {
599+ PreRegBankSelectEPCallbacks.push_back (C);
600+ }
601+
602+ void registerPreGlobalInstructionSelectEPCallback (
603+ const std::function<void (MachineFunctionPassManager &)> &C) {
604+ PreGlobalInstructionSelectEPCallbacks.push_back (C);
605+ }
606+
607+ void registerPostGlobalInstructionSelectEPCallback (
608+ const std::function<void (MachineFunctionPassManager &)> &C) {
609+ PostGlobalInstructionSelectEPCallbacks.push_back (C);
610+ }
611+
612+ void registerMachineLateOptimizationEPCallback (
613+ const std::function<void (MachineFunctionPassManager &)> &C) {
614+ MachineLateOptimizationEPCallbacks.push_back (C);
615+ }
616+
617+ void registerPreSched2EPCallback (
618+ const std::function<void (MachineFunctionPassManager &)> &C) {
619+ PreSched2EPCallbacks.push_back (C);
620+ }
621+
622+ void registerPostRewriteEPCallback (
623+ const std::function<void (MachineFunctionPassManager &)> &C) {
624+ PostRewriteEPCallbacks.push_back (C);
625+ }
626+
627+ void registerPreEmitEPCallback (
628+ const std::function<void (MachineFunctionPassManager &)> &C) {
629+ PreEmitEPCallbacks.push_back (C);
630+ }
631+
632+ void registerPostBBSectionsEPCallback (
633+ const std::function<void (MachineFunctionPassManager &)> &C) {
634+ PostBBSectionsEPCallbacks.push_back (C);
635+ }
636+
637+ void registerMIEmitEPCallback (
638+ const std::function<void (MachineFunctionPassManager &)> &C) {
639+ MIEmitEPCallbacks.push_back (C);
640+ }
641+
642+ void setAddInstSelectorCallback (
643+ const std::function<void (MachineFunctionPassManager &)> &C) {
644+ AddInstSelectorCallback = C;
645+ }
646+
647+ void setCodeGenPreparePassesCallback (
648+ const std::function<void (ModulePassManager &)> C) {
649+ AddCodeGenPreparePassesCallback = C;
650+ }
651+
652+ void setRegAllocFastCallback (
653+ const std::function<Error(MachineFunctionPassManager &)> &C) {
654+ AddRegAllocFastCallback = C;
655+ }
656+
657+ void setRegAllocOptimizedCallback (
658+ const std::function<Error(MachineFunctionPassManager &)> &C) {
659+ AddRegAllocOptimizedCallback = C;
660+ }
661+ // /@}}
662+
663+ // / Building block callbacks for codegen pipeline.
664+ void addDefaultCodeGenPreparePasses (ModulePassManager &MPM);
665+ Error addDefaultRegAllocFastPasses (MachineFunctionPassManager &MFPM);
666+ Error addDefaultRegAllocOptimizedPasses (MachineFunctionPassManager &MFPM);
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,28 @@ class PassBuilder {
640790 void invokePipelineEarlySimplificationEPCallbacks (ModulePassManager &MPM,
641791 OptimizationLevel Level);
642792
793+ void invokeCodeGenIREarlyEPCallbacks (ModulePassManager &MPM);
794+ void invokeGCLoweringEPCallbacks (FunctionPassManager &FPM);
795+ void invokeISelPrepareEPCallbacks (ModulePassManager &MPM);
796+ void invokeMachineSSAOptimizationEarlyEPCallbacks (
797+ MachineFunctionPassManager &MFPM);
798+ void
799+ invokeMachineSSAOptimizationLastEPCallbacks (MachineFunctionPassManager &MFPM);
800+ void invokePreRegAllocEPCallbacks (MachineFunctionPassManager &MFPM);
801+ void invokePostRegAllocEPCallbacks (MachineFunctionPassManager &MFPM);
802+ void invokePreRegBankSelectEPCallbacks (MachineFunctionPassManager &MFPM);
803+ void
804+ invokePreGlobalInstructionSelectEPCallbacks (MachineFunctionPassManager &MFPM);
805+ void invokePostGlobalInstructionSelectEPCallbacks (
806+ MachineFunctionPassManager &MFPM);
807+ void invokeILPOptsEPCallbacks (MachineFunctionPassManager &MFPM);
808+ void
809+ invokeMachineLateOptimizationEPCallbacks (MachineFunctionPassManager &MFPM);
810+ void invokePreEmitEPCallbacks (MachineFunctionPassManager &MFPM);
811+ void invokePostBBSectionsEPCallbacks (MachineFunctionPassManager &MFPM);
812+ void invokeMIEmitEPCallbacks (MachineFunctionPassManager &MFPM);
813+ void invokePreSched2EPCallbacks (MachineFunctionPassManager &MFPM);
814+
643815 static bool checkParametrizedPassName (StringRef Name, StringRef PassName) {
644816 if (!Name.consume_front (PassName))
645817 return false ;
@@ -704,6 +876,21 @@ class PassBuilder {
704876 void addVectorPasses (OptimizationLevel Level, FunctionPassManager &FPM,
705877 bool IsFullLTO);
706878
879+ Error addExceptionHandlingPasses (FunctionPassManager &FPM);
880+
881+ Error addInstructionSelectorPasses (MachineFunctionPassManager &MFPM);
882+
883+ void addMachineSSAOptimizationPasses (MachineFunctionPassManager &MFPM);
884+
885+ Error addMachinePasses (ModulePassManager &MPM, FunctionPassManager &FPM,
886+ MachineFunctionPassManager &MFPM);
887+
888+ Error addRegisterAllocatorPasses (MachineFunctionPassManager &MFPM);
889+
890+ Error parseRegAllocOption (StringRef Text);
891+
892+ bool isOptimizedRegAlloc () const ;
893+
707894 static std::optional<std::vector<PipelineElement>>
708895 parsePipelineText (StringRef Text);
709896
@@ -766,6 +953,55 @@ class PassBuilder {
766953 SmallVector<std::function<void (ModulePassManager &, OptimizationLevel)>, 2 >
767954 PipelineEarlySimplificationEPCallbacks;
768955
956+ // CodeGen extension point callbacks
957+ std::function<Error(ModulePassManager &, raw_pwrite_stream &,
958+ raw_pwrite_stream *, CodeGenFileType, MCContext &)>
959+ CustomCodeGenPipelineBuilderCallback;
960+
961+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
962+ CodeGenIREarlyEPCallbacks;
963+ SmallVector<std::function<void (FunctionPassManager &)>, 2 >
964+ GCLoweringEPCallbacks;
965+ SmallVector<std::function<void (ModulePassManager &)>, 2 >
966+ ISelPrepareEPCallbacks;
967+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
968+ MachineSSAOptimizationEarlyEPCallbacks;
969+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
970+ MachineSSAOptimizationLastEPCallbacks;
971+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
972+ PreRegAllocEPCallbacks;
973+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
974+ PostRegAllocEPCallbacks;
975+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
976+ PreRegBankSelectEPCallbacks;
977+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
978+ PreGlobalInstructionSelectEPCallbacks;
979+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
980+ PostGlobalInstructionSelectEPCallbacks;
981+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
982+ ILPOptsEPCallbacks;
983+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
984+ MachineLateOptimizationEPCallbacks;
985+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
986+ PreSched2EPCallbacks;
987+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
988+ PostRewriteEPCallbacks;
989+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
990+ PreEmitEPCallbacks;
991+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
992+ PostBBSectionsEPCallbacks;
993+ SmallVector<std::function<void (MachineFunctionPassManager &)>, 2 >
994+ MIEmitEPCallbacks;
995+
996+ std::function<void (ModulePassManager &)> AddCodeGenPreparePassesCallback;
997+ std::function<void (MachineFunctionPassManager &)> AddInstSelectorCallback;
998+ std::function<Error(MachineFunctionPassManager &)> AddRegAllocFastCallback;
999+ std::function<Error(MachineFunctionPassManager &)>
1000+ AddRegAllocOptimizedCallback;
1001+ StringSet<> DisabledPasses;
1002+ StringMap<MachineFunctionPassManager> RegAllocPasses;
1003+ // TODO: Add methods in LLVMTargetMachine so we can get rid of it.
1004+
7691005 SmallVector<std::function<void (ModuleAnalysisManager &)>, 2 >
7701006 ModuleAnalysisRegistrationCallbacks;
7711007 SmallVector<std::function<bool (StringRef, ModulePassManager &,
0 commit comments