2323#include " llvm/Analysis/ScopedNoAliasAA.h"
2424#include " llvm/Analysis/TargetTransformInfo.h"
2525#include " llvm/Analysis/TypeBasedAliasAnalysis.h"
26+ #include " llvm/CodeGen/AsmPrinter.h"
2627#include " llvm/CodeGen/AssignmentTrackingAnalysis.h"
2728#include " llvm/CodeGen/BranchFoldingPass.h"
2829#include " llvm/CodeGen/CallBrPrepare.h"
107108#include " llvm/IRPrinter/IRPrintingPasses.h"
108109#include " llvm/MC/MCAsmInfo.h"
109110#include " llvm/MC/MCTargetOptions.h"
111+ #include " llvm/MC/TargetRegistry.h"
112+ #include " llvm/Passes/PassBuilder.h"
110113#include " llvm/Support/CodeGen.h"
111114#include " llvm/Support/Debug.h"
112115#include " llvm/Support/Error.h"
@@ -190,8 +193,8 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
190193 }
191194
192195 Error buildPipeline (ModulePassManager &MPM, raw_pwrite_stream &Out,
193- raw_pwrite_stream *DwoOut,
194- CodeGenFileType FileType ) const ;
196+ raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
197+ MCContext &Ctx ) const ;
195198
196199 PassInstrumentationCallbacks *getPassInstrumentationCallbacks () const {
197200 return PIC;
@@ -356,6 +359,7 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
356359 TargetMachineT &TM;
357360 CGPassBuilderOption Opt;
358361 PassInstrumentationCallbacks *PIC;
362+ mutable IntrusiveRefCntPtr<AsmPrinter> PrinterImpl;
359363
360364 template <typename TMC> TMC &getTM () const { return static_cast <TMC &>(TM); }
361365 CodeGenOptLevel getOptLevel () const { return TM.getOptLevel (); }
@@ -621,7 +625,7 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
621625template <typename Derived, typename TargetMachineT>
622626Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
623627 ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
624- CodeGenFileType FileType) const {
628+ CodeGenFileType FileType, MCContext &Ctx ) const {
625629 auto StartStopInfo = TargetPassConfig::getStartStopInfo (*PIC);
626630 if (!StartStopInfo)
627631 return StartStopInfo.takeError ();
@@ -630,6 +634,17 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
630634 bool PrintAsm = TargetPassConfig::willCompleteCodeGenPipeline ();
631635 bool PrintMIR = !PrintAsm && FileType != CodeGenFileType::Null;
632636
637+ if (PrintAsm) {
638+ AddIRPass addIRPass (MPM, derived ());
639+ Expected<std::unique_ptr<MCStreamer>> MCStreamerOrErr =
640+ TM.createMCStreamer (Out, DwoOut, FileType, Ctx);
641+ if (auto Err = MCStreamerOrErr.takeError ())
642+ return Err;
643+ PrinterImpl =
644+ TM.getTarget ().createAsmPrinter (TM, std::move (*MCStreamerOrErr));
645+ addIRPass (AsmPrinterInitializePass (PrinterImpl));
646+ }
647+
633648 {
634649 AddIRPass addIRPass (MPM, derived ());
635650 addIRPass (RequireAnalysisPass<MachineModuleAnalysis, Module>(),
@@ -641,29 +656,35 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
641656 addISelPasses (addIRPass);
642657 }
643658
644- AddMachinePass addPass (MPM, derived ());
659+ // Ensure we destruct `addPass`.
660+ {
661+ AddMachinePass addPass (MPM, derived ());
645662
646- if (PrintMIR)
647- addPass (PrintMIRPreparePass (Out), /* Force=*/ true );
663+ if (PrintMIR)
664+ addPass (PrintMIRPreparePass (Out), /* Force=*/ true );
648665
649- if (auto Err = addCoreISelPasses (addPass))
650- return std::move (Err);
666+ if (auto Err = addCoreISelPasses (addPass))
667+ return std::move (Err);
651668
652- if (auto Err = derived ().addMachinePasses (addPass))
653- return std::move (Err);
669+ if (auto Err = derived ().addMachinePasses (addPass))
670+ return std::move (Err);
654671
655- if (!Opt.DisableVerify )
656- addPass (MachineVerifierPass ());
672+ if (!Opt.DisableVerify )
673+ addPass (MachineVerifierPass ());
657674
658- if (PrintAsm) {
659- derived (). addAsmPrinter (
660- addPass, [ this , &Out, DwoOut, FileType](MCContext &Ctx) {
661- return this -> TM . createMCStreamer (Out, DwoOut, FileType, Ctx);
662- } );
675+ if (PrintAsm)
676+ addPass ( AsmPrinterPass (PrinterImpl));
677+
678+ if (PrintMIR)
679+ addPass ( PrintMIRPass (Out), /* Force= */ true );
663680 }
664681
665- if (PrintMIR)
666- addPass (PrintMIRPass (Out), /* Force=*/ true );
682+ {
683+ AddIRPass addIRPass (MPM, derived ());
684+ addIRPass (AsmPrinterFinalizePass (PrinterImpl));
685+ }
686+
687+ PrinterImpl.reset ();
667688
668689 return verifyStartStop (*StartStopInfo);
669690}
@@ -776,6 +797,10 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addIRPasses(
776797 addPass (ExpandMemCmpPass (&TM));
777798 }
778799
800+ // This should be the last IR module pass.
801+ // if (TargetPassConfig::willCompleteCodeGenPipeline())
802+ // addPass(AsmPrinterInitializePass(PrinterImpl));
803+
779804 // Run GC lowering passes for builtin collectors
780805 // TODO: add a pass insertion point here
781806 addPass (GCLoweringPass ());
0 commit comments