Skip to content

Commit 9680421

Browse files
committed
[CodeGen][NewPM] Port AsmPrinter to new pass manager
1 parent dfccdac commit 9680421

21 files changed

+418
-131
lines changed

llvm/include/llvm/CodeGen/AsmPrinter.h

Lines changed: 94 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
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/BinaryFormat/Dwarf.h"
2223
#include "llvm/CodeGen/DwarfStringPoolEntry.h"
2324
#include "llvm/CodeGen/MachineFunctionPass.h"
25+
#include "llvm/CodeGen/MachinePassManager.h"
2426
#include "llvm/CodeGen/StackMaps.h"
2527
#include "llvm/DebugInfo/CodeView/CodeView.h"
2628
#include "llvm/IR/InlineAsm.h"
@@ -84,7 +86,9 @@ class RemarkStreamer;
8486
}
8587

8688
/// This class is intended to be used as a driving class for all asm writers.
87-
class AsmPrinter : public MachineFunctionPass {
89+
/// Use lightweight RefCountedBase here because AsmPrinter is shared only in
90+
/// pass manager.
91+
class AsmPrinter : public RefCountedBase<AsmPrinter> {
8892
public:
8993
/// Target machine description.
9094
TargetMachine &TM;
@@ -180,8 +184,6 @@ class AsmPrinter : public MachineFunctionPass {
180184
/// List of symbols to be inserted into PC sections.
181185
DenseMap<const MDNode *, SmallVector<const MCSymbol *>> PCSectionsSymbols;
182186

183-
static char ID;
184-
185187
protected:
186188
MCSymbol *CurrentFnBegin = nullptr;
187189

@@ -201,6 +203,10 @@ class AsmPrinter : public MachineFunctionPass {
201203

202204
StackMaps SM;
203205

206+
MachineFunctionPass *MFPass = nullptr;
207+
ModuleAnalysisManager *MAM = nullptr;
208+
MachineFunctionAnalysisManager *MFAM = nullptr;
209+
204210
private:
205211
/// If generated on the fly this own the instance.
206212
std::unique_ptr<MachineDominatorTree> OwnedMDT;
@@ -235,7 +241,7 @@ class AsmPrinter : public MachineFunctionPass {
235241
explicit AsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer);
236242

237243
public:
238-
~AsmPrinter() override;
244+
virtual ~AsmPrinter();
239245

240246
DwarfDebug *getDwarfDebug() { return DD; }
241247
DwarfDebug *getDwarfDebug() const { return DD; }
@@ -375,24 +381,31 @@ class AsmPrinter : public MachineFunctionPass {
375381
// MachineFunctionPass Implementation.
376382
//===------------------------------------------------------------------===//
377383

384+
virtual StringRef getPassName() const;
385+
378386
/// Record analysis usage.
379-
void getAnalysisUsage(AnalysisUsage &AU) const override;
387+
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
380388

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

385393
/// Shut down the asmprinter. If you override this in your pass, you must make
386394
/// sure to call it explicitly.
387-
bool doFinalization(Module &M) override;
395+
virtual bool doFinalization(Module &M);
388396

389397
/// Emit the specified function out to the OutStreamer.
390-
bool runOnMachineFunction(MachineFunction &MF) override {
398+
virtual bool runOnMachineFunction(MachineFunction &MF) {
391399
SetupMachineFunction(MF);
392400
emitFunctionBody();
393401
return false;
394402
}
395403

404+
void setPass(MachineFunctionPass *P) { MFPass = P; }
405+
void setMAM(ModuleAnalysisManager &AM) { MAM = &AM; }
406+
void clearMAM() { MAM = nullptr; }
407+
void setMFAM(MachineFunctionAnalysisManager &AM) { MFAM = &AM; }
408+
396409
//===------------------------------------------------------------------===//
397410
// Coarse grained IR lowering routines.
398411
//===------------------------------------------------------------------===//
@@ -523,6 +536,7 @@ class AsmPrinter : public MachineFunctionPass {
523536

524537
/// Emit the stack maps.
525538
void emitStackMaps();
539+
void emitStackMaps(Module &M); // For new pass manager version.
526540

527541
//===------------------------------------------------------------------===//
528542
// Overridable Hooks
@@ -922,6 +936,78 @@ class AsmPrinter : public MachineFunctionPass {
922936
}
923937
};
924938

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

9271013
#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
@@ -37,6 +37,7 @@
3737
namespace llvm {
3838

3939
class AsmPrinter;
40+
class AsmPrinterLegacy;
4041
class MCAsmBackend;
4142
class MCAsmInfo;
4243
class MCAsmParser;
@@ -58,6 +59,8 @@ class MCTargetStreamer;
5859
class raw_ostream;
5960
class TargetMachine;
6061
class TargetOptions;
62+
63+
AsmPrinterLegacy *createAsmPrinterLegacy(std::unique_ptr<AsmPrinter> AP);
6164
namespace mca {
6265
class CustomBehaviour;
6366
class InstrPostProcess;
@@ -166,8 +169,12 @@ class Target {
166169
// If it weren't for layering issues (this header is in llvm/Support, but
167170
// depends on MC?) this should take the Streamer by value rather than rvalue
168171
// reference.
169-
using AsmPrinterCtorTy = AsmPrinter *(*)(
170-
TargetMachine &TM, std::unique_ptr<MCStreamer> &&Streamer);
172+
using AsmPrinterLegacyCtorTy =
173+
AsmPrinterLegacy *(*)(TargetMachine &TM,
174+
std::unique_ptr<MCStreamer> &&Streamer);
175+
using AsmPrinterCtorTy =
176+
AsmPrinter *(*)(TargetMachine &TM,
177+
std::unique_ptr<MCStreamer> &&Streamer);
171178
using MCAsmBackendCtorTy = MCAsmBackend *(*)(const Target &T,
172179
const MCSubtargetInfo &STI,
173180
const MCRegisterInfo &MRI,
@@ -288,6 +295,7 @@ class Target {
288295

289296
/// AsmPrinterCtorFn - Construction function for this target's AsmPrinter,
290297
/// if registered.
298+
AsmPrinterLegacyCtorTy AsmPrinterLegacyCtorFn;
291299
AsmPrinterCtorTy AsmPrinterCtorFn;
292300

293301
/// MCDisassemblerCtorFn - Construction function for this target's
@@ -487,6 +495,16 @@ class Target {
487495

488496
/// createAsmPrinter - Create a target specific assembly printer pass. This
489497
/// takes ownership of the MCStreamer object.
498+
AsmPrinterLegacy *
499+
createAsmPrinterLegacy(TargetMachine &TM,
500+
std::unique_ptr<MCStreamer> &&Streamer) const {
501+
if (!AsmPrinterLegacyCtorFn)
502+
return nullptr;
503+
return AsmPrinterLegacyCtorFn(TM, std::move(Streamer));
504+
}
505+
506+
/// Same as `createAsmPrinter`, but only create AsmPrinter, for new pass
507+
/// manager.
490508
AsmPrinter *createAsmPrinter(TargetMachine &TM,
491509
std::unique_ptr<MCStreamer> &&Streamer) const {
492510
if (!AsmPrinterCtorFn)
@@ -862,6 +880,9 @@ struct TargetRegistry {
862880
///
863881
/// @param T - The target being registered.
864882
/// @param Fn - A function to construct an AsmPrinter for the target.
883+
static void RegisterAsmPrinter(Target &T, Target::AsmPrinterLegacyCtorTy Fn) {
884+
T.AsmPrinterLegacyCtorFn = Fn;
885+
}
865886
static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) {
866887
T.AsmPrinterCtorFn = Fn;
867888
}
@@ -1311,9 +1332,16 @@ template <class MCAsmParserImpl> struct RegisterMCAsmParser {
13111332
template <class AsmPrinterImpl> struct RegisterAsmPrinter {
13121333
RegisterAsmPrinter(Target &T) {
13131334
TargetRegistry::RegisterAsmPrinter(T, &Allocator);
1335+
TargetRegistry::RegisterAsmPrinter(T, &AllocatorLegacy);
13141336
}
13151337

13161338
private:
1339+
static AsmPrinterLegacy *
1340+
AllocatorLegacy(TargetMachine &TM, std::unique_ptr<MCStreamer> &&Streamer) {
1341+
auto *P = new AsmPrinterImpl(TM, std::move(Streamer));
1342+
return createAsmPrinterLegacy(std::unique_ptr<AsmPrinter>(P));
1343+
}
1344+
13171345
static AsmPrinter *Allocator(TargetMachine &TM,
13181346
std::unique_ptr<MCStreamer> &&Streamer) {
13191347
return new AsmPrinterImpl(TM, std::move(Streamer));

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 41 additions & 22 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"
@@ -76,6 +77,7 @@
7677
#include "llvm/IRPrinter/IRPrintingPasses.h"
7778
#include "llvm/MC/MCAsmInfo.h"
7879
#include "llvm/MC/MCTargetOptions.h"
80+
#include "llvm/Passes/PassBuilder.h"
7981
#include "llvm/Support/CodeGen.h"
8082
#include "llvm/Support/Debug.h"
8183
#include "llvm/Support/Error.h"
@@ -133,9 +135,8 @@ namespace llvm {
133135
template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
134136
public:
135137
explicit CodeGenPassBuilder(TargetMachineT &TM,
136-
const CGPassBuilderOption &Opts,
137-
PassInstrumentationCallbacks *PIC)
138-
: TM(TM), Opt(Opts), PIC(PIC) {
138+
const CGPassBuilderOption &Opts, PassBuilder &PB)
139+
: TM(TM), Opt(Opts), PB(PB), PIC(PB.getPassInstrumentationCallbacks()) {
139140
// Target could set CGPassBuilderOption::MISchedPostRA to true to achieve
140141
// substitutePass(&PostRASchedulerID, &PostMachineSchedulerID)
141142

@@ -152,8 +153,8 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
152153
}
153154

154155
Error buildPipeline(ModulePassManager &MPM, raw_pwrite_stream &Out,
155-
raw_pwrite_stream *DwoOut,
156-
CodeGenFileType FileType) const;
156+
raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
157+
MCContext &Ctx) const;
157158

158159
PassInstrumentationCallbacks *getPassInstrumentationCallbacks() const {
159160
return PIC;
@@ -270,7 +271,9 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
270271

271272
TargetMachineT &TM;
272273
CGPassBuilderOption Opt;
274+
PassBuilder &PB;
273275
PassInstrumentationCallbacks *PIC;
276+
mutable IntrusiveRefCntPtr<AsmPrinter> PrinterImpl;
274277

275278
template <typename TMC> TMC &getTM() const { return static_cast<TMC &>(TM); }
276279
CodeGenOptLevel getOptLevel() const { return TM.getOptLevel(); }
@@ -533,7 +536,7 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
533536
template <typename Derived, typename TargetMachineT>
534537
Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
535538
ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
536-
CodeGenFileType FileType) const {
539+
CodeGenFileType FileType, MCContext &Ctx) const {
537540
auto StartStopInfo = TargetPassConfig::getStartStopInfo(*PIC);
538541
if (!StartStopInfo)
539542
return StartStopInfo.takeError();
@@ -542,6 +545,14 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
542545
bool PrintAsm = TargetPassConfig::willCompleteCodeGenPipeline();
543546
bool PrintMIR = !PrintAsm && FileType != CodeGenFileType::Null;
544547

548+
if (PrintAsm) {
549+
Expected<std::unique_ptr<MCStreamer>> MCStreamerOrErr =
550+
TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
551+
if (auto Err = MCStreamerOrErr.takeError())
552+
return Err;
553+
PrinterImpl = PB.getAsmPrinter(std::move(*MCStreamerOrErr));
554+
}
555+
545556
{
546557
AddIRPass addIRPass(MPM, derived());
547558
addIRPass(RequireAnalysisPass<MachineModuleAnalysis, Module>());
@@ -550,29 +561,33 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
550561
addISelPasses(addIRPass);
551562
}
552563

553-
AddMachinePass addPass(MPM, derived());
564+
// Ensure we destruct `addPass`.
565+
{
566+
AddMachinePass addPass(MPM, derived());
554567

555-
if (PrintMIR)
556-
addPass(PrintMIRPreparePass(Out), /*Force=*/true);
568+
if (PrintMIR)
569+
addPass(PrintMIRPreparePass(Out), /*Force=*/true);
557570

558-
if (auto Err = addCoreISelPasses(addPass))
559-
return std::move(Err);
571+
if (auto Err = addCoreISelPasses(addPass))
572+
return std::move(Err);
560573

561-
if (auto Err = derived().addMachinePasses(addPass))
562-
return std::move(Err);
574+
if (auto Err = derived().addMachinePasses(addPass))
575+
return std::move(Err);
563576

564-
if (!Opt.DisableVerify)
565-
addPass(MachineVerifierPass());
577+
if (!Opt.DisableVerify)
578+
addPass(MachineVerifierPass());
566579

567-
if (PrintAsm) {
568-
derived().addAsmPrinter(
569-
addPass, [this, &Out, DwoOut, FileType](MCContext &Ctx) {
570-
return this->TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
571-
});
580+
if (PrintAsm)
581+
addPass(AsmPrinterPass(PrinterImpl));
582+
583+
if (PrintMIR)
584+
addPass(PrintMIRPass(Out), /*Force=*/true);
572585
}
573586

574-
if (PrintMIR)
575-
addPass(PrintMIRPass(Out), /*Force=*/true);
587+
{
588+
AddIRPass addIRPass(MPM, derived());
589+
addIRPass(AsmPrinterFinalizePass(PrinterImpl));
590+
}
576591

577592
return verifyStartStop(*StartStopInfo);
578593
}
@@ -680,6 +695,10 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addIRPasses(
680695
addPass(ExpandMemCmpPass(&TM));
681696
}
682697

698+
// This should be the last IR module pass.
699+
if (TargetPassConfig::willCompleteCodeGenPipeline())
700+
addPass(AsmPrinterInitializePass(PrinterImpl));
701+
683702
// Run GC lowering passes for builtin collectors
684703
// TODO: add a pass insertion point here
685704
addPass(GCLoweringPass());

0 commit comments

Comments
 (0)