diff --git a/llvm/include/llvm/CodeGen/MIRPrinter.h b/llvm/include/llvm/CodeGen/MIRPrinter.h index 37d9f8ff502db..5187ae8ed3cd4 100644 --- a/llvm/include/llvm/CodeGen/MIRPrinter.h +++ b/llvm/include/llvm/CodeGen/MIRPrinter.h @@ -49,8 +49,8 @@ void printMIR(raw_ostream &OS, const Module &M); /// Print a machine function using the MIR serialization format to the given /// output stream. -void printMIR(raw_ostream &OS, const MachineModuleInfo &MMI, - const MachineFunction &MF); +void printMIR(raw_ostream &OS, MachineModuleInfo *MMI, + FunctionAnalysisManager *MFA, const MachineFunction &MF); /// Determine a possible list of successors of a basic block based on the /// basic block machine operand being used inside the block. This should give diff --git a/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h b/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h index 3bf0fde1e26ef..df6488c0b0ed2 100644 --- a/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h +++ b/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h @@ -19,9 +19,12 @@ class MachineModuleInfo; class MachineFunction; class Module; +using MFGetterFnT = std::function; + class MachineModuleSlotTracker : public ModuleSlotTracker { const Function &TheFunction; - const MachineModuleInfo &TheMMI; + MFGetterFnT MachineFunctionGetterFn; + unsigned MDNStartSlot = 0, MDNEndSlot = 0; void processMachineFunctionMetadata(AbstractSlotTrackerStorage *AST, @@ -33,8 +36,7 @@ class MachineModuleSlotTracker : public ModuleSlotTracker { bool ShouldInitializeAllMetadata); public: - MachineModuleSlotTracker(const MachineModuleInfo &MMI, - const MachineFunction *MF, + MachineModuleSlotTracker(MFGetterFnT Fn, const MachineFunction *MF, bool ShouldInitializeAllMetadata = true); ~MachineModuleSlotTracker(); diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp index 368b9eb1ff469..a4861fbc38025 100644 --- a/llvm/lib/CodeGen/MIRPrinter.cpp +++ b/llvm/lib/CodeGen/MIRPrinter.cpp @@ -24,9 +24,11 @@ #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFunctionAnalysis.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineJumpTableInfo.h" #include "llvm/CodeGen/MachineMemOperand.h" +#include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/MachineModuleSlotTracker.h" #include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" @@ -103,8 +105,8 @@ struct MFPrintState { /// Synchronization scope names registered with LLVMContext. SmallVector SSNs; - MFPrintState(const MachineModuleInfo &MMI, const MachineFunction &MF) - : MST(MMI, &MF) {} + MFPrintState(MFGetterFnT Fn, const MachineFunction &MF) + : MST(std::move(Fn), &MF) {} }; } // end anonymous namespace @@ -168,9 +170,10 @@ static void convertCalledGlobals(yaml::MachineFunction &YMF, const MachineFunction &MF, MachineModuleSlotTracker &MST); -static void printMF(raw_ostream &OS, const MachineModuleInfo &MMI, +static void printMF(raw_ostream &OS, MFGetterFnT Fn, const MachineFunction &MF) { - MFPrintState State(MMI, MF); + MFPrintState State(std::move(Fn), MF); + State.RegisterMaskIds = initRegisterMaskIds(MF); yaml::MachineFunction YamlMF; @@ -983,11 +986,23 @@ void llvm::printMIR(raw_ostream &OS, const Module &M) { Out << const_cast(M); } -void llvm::printMIR(raw_ostream &OS, const MachineModuleInfo &MMI, - const MachineFunction &MF) { +void llvm::printMIR(raw_ostream &OS, MachineModuleInfo *MMI, + FunctionAnalysisManager *FAM, const MachineFunction &MF) { // RemoveDIs: as there's no textual form for DbgRecords yet, print debug-info // in dbg.value format. ScopedDbgInfoFormatSetter FormatSetter( const_cast(MF.getFunction()), UseNewDbgInfoFormat); - printMF(OS, MMI, MF); + if (MMI) { + printMF( + OS, [&](const Function &F) { return MMI->getMachineFunction(F); }, MF); + } else { + printMF( + OS, + [&](const Function &F) { + return &FAM->getResult( + const_cast(F)) + .getMF(); + }, + MF); + } } diff --git a/llvm/lib/CodeGen/MIRPrintingPass.cpp b/llvm/lib/CodeGen/MIRPrintingPass.cpp index 28aeb7f116c6c..f8215076ec009 100644 --- a/llvm/lib/CodeGen/MIRPrintingPass.cpp +++ b/llvm/lib/CodeGen/MIRPrintingPass.cpp @@ -27,12 +27,10 @@ PreservedAnalyses PrintMIRPreparePass::run(Module &M, ModuleAnalysisManager &) { PreservedAnalyses PrintMIRPass::run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) { - auto &MAMP = MFAM.getResult(MF); - Module *M = MF.getFunction().getParent(); - const MachineModuleInfo &MMI = - MAMP.getCachedResult(*M)->getMMI(); + auto &FAM = MFAM.getResult(MF) + .getManager(); - printMIR(OS, MMI, MF); + printMIR(OS, nullptr, &FAM, MF); return PreservedAnalyses::all(); } @@ -59,10 +57,10 @@ struct MIRPrintingPass : public MachineFunctionPass { std::string Str; raw_string_ostream StrOS(Str); - const MachineModuleInfo &MMI = - getAnalysis().getMMI(); + MachineModuleInfo *MMI = + &getAnalysis().getMMI(); - printMIR(StrOS, MMI, MF); + printMIR(StrOS, MMI, nullptr, MF); MachineFunctions.append(Str); return false; } diff --git a/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp b/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp index 8f10435e7998e..ad2a4acc690d4 100644 --- a/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp +++ b/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp @@ -39,7 +39,7 @@ void MachineModuleSlotTracker::processMachineModule( if (&F != &TheFunction) continue; MDNStartSlot = AST->getNextMetadataSlot(); - if (auto *MF = TheMMI.getMachineFunction(F)) + if (auto *MF = MachineFunctionGetterFn(F)) processMachineFunctionMetadata(AST, *MF); MDNEndSlot = AST->getNextMetadataSlot(); break; @@ -52,7 +52,7 @@ void MachineModuleSlotTracker::processMachineFunction( bool ShouldInitializeAllMetadata) { if (!ShouldInitializeAllMetadata && F == &TheFunction) { MDNStartSlot = AST->getNextMetadataSlot(); - if (auto *MF = TheMMI.getMachineFunction(*F)) + if (auto *MF = MachineFunctionGetterFn(*F)) processMachineFunctionMetadata(AST, *MF); MDNEndSlot = AST->getNextMetadataSlot(); } @@ -64,11 +64,10 @@ void MachineModuleSlotTracker::collectMachineMDNodes( } MachineModuleSlotTracker::MachineModuleSlotTracker( - const MachineModuleInfo &MMI, const MachineFunction *MF, - bool ShouldInitializeAllMetadata) + MFGetterFnT Fn, const MachineFunction *MF, bool ShouldInitializeAllMetadata) : ModuleSlotTracker(MF->getFunction().getParent(), ShouldInitializeAllMetadata), - TheFunction(MF->getFunction()), TheMMI(MMI) { + TheFunction(MF->getFunction()), MachineFunctionGetterFn(Fn) { setProcessHook([this](AbstractSlotTrackerStorage *AST, const Module *M, bool ShouldInitializeAllMetadata) { this->processMachineModule(AST, M, ShouldInitializeAllMetadata);