Skip to content

Commit 9ef2bbe

Browse files
committed
[CodeGen][NewPM] Port AsmPrinter to new pass manager
1 parent f374e7b commit 9ef2bbe

25 files changed

+414
-130
lines changed

llvm/include/llvm/CodeGen/AsmPrinter.h

Lines changed: 96 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "llvm/BinaryFormat/Dwarf.h"
2222
#include "llvm/CodeGen/DwarfStringPoolEntry.h"
2323
#include "llvm/CodeGen/MachineFunctionPass.h"
24+
#include "llvm/CodeGen/MachinePassManager.h"
2425
#include "llvm/CodeGen/StackMaps.h"
2526
#include "llvm/DebugInfo/CodeView/CodeView.h"
2627
#include "llvm/IR/InlineAsm.h"
@@ -83,7 +84,7 @@ class RemarkStreamer;
8384
}
8485

8586
/// This class is intended to be used as a driving class for all asm writers.
86-
class AsmPrinter : public MachineFunctionPass {
87+
class AsmPrinter {
8788
public:
8889
/// Target machine description.
8990
TargetMachine &TM;
@@ -179,8 +180,6 @@ class AsmPrinter : public MachineFunctionPass {
179180
/// List of symbols to be inserted into PC sections.
180181
DenseMap<const MDNode *, SmallVector<const MCSymbol *>> PCSectionsSymbols;
181182

182-
static char ID;
183-
184183
protected:
185184
MCSymbol *CurrentFnBegin = nullptr;
186185

@@ -198,6 +197,10 @@ class AsmPrinter : public MachineFunctionPass {
198197

199198
StackMaps SM;
200199

200+
MachineFunctionPass *P = nullptr;
201+
ModuleAnalysisManager *MAM = nullptr;
202+
MachineFunctionAnalysisManager *MFAM = nullptr;
203+
201204
private:
202205
/// If generated on the fly this own the instance.
203206
std::unique_ptr<MachineDominatorTree> OwnedMDT;
@@ -229,7 +232,7 @@ class AsmPrinter : public MachineFunctionPass {
229232
explicit AsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer);
230233

231234
public:
232-
~AsmPrinter() override;
235+
virtual ~AsmPrinter();
233236

234237
DwarfDebug *getDwarfDebug() { return DD; }
235238
DwarfDebug *getDwarfDebug() const { return DD; }
@@ -369,24 +372,36 @@ class AsmPrinter : public MachineFunctionPass {
369372
// MachineFunctionPass Implementation.
370373
//===------------------------------------------------------------------===//
371374

375+
virtual StringRef getPassName() const;
376+
372377
/// Record analysis usage.
373-
void getAnalysisUsage(AnalysisUsage &AU) const override;
378+
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
374379

375380
/// Set up the AsmPrinter when we are working on a new module. If your pass
376381
/// overrides this, it must make sure to explicitly call this implementation.
377-
bool doInitialization(Module &M) override;
382+
virtual bool doInitialization(Module &M);
378383

379384
/// Shut down the asmprinter. If you override this in your pass, you must make
380385
/// sure to call it explicitly.
381-
bool doFinalization(Module &M) override;
386+
virtual bool doFinalization(Module &M);
382387

383388
/// Emit the specified function out to the OutStreamer.
384-
bool runOnMachineFunction(MachineFunction &MF) override {
389+
virtual bool runOnMachineFunction(MachineFunction &MF) {
385390
SetupMachineFunction(MF);
386391
emitFunctionBody();
387392
return false;
388393
}
389394

395+
void setPass(MachineFunctionPass *Pass) { P = Pass; }
396+
void setMAM(ModuleAnalysisManager &AM) { MAM = &AM; }
397+
void setMFAM(MachineFunctionAnalysisManager &AM) { MFAM = &AM; }
398+
399+
//===------------------------------------------------------------------===//
400+
// New Pass Manager Implementation.
401+
//===------------------------------------------------------------------===//
402+
403+
virtual void getPreservedAnalyses(PreservedAnalyses &PA) const {}
404+
390405
//===------------------------------------------------------------------===//
391406
// Coarse grained IR lowering routines.
392407
//===------------------------------------------------------------------===//
@@ -514,6 +529,7 @@ class AsmPrinter : public MachineFunctionPass {
514529

515530
/// Emit the stack maps.
516531
void emitStackMaps();
532+
void emitStackMaps(Module &M); // For new pass manager version.
517533

518534
//===------------------------------------------------------------------===//
519535
// Overridable Hooks
@@ -905,6 +921,78 @@ class AsmPrinter : public MachineFunctionPass {
905921
}
906922
};
907923

924+
class AsmPrinterInitializePass
925+
: public PassInfoMixin<AsmPrinterInitializePass> {
926+
std::shared_ptr<AsmPrinter> Printer;
927+
928+
public:
929+
explicit AsmPrinterInitializePass(std::shared_ptr<AsmPrinter> AP)
930+
: Printer(AP) {}
931+
932+
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
933+
};
934+
935+
class AsmPrinterPass : public PassInfoMixin<AsmPrinterPass> {
936+
std::shared_ptr<AsmPrinter> Printer;
937+
938+
public:
939+
explicit AsmPrinterPass(std::shared_ptr<AsmPrinter> AP)
940+
: Printer(std::move(AP)) {}
941+
942+
PreservedAnalyses run(MachineFunction &MF,
943+
MachineFunctionAnalysisManager &MFAM);
944+
};
945+
946+
class AsmPrinterFinalizePass : public PassInfoMixin<AsmPrinterFinalizePass> {
947+
std::shared_ptr<AsmPrinter> Printer;
948+
949+
public:
950+
explicit AsmPrinterFinalizePass(std::shared_ptr<AsmPrinter> AP)
951+
: Printer(AP) {}
952+
953+
PreservedAnalyses run(Module &M, ModuleAnalysisManager &);
954+
};
955+
956+
class AsmPrinterLegacy : public MachineFunctionPass {
957+
std::unique_ptr<AsmPrinter> Printer;
958+
959+
public:
960+
static char ID;
961+
962+
explicit AsmPrinterLegacy(std::unique_ptr<AsmPrinter> AP);
963+
964+
AsmPrinter &getPrinter() { return *Printer; }
965+
966+
//===------------------------------------------------------------------===//
967+
// MachineFunctionPass Implementation.
968+
//===------------------------------------------------------------------===//
969+
970+
/// Record analysis usage.
971+
void getAnalysisUsage(AnalysisUsage &AU) const override {
972+
MachineFunctionPass::getAnalysisUsage(AU);
973+
Printer->getAnalysisUsage(AU);
974+
}
975+
976+
/// Set up the AsmPrinter when we are working on a new module. If your pass
977+
/// overrides this, it must make sure to explicitly call this implementation.
978+
bool doInitialization(Module &M) override {
979+
return Printer->doInitialization(M);
980+
}
981+
982+
/// Shut down the asmprinter. If you override this in your pass, you must make
983+
/// sure to call it explicitly.
984+
bool doFinalization(Module &M) override { return Printer->doFinalization(M); }
985+
986+
/// Emit the specified function out to the OutStreamer.
987+
bool runOnMachineFunction(MachineFunction &MF) override {
988+
return Printer->runOnMachineFunction(MF);
989+
}
990+
991+
StringRef getPassName() const override { return Printer->getPassName(); }
992+
};
993+
994+
AsmPrinterLegacy *createAsmPrinterLegacy(std::unique_ptr<AsmPrinter> AP);
995+
908996
} // end namespace llvm
909997

910998
#endif // LLVM_CODEGEN_ASMPRINTER_H

llvm/include/llvm/MC/TargetRegistry.h

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
namespace llvm {
3737

3838
class AsmPrinter;
39+
class AsmPrinterLegacy;
3940
class MCAsmBackend;
4041
class MCAsmInfo;
4142
class MCAsmParser;
@@ -57,6 +58,8 @@ class MCTargetStreamer;
5758
class raw_ostream;
5859
class TargetMachine;
5960
class TargetOptions;
61+
62+
AsmPrinterLegacy *createAsmPrinterLegacy(std::unique_ptr<AsmPrinter> AP);
6063
namespace mca {
6164
class CustomBehaviour;
6265
class InstrPostProcess;
@@ -170,8 +173,12 @@ class Target {
170173
// If it weren't for layering issues (this header is in llvm/Support, but
171174
// depends on MC?) this should take the Streamer by value rather than rvalue
172175
// reference.
173-
using AsmPrinterCtorTy = AsmPrinter *(*)(
174-
TargetMachine &TM, std::unique_ptr<MCStreamer> &&Streamer);
176+
using AsmPrinterLegacyCtorTy =
177+
AsmPrinterLegacy *(*)(TargetMachine &TM,
178+
std::unique_ptr<MCStreamer> &&Streamer);
179+
using AsmPrinterCtorTy =
180+
AsmPrinter *(*)(TargetMachine &TM,
181+
std::unique_ptr<MCStreamer> &&Streamer);
175182
using MCAsmBackendCtorTy = MCAsmBackend *(*)(const Target &T,
176183
const MCSubtargetInfo &STI,
177184
const MCRegisterInfo &MRI,
@@ -314,6 +321,7 @@ class Target {
314321

315322
/// AsmPrinterCtorFn - Construction function for this target's AsmPrinter,
316323
/// if registered.
324+
AsmPrinterLegacyCtorTy AsmPrinterLegacyCtorFn;
317325
AsmPrinterCtorTy AsmPrinterCtorFn;
318326

319327
/// MCDisassemblerCtorFn - Construction function for this target's
@@ -517,6 +525,16 @@ class Target {
517525

518526
/// createAsmPrinter - Create a target specific assembly printer pass. This
519527
/// takes ownership of the MCStreamer object.
528+
AsmPrinterLegacy *
529+
createAsmPrinterLegacy(TargetMachine &TM,
530+
std::unique_ptr<MCStreamer> &&Streamer) const {
531+
if (!AsmPrinterLegacyCtorFn)
532+
return nullptr;
533+
return AsmPrinterLegacyCtorFn(TM, std::move(Streamer));
534+
}
535+
536+
/// Same as `createAsmPrinter`, but only create AsmPrinter, for new pass
537+
/// manager.
520538
AsmPrinter *createAsmPrinter(TargetMachine &TM,
521539
std::unique_ptr<MCStreamer> &&Streamer) const {
522540
if (!AsmPrinterCtorFn)
@@ -963,6 +981,9 @@ struct TargetRegistry {
963981
///
964982
/// @param T - The target being registered.
965983
/// @param Fn - A function to construct an AsmPrinter for the target.
984+
static void RegisterAsmPrinter(Target &T, Target::AsmPrinterLegacyCtorTy Fn) {
985+
T.AsmPrinterLegacyCtorFn = Fn;
986+
}
966987
static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) {
967988
T.AsmPrinterCtorFn = Fn;
968989
}
@@ -1428,9 +1449,16 @@ template <class MCAsmParserImpl> struct RegisterMCAsmParser {
14281449
template <class AsmPrinterImpl> struct RegisterAsmPrinter {
14291450
RegisterAsmPrinter(Target &T) {
14301451
TargetRegistry::RegisterAsmPrinter(T, &Allocator);
1452+
TargetRegistry::RegisterAsmPrinter(T, &AllocatorLegacy);
14311453
}
14321454

14331455
private:
1456+
static AsmPrinterLegacy *
1457+
AllocatorLegacy(TargetMachine &TM, std::unique_ptr<MCStreamer> &&Streamer) {
1458+
auto *P = new AsmPrinterImpl(TM, std::move(Streamer));
1459+
return createAsmPrinterLegacy(std::unique_ptr<AsmPrinter>(P));
1460+
}
1461+
14341462
static AsmPrinter *Allocator(TargetMachine &TM,
14351463
std::unique_ptr<MCStreamer> &&Streamer) {
14361464
return new AsmPrinterImpl(TM, std::move(Streamer));

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
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/CallBrPrepare.h"
2728
#include "llvm/CodeGen/CodeGenPrepare.h"
@@ -62,6 +63,7 @@
6263
#include "llvm/IRPrinter/IRPrintingPasses.h"
6364
#include "llvm/MC/MCAsmInfo.h"
6465
#include "llvm/MC/MCTargetOptions.h"
66+
#include "llvm/Passes/PassBuilder.h"
6567
#include "llvm/Support/CodeGen.h"
6668
#include "llvm/Support/Debug.h"
6769
#include "llvm/Support/Error.h"
@@ -119,9 +121,8 @@ namespace llvm {
119121
template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
120122
public:
121123
explicit CodeGenPassBuilder(TargetMachineT &TM,
122-
const CGPassBuilderOption &Opts,
123-
PassInstrumentationCallbacks *PIC)
124-
: TM(TM), Opt(Opts), PIC(PIC) {
124+
const CGPassBuilderOption &Opts, PassBuilder &PB)
125+
: TM(TM), Opt(Opts), PB(PB), PIC(PB.getPassInstrumentationCallbacks()) {
125126
// Target could set CGPassBuilderOption::MISchedPostRA to true to achieve
126127
// substitutePass(&PostRASchedulerID, &PostMachineSchedulerID)
127128

@@ -138,8 +139,8 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
138139
}
139140

140141
Error buildPipeline(ModulePassManager &MPM, raw_pwrite_stream &Out,
141-
raw_pwrite_stream *DwoOut,
142-
CodeGenFileType FileType) const;
142+
raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
143+
MCContext &Ctx) const;
143144

144145
PassInstrumentationCallbacks *getPassInstrumentationCallbacks() const {
145146
return PIC;
@@ -256,7 +257,9 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
256257

257258
TargetMachineT &TM;
258259
CGPassBuilderOption Opt;
260+
PassBuilder &PB;
259261
PassInstrumentationCallbacks *PIC;
262+
mutable std::shared_ptr<AsmPrinter> PrinterImpl;
260263

261264
template <typename TMC> TMC &getTM() const { return static_cast<TMC &>(TM); }
262265
CodeGenOptLevel getOptLevel() const { return TM.getOptLevel(); }
@@ -518,7 +521,7 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
518521
template <typename Derived, typename TargetMachineT>
519522
Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
520523
ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
521-
CodeGenFileType FileType) const {
524+
CodeGenFileType FileType, MCContext &Ctx) const {
522525
auto StartStopInfo = TargetPassConfig::getStartStopInfo(*PIC);
523526
if (!StartStopInfo)
524527
return StartStopInfo.takeError();
@@ -527,6 +530,14 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
527530
bool PrintAsm = TargetPassConfig::willCompleteCodeGenPipeline();
528531
bool PrintMIR = !PrintAsm && FileType != CodeGenFileType::Null;
529532

533+
if (PrintAsm) {
534+
Expected<std::unique_ptr<MCStreamer>> MCStreamerOrErr =
535+
TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
536+
if (auto Err = MCStreamerOrErr.takeError())
537+
return Err;
538+
PrinterImpl = PB.getAsmPrinter(std::move(*MCStreamerOrErr));
539+
}
540+
530541
{
531542
AddIRPass addIRPass(MPM, derived());
532543
addIRPass(RequireAnalysisPass<MachineModuleAnalysis, Module>());
@@ -535,26 +546,30 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
535546
addISelPasses(addIRPass);
536547
}
537548

538-
AddMachinePass addPass(MPM, derived());
549+
// Ensure we destruct `addPass`.
550+
{
551+
AddMachinePass addPass(MPM, derived());
539552

540-
if (PrintMIR)
541-
addPass(PrintMIRPreparePass(Out), /*Force=*/true);
553+
if (PrintMIR)
554+
addPass(PrintMIRPreparePass(Out), /*Force=*/true);
542555

543-
if (auto Err = addCoreISelPasses(addPass))
544-
return std::move(Err);
556+
if (auto Err = addCoreISelPasses(addPass))
557+
return std::move(Err);
545558

546-
if (auto Err = derived().addMachinePasses(addPass))
547-
return std::move(Err);
559+
if (auto Err = derived().addMachinePasses(addPass))
560+
return std::move(Err);
548561

549-
if (PrintAsm) {
550-
derived().addAsmPrinter(
551-
addPass, [this, &Out, DwoOut, FileType](MCContext &Ctx) {
552-
return this->TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
553-
});
562+
if (PrintAsm)
563+
addPass(AsmPrinterPass(PrinterImpl));
564+
565+
if (PrintMIR)
566+
addPass(PrintMIRPass(Out), /*Force=*/true);
554567
}
555568

556-
if (PrintMIR)
557-
addPass(PrintMIRPass(Out), /*Force=*/true);
569+
{
570+
AddIRPass addIRPass(MPM, derived());
571+
addIRPass(AsmPrinterFinalizePass(PrinterImpl));
572+
}
558573

559574
return verifyStartStop(*StartStopInfo);
560575
}
@@ -665,6 +680,10 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addIRPasses(
665680
addPass(ExpandMemCmpPass(&TM));
666681
}
667682

683+
// This should be the last IR module pass.
684+
if (TargetPassConfig::willCompleteCodeGenPipeline())
685+
addPass(AsmPrinterInitializePass(PrinterImpl));
686+
668687
// Run GC lowering passes for builtin collectors
669688
// TODO: add a pass insertion point here
670689
addPass(GCLoweringPass());

0 commit comments

Comments
 (0)