2222#include " llvm/Analysis/ScopedNoAliasAA.h"
2323#include " llvm/Analysis/TargetTransformInfo.h"
2424#include " llvm/Analysis/TypeBasedAliasAnalysis.h"
25+ #include " llvm/CodeGen/AsmPrinter.h"
2526#include " llvm/CodeGen/AssignmentTrackingAnalysis.h"
2627#include " llvm/CodeGen/BranchFoldingPass.h"
2728#include " llvm/CodeGen/CallBrPrepare.h"
103104#include " llvm/IRPrinter/IRPrintingPasses.h"
104105#include " llvm/MC/MCAsmInfo.h"
105106#include " llvm/MC/MCTargetOptions.h"
107+ #include " llvm/MC/TargetRegistry.h"
108+ #include " llvm/Passes/PassBuilder.h"
106109#include " llvm/Support/CodeGen.h"
107110#include " llvm/Support/Debug.h"
108111#include " llvm/Support/Error.h"
@@ -179,8 +182,8 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
179182 }
180183
181184 Error buildPipeline (ModulePassManager &MPM, raw_pwrite_stream &Out,
182- raw_pwrite_stream *DwoOut,
183- CodeGenFileType FileType ) const ;
185+ raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
186+ MCContext &Ctx ) const ;
184187
185188 PassInstrumentationCallbacks *getPassInstrumentationCallbacks () const {
186189 return PIC;
@@ -298,6 +301,7 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
298301 TargetMachineT &TM;
299302 CGPassBuilderOption Opt;
300303 PassInstrumentationCallbacks *PIC;
304+ mutable IntrusiveRefCntPtr<AsmPrinter> PrinterImpl;
301305
302306 template <typename TMC> TMC &getTM () const { return static_cast <TMC &>(TM); }
303307 CodeGenOptLevel getOptLevel () const { return TM.getOptLevel (); }
@@ -560,7 +564,7 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
560564template <typename Derived, typename TargetMachineT>
561565Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
562566 ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
563- CodeGenFileType FileType) const {
567+ CodeGenFileType FileType, MCContext &Ctx ) const {
564568 auto StartStopInfo = TargetPassConfig::getStartStopInfo (*PIC);
565569 if (!StartStopInfo)
566570 return StartStopInfo.takeError ();
@@ -569,6 +573,17 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
569573 bool PrintAsm = TargetPassConfig::willCompleteCodeGenPipeline ();
570574 bool PrintMIR = !PrintAsm && FileType != CodeGenFileType::Null;
571575
576+ if (PrintAsm) {
577+ AddIRPass addIRPass (MPM, derived ());
578+ Expected<std::unique_ptr<MCStreamer>> MCStreamerOrErr =
579+ TM.createMCStreamer (Out, DwoOut, FileType, Ctx);
580+ if (auto Err = MCStreamerOrErr.takeError ())
581+ return Err;
582+ PrinterImpl =
583+ TM.getTarget ().createAsmPrinter (TM, std::move (*MCStreamerOrErr));
584+ addIRPass (AsmPrinterInitializePass (PrinterImpl));
585+ }
586+
572587 {
573588 AddIRPass addIRPass (MPM, derived ());
574589 addIRPass (RequireAnalysisPass<MachineModuleAnalysis, Module>());
@@ -577,29 +592,35 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
577592 addISelPasses (addIRPass);
578593 }
579594
580- AddMachinePass addPass (MPM, derived ());
595+ // Ensure we destruct `addPass`.
596+ {
597+ AddMachinePass addPass (MPM, derived ());
581598
582- if (PrintMIR)
583- addPass (PrintMIRPreparePass (Out), /* Force=*/ true );
599+ if (PrintMIR)
600+ addPass (PrintMIRPreparePass (Out), /* Force=*/ true );
584601
585- if (auto Err = addCoreISelPasses (addPass))
586- return std::move (Err);
602+ if (auto Err = addCoreISelPasses (addPass))
603+ return std::move (Err);
587604
588- if (auto Err = derived ().addMachinePasses (addPass))
589- return std::move (Err);
605+ if (auto Err = derived ().addMachinePasses (addPass))
606+ return std::move (Err);
590607
591- if (!Opt.DisableVerify )
592- addPass (MachineVerifierPass ());
608+ if (!Opt.DisableVerify )
609+ addPass (MachineVerifierPass ());
593610
594- if (PrintAsm) {
595- derived (). addAsmPrinter (
596- addPass, [ this , &Out, DwoOut, FileType](MCContext &Ctx) {
597- return this -> TM . createMCStreamer (Out, DwoOut, FileType, Ctx);
598- } );
611+ if (PrintAsm)
612+ addPass ( AsmPrinterPass (PrinterImpl));
613+
614+ if (PrintMIR)
615+ addPass ( PrintMIRPass (Out), /* Force= */ true );
599616 }
600617
601- if (PrintMIR)
602- addPass (PrintMIRPass (Out), /* Force=*/ true );
618+ {
619+ AddIRPass addIRPass (MPM, derived ());
620+ addIRPass (AsmPrinterFinalizePass (PrinterImpl));
621+ }
622+
623+ PrinterImpl.reset ();
603624
604625 return verifyStartStop (*StartStopInfo);
605626}
@@ -707,6 +728,10 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addIRPasses(
707728 addPass (ExpandMemCmpPass (&TM));
708729 }
709730
731+ // This should be the last IR module pass.
732+ // if (TargetPassConfig::willCompleteCodeGenPipeline())
733+ // addPass(AsmPrinterInitializePass(PrinterImpl));
734+
710735 // Run GC lowering passes for builtin collectors
711736 // TODO: add a pass insertion point here
712737 addPass (GCLoweringPass ());
0 commit comments