21
21
#include " llvm/BinaryFormat/Dwarf.h"
22
22
#include " llvm/CodeGen/DwarfStringPoolEntry.h"
23
23
#include " llvm/CodeGen/MachineFunctionPass.h"
24
+ #include " llvm/CodeGen/MachinePassManager.h"
24
25
#include " llvm/CodeGen/StackMaps.h"
25
26
#include " llvm/DebugInfo/CodeView/CodeView.h"
26
27
#include " llvm/IR/InlineAsm.h"
@@ -83,7 +84,7 @@ class RemarkStreamer;
83
84
}
84
85
85
86
// / This class is intended to be used as a driving class for all asm writers.
86
- class AsmPrinter : public MachineFunctionPass {
87
+ class AsmPrinter {
87
88
public:
88
89
// / Target machine description.
89
90
TargetMachine &TM;
@@ -179,8 +180,6 @@ class AsmPrinter : public MachineFunctionPass {
179
180
// / List of symbols to be inserted into PC sections.
180
181
DenseMap<const MDNode *, SmallVector<const MCSymbol *>> PCSectionsSymbols;
181
182
182
- static char ID;
183
-
184
183
protected:
185
184
MCSymbol *CurrentFnBegin = nullptr ;
186
185
@@ -198,6 +197,10 @@ class AsmPrinter : public MachineFunctionPass {
198
197
199
198
StackMaps SM;
200
199
200
+ MachineFunctionPass *P = nullptr ;
201
+ ModuleAnalysisManager *MAM = nullptr ;
202
+ MachineFunctionAnalysisManager *MFAM = nullptr ;
203
+
201
204
private:
202
205
// / If generated on the fly this own the instance.
203
206
std::unique_ptr<MachineDominatorTree> OwnedMDT;
@@ -229,7 +232,7 @@ class AsmPrinter : public MachineFunctionPass {
229
232
explicit AsmPrinter (TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer);
230
233
231
234
public:
232
- ~AsmPrinter () override ;
235
+ virtual ~AsmPrinter ();
233
236
234
237
DwarfDebug *getDwarfDebug () { return DD; }
235
238
DwarfDebug *getDwarfDebug () const { return DD; }
@@ -369,24 +372,36 @@ class AsmPrinter : public MachineFunctionPass {
369
372
// MachineFunctionPass Implementation.
370
373
// ===------------------------------------------------------------------===//
371
374
375
+ virtual StringRef getPassName () const ;
376
+
372
377
// / Record analysis usage.
373
- void getAnalysisUsage (AnalysisUsage &AU) const override ;
378
+ virtual void getAnalysisUsage (AnalysisUsage &AU) const ;
374
379
375
380
// / Set up the AsmPrinter when we are working on a new module. If your pass
376
381
// / overrides this, it must make sure to explicitly call this implementation.
377
- bool doInitialization (Module &M) override ;
382
+ virtual bool doInitialization (Module &M);
378
383
379
384
// / Shut down the asmprinter. If you override this in your pass, you must make
380
385
// / sure to call it explicitly.
381
- bool doFinalization (Module &M) override ;
386
+ virtual bool doFinalization (Module &M);
382
387
383
388
// / Emit the specified function out to the OutStreamer.
384
- bool runOnMachineFunction (MachineFunction &MF) override {
389
+ virtual bool runOnMachineFunction (MachineFunction &MF) {
385
390
SetupMachineFunction (MF);
386
391
emitFunctionBody ();
387
392
return false ;
388
393
}
389
394
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
+
390
405
// ===------------------------------------------------------------------===//
391
406
// Coarse grained IR lowering routines.
392
407
// ===------------------------------------------------------------------===//
@@ -514,6 +529,7 @@ class AsmPrinter : public MachineFunctionPass {
514
529
515
530
// / Emit the stack maps.
516
531
void emitStackMaps ();
532
+ void emitStackMaps (Module &M); // For new pass manager version.
517
533
518
534
// ===------------------------------------------------------------------===//
519
535
// Overridable Hooks
@@ -905,6 +921,78 @@ class AsmPrinter : public MachineFunctionPass {
905
921
}
906
922
};
907
923
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
+
908
996
} // end namespace llvm
909
997
910
998
#endif // LLVM_CODEGEN_ASMPRINTER_H
0 commit comments