Skip to content

Commit 72e20d5

Browse files
committed
[CodeGen][NewPM] Port AsmPrinter to new pass manager
1 parent cecdff9 commit 72e20d5

File tree

16 files changed

+277
-100
lines changed

16 files changed

+277
-100
lines changed

llvm/include/llvm/CodeGen/AsmPrinter.h

Lines changed: 72 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
#define LLVM_CODEGEN_ASMPRINTER_H
1717

1818
#include "llvm/ADT/DenseMap.h"
19+
#include "llvm/ADT/IntrusiveRefCntPtr.h"
1920
#include "llvm/ADT/MapVector.h"
2021
#include "llvm/ADT/SmallVector.h"
2122
#include "llvm/Analysis/ProfileSummaryInfo.h"
2223
#include "llvm/Analysis/StaticDataProfileInfo.h"
2324
#include "llvm/BinaryFormat/Dwarf.h"
2425
#include "llvm/CodeGen/DwarfStringPoolEntry.h"
2526
#include "llvm/CodeGen/MachineFunctionPass.h"
27+
#include "llvm/CodeGen/MachinePassManager.h"
2628
#include "llvm/CodeGen/StackMaps.h"
2729
#include "llvm/DebugInfo/CodeView/CodeView.h"
2830
#include "llvm/IR/InlineAsm.h"
@@ -87,7 +89,8 @@ class RemarkStreamer;
8789
}
8890

8991
/// This class is intended to be used as a driving class for all asm writers.
90-
class LLVM_ABI AsmPrinter : public MachineFunctionPass {
92+
class LLVM_ABI AsmPrinter : public RefCountedBase<AsmPrinter>,
93+
public MachineFunctionPass {
9194
public:
9295
/// Target machine description.
9396
TargetMachine &TM;
@@ -247,6 +250,11 @@ class LLVM_ABI AsmPrinter : public MachineFunctionPass {
247250

248251
StackMaps SM;
249252

253+
/// If one of these pass managers is not null, then it is in new pass manager.
254+
ModuleAnalysisManager *MAM = nullptr;
255+
MachineFunctionAnalysisManager *MFAM = nullptr;
256+
bool inNewPassManager() const { return MAM || MFAM; }
257+
250258
private:
251259
/// If generated on the fly this own the instance.
252260
std::unique_ptr<MachineDominatorTree> OwnedMDT;
@@ -282,7 +290,7 @@ class LLVM_ABI AsmPrinter : public MachineFunctionPass {
282290
char &ID = AsmPrinter::ID);
283291

284292
public:
285-
~AsmPrinter() override;
293+
virtual ~AsmPrinter();
286294

287295
DwarfDebug *getDwarfDebug() { return DD; }
288296
DwarfDebug *getDwarfDebug() const { return DD; }
@@ -437,23 +445,43 @@ class LLVM_ABI AsmPrinter : public MachineFunctionPass {
437445
// MachineFunctionPass Implementation.
438446
//===------------------------------------------------------------------===//
439447

448+
virtual StringRef getPassName() const override;
449+
440450
/// Record analysis usage.
441-
void getAnalysisUsage(AnalysisUsage &AU) const override;
451+
virtual void getAnalysisUsage(AnalysisUsage &AU) const override;
442452

443453
/// Set up the AsmPrinter when we are working on a new module. If your pass
444454
/// overrides this, it must make sure to explicitly call this implementation.
445-
bool doInitialization(Module &M) override;
455+
/// TODO: Keep only the new pass manager doInitialization.
456+
virtual bool doInitialization(Module &M) override;
457+
virtual void doInitialization(Module &M, ModuleAnalysisManager &MAM) {
458+
this->MAM = &MAM;
459+
doInitialization(M);
460+
this->MAM = nullptr;
461+
}
446462

447463
/// Shut down the asmprinter. If you override this in your pass, you must make
448464
/// sure to call it explicitly.
449-
bool doFinalization(Module &M) override;
465+
/// TODO: Keep only the new pass manager doFinalization.
466+
virtual bool doFinalization(Module &M) override;
467+
virtual void doFinalization(Module &M, ModuleAnalysisManager &MAM) {
468+
this->MAM = &MAM;
469+
doFinalization(M);
470+
this->MAM = nullptr;
471+
}
450472

451473
/// Emit the specified function out to the OutStreamer.
452-
bool runOnMachineFunction(MachineFunction &MF) override {
474+
/// TODO: Keep only the new pass manager run.
475+
virtual bool runOnMachineFunction(MachineFunction &MF) override {
453476
SetupMachineFunction(MF);
454477
emitFunctionBody();
455478
return false;
456479
}
480+
virtual void run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) {
481+
this->MFAM = &MFAM;
482+
SetupMachineFunction(MF);
483+
emitFunctionBody();
484+
}
457485

458486
//===------------------------------------------------------------------===//
459487
// Coarse grained IR lowering routines.
@@ -590,6 +618,7 @@ class LLVM_ABI AsmPrinter : public MachineFunctionPass {
590618

591619
/// Emit the stack maps.
592620
void emitStackMaps();
621+
void emitStackMaps(Module &M); // For new pass manager version.
593622

594623
//===------------------------------------------------------------------===//
595624
// Overridable Hooks
@@ -999,6 +1028,43 @@ class LLVM_ABI AsmPrinter : public MachineFunctionPass {
9991028
}
10001029
};
10011030

1031+
class AsmPrinterInitializePass
1032+
: public PassInfoMixin<AsmPrinterInitializePass> {
1033+
IntrusiveRefCntPtr<AsmPrinter> Printer;
1034+
1035+
public:
1036+
AsmPrinterInitializePass(IntrusiveRefCntPtr<AsmPrinter> Printer)
1037+
: Printer(Printer) {}
1038+
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM) {
1039+
Printer->doInitialization(M, MAM);
1040+
return PreservedAnalyses::all();
1041+
}
1042+
};
1043+
1044+
class AsmPrinterPass : public PassInfoMixin<AsmPrinterPass> {
1045+
IntrusiveRefCntPtr<AsmPrinter> Printer;
1046+
1047+
public:
1048+
AsmPrinterPass(IntrusiveRefCntPtr<AsmPrinter> Printer) : Printer(Printer) {}
1049+
PreservedAnalyses run(MachineFunction &MF,
1050+
MachineFunctionAnalysisManager &MFAM) {
1051+
Printer->run(MF, MFAM);
1052+
return PreservedAnalyses::all();
1053+
}
1054+
};
1055+
1056+
class AsmPrinterFinalizePass : public PassInfoMixin<AsmPrinterFinalizePass> {
1057+
IntrusiveRefCntPtr<AsmPrinter> Printer;
1058+
1059+
public:
1060+
AsmPrinterFinalizePass(IntrusiveRefCntPtr<AsmPrinter> Printer)
1061+
: Printer(Printer) {}
1062+
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM) {
1063+
Printer->doFinalization(M, MAM);
1064+
return PreservedAnalyses::all();
1065+
}
1066+
};
1067+
10021068
} // end namespace llvm
10031069

10041070
#endif // LLVM_CODEGEN_ASMPRINTER_H

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
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"
@@ -107,6 +108,8 @@
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 {
621625
template <typename Derived, typename TargetMachineT>
622626
Error 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());

llvm/include/llvm/Target/TargetMachine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ class LLVM_ABI TargetMachine {
487487

488488
virtual Error buildCodeGenPipeline(ModulePassManager &, raw_pwrite_stream &,
489489
raw_pwrite_stream *, CodeGenFileType,
490-
const CGPassBuilderOption &,
490+
const CGPassBuilderOption &, MCContext &,
491491
PassInstrumentationCallbacks *) {
492492
return make_error<StringError>("buildCodeGenPipeline is not overridden",
493493
inconvertibleErrorCode());

0 commit comments

Comments
 (0)