Skip to content

Commit 0716c4a

Browse files
committed
[CodeGen] Port AsmPrinter to new pass manager
1 parent 41fcd7e commit 0716c4a

File tree

16 files changed

+277
-100
lines changed

16 files changed

+277
-100
lines changed

llvm/include/llvm/CodeGen/AsmPrinter.h

Lines changed: 74 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"
@@ -86,7 +88,10 @@ class RemarkStreamer;
8688
}
8789

8890
/// This class is intended to be used as a driving class for all asm writers.
89-
class AsmPrinter : public MachineFunctionPass {
91+
/// Use lightweight RefCountedBase here because AsmPrinter is shared only in
92+
/// pass manager.
93+
class AsmPrinter : public RefCountedBase<AsmPrinter>,
94+
public MachineFunctionPass {
9095
public:
9196
/// Target machine description.
9297
TargetMachine &TM;
@@ -209,6 +214,11 @@ class AsmPrinter : public MachineFunctionPass {
209214

210215
StackMaps SM;
211216

217+
/// If one of thses pass manager is not null, then it is in new pass manager.
218+
ModuleAnalysisManager *MAM = nullptr;
219+
MachineFunctionAnalysisManager *MFAM = nullptr;
220+
bool inNewPassManager() const { return MAM || MFAM; }
221+
212222
private:
213223
/// If generated on the fly this own the instance.
214224
std::unique_ptr<MachineDominatorTree> OwnedMDT;
@@ -244,7 +254,7 @@ class AsmPrinter : public MachineFunctionPass {
244254
char &ID = AsmPrinter::ID);
245255

246256
public:
247-
~AsmPrinter() override;
257+
virtual ~AsmPrinter();
248258

249259
DwarfDebug *getDwarfDebug() { return DD; }
250260
DwarfDebug *getDwarfDebug() const { return DD; }
@@ -388,23 +398,43 @@ class AsmPrinter : public MachineFunctionPass {
388398
// MachineFunctionPass Implementation.
389399
//===------------------------------------------------------------------===//
390400

401+
virtual StringRef getPassName() const override;
402+
391403
/// Record analysis usage.
392-
void getAnalysisUsage(AnalysisUsage &AU) const override;
404+
virtual void getAnalysisUsage(AnalysisUsage &AU) const override;
393405

394406
/// Set up the AsmPrinter when we are working on a new module. If your pass
395407
/// overrides this, it must make sure to explicitly call this implementation.
396-
bool doInitialization(Module &M) override;
408+
/// TODO: Keep only the new pass manager doInitialization.
409+
virtual bool doInitialization(Module &M) override;
410+
virtual void doInitialization(Module &M, ModuleAnalysisManager &MAM) {
411+
this->MAM = &MAM;
412+
doInitialization(M);
413+
this->MAM = nullptr;
414+
}
397415

398416
/// Shut down the asmprinter. If you override this in your pass, you must make
399417
/// sure to call it explicitly.
400-
bool doFinalization(Module &M) override;
418+
/// TODO: Keep only the new pass manager doFinalization.
419+
virtual bool doFinalization(Module &M) override;
420+
virtual void doFinalization(Module &M, ModuleAnalysisManager &MAM) {
421+
this->MAM = &MAM;
422+
doFinalization(M);
423+
this->MAM = nullptr;
424+
}
401425

402426
/// Emit the specified function out to the OutStreamer.
403-
bool runOnMachineFunction(MachineFunction &MF) override {
427+
/// TODO: Keep only the new pass manager run.
428+
virtual bool runOnMachineFunction(MachineFunction &MF) override {
404429
SetupMachineFunction(MF);
405430
emitFunctionBody();
406431
return false;
407432
}
433+
virtual void run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) {
434+
this->MFAM = &MFAM;
435+
SetupMachineFunction(MF);
436+
emitFunctionBody();
437+
}
408438

409439
//===------------------------------------------------------------------===//
410440
// Coarse grained IR lowering routines.
@@ -539,6 +569,7 @@ class AsmPrinter : public MachineFunctionPass {
539569

540570
/// Emit the stack maps.
541571
void emitStackMaps();
572+
void emitStackMaps(Module &M); // For new pass manager version.
542573

543574
//===------------------------------------------------------------------===//
544575
// Overridable Hooks
@@ -948,6 +979,43 @@ class AsmPrinter : public MachineFunctionPass {
948979
}
949980
};
950981

982+
class AsmPrinterInitializePass
983+
: public PassInfoMixin<AsmPrinterInitializePass> {
984+
IntrusiveRefCntPtr<AsmPrinter> Printer;
985+
986+
public:
987+
AsmPrinterInitializePass(IntrusiveRefCntPtr<AsmPrinter> Printer)
988+
: Printer(Printer) {}
989+
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM) {
990+
Printer->doInitialization(M, MAM);
991+
return PreservedAnalyses::all();
992+
}
993+
};
994+
995+
class AsmPrinterPass : public PassInfoMixin<AsmPrinterPass> {
996+
IntrusiveRefCntPtr<AsmPrinter> Printer;
997+
998+
public:
999+
AsmPrinterPass(IntrusiveRefCntPtr<AsmPrinter> Printer) : Printer(Printer) {}
1000+
PreservedAnalyses run(MachineFunction &MF,
1001+
MachineFunctionAnalysisManager &MFAM) {
1002+
Printer->run(MF, MFAM);
1003+
return PreservedAnalyses::all();
1004+
}
1005+
};
1006+
1007+
class AsmPrinterFinalizePass : public PassInfoMixin<AsmPrinterFinalizePass> {
1008+
IntrusiveRefCntPtr<AsmPrinter> Printer;
1009+
1010+
public:
1011+
AsmPrinterFinalizePass(IntrusiveRefCntPtr<AsmPrinter> Printer)
1012+
: Printer(Printer) {}
1013+
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM) {
1014+
Printer->doFinalization(M, MAM);
1015+
return PreservedAnalyses::all();
1016+
}
1017+
};
1018+
9511019
} // end namespace llvm
9521020

9531021
#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
@@ -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/BranchFoldingPass.h"
2728
#include "llvm/CodeGen/CallBrPrepare.h"
@@ -103,6 +104,8 @@
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 {
560564
template <typename Derived, typename TargetMachineT>
561565
Error 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());

llvm/include/llvm/Target/TargetMachine.h

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

477477
virtual Error buildCodeGenPipeline(ModulePassManager &, raw_pwrite_stream &,
478478
raw_pwrite_stream *, CodeGenFileType,
479-
const CGPassBuilderOption &,
479+
const CGPassBuilderOption &, MCContext &,
480480
PassInstrumentationCallbacks *) {
481481
return make_error<StringError>("buildCodeGenPipeline is not overridden",
482482
inconvertibleErrorCode());

0 commit comments

Comments
 (0)