diff options
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser/MIRParser.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIRParser.cpp | 48 |
1 files changed, 36 insertions, 12 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp index 4d9a8dc..b65fc8c 100644 --- a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp @@ -21,6 +21,7 @@ #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFunctionAnalysis.h" #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/TargetFrameLowering.h" @@ -97,13 +98,15 @@ public: /// Create an empty function with the given name. Function *createDummyFunction(StringRef Name, Module &M); - bool parseMachineFunctions(Module &M, MachineModuleInfo &MMI); + bool parseMachineFunctions(Module &M, MachineModuleInfo &MMI, + ModuleAnalysisManager *FAM = nullptr); /// Parse the machine function in the current YAML document. /// /// /// Return true if an error occurred. - bool parseMachineFunction(Module &M, MachineModuleInfo &MMI); + bool parseMachineFunction(Module &M, MachineModuleInfo &MMI, + ModuleAnalysisManager *FAM); /// Initialize the machine function to the state that's described in the MIR /// file. @@ -275,13 +278,14 @@ MIRParserImpl::parseIRModule(DataLayoutCallbackTy DataLayoutCallback) { return M; } -bool MIRParserImpl::parseMachineFunctions(Module &M, MachineModuleInfo &MMI) { +bool MIRParserImpl::parseMachineFunctions(Module &M, MachineModuleInfo &MMI, + ModuleAnalysisManager *MAM) { if (NoMIRDocuments) return false; // Parse the machine functions. do { - if (parseMachineFunction(M, MMI)) + if (parseMachineFunction(M, MMI, MAM)) return true; In.nextDocument(); } while (In.setCurrentDocument()); @@ -303,7 +307,8 @@ Function *MIRParserImpl::createDummyFunction(StringRef Name, Module &M) { return F; } -bool MIRParserImpl::parseMachineFunction(Module &M, MachineModuleInfo &MMI) { +bool MIRParserImpl::parseMachineFunction(Module &M, MachineModuleInfo &MMI, + ModuleAnalysisManager *MAM) { // Parse the yaml. yaml::MachineFunction YamlMF; yaml::EmptyContext Ctx; @@ -327,14 +332,28 @@ bool MIRParserImpl::parseMachineFunction(Module &M, MachineModuleInfo &MMI) { "' isn't defined in the provided LLVM IR"); } } - if (MMI.getMachineFunction(*F) != nullptr) - return error(Twine("redefinition of machine function '") + FunctionName + - "'"); - // Create the MachineFunction. - MachineFunction &MF = MMI.getOrCreateMachineFunction(*F); - if (initializeMachineFunction(YamlMF, MF)) - return true; + if (!MAM) { + if (MMI.getMachineFunction(*F) != nullptr) + return error(Twine("redefinition of machine function '") + FunctionName + + "'"); + + // Create the MachineFunction. + MachineFunction &MF = MMI.getOrCreateMachineFunction(*F); + if (initializeMachineFunction(YamlMF, MF)) + return true; + } else { + auto &FAM = + MAM->getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); + if (FAM.getCachedResult<MachineFunctionAnalysis>(*F)) + return error(Twine("redefinition of machine function '") + FunctionName + + "'"); + + // Create the MachineFunction. + MachineFunction &MF = FAM.getResult<MachineFunctionAnalysis>(*F).getMF(); + if (initializeMachineFunction(YamlMF, MF)) + return true; + } return false; } @@ -1101,6 +1120,11 @@ bool MIRParser::parseMachineFunctions(Module &M, MachineModuleInfo &MMI) { return Impl->parseMachineFunctions(M, MMI); } +bool MIRParser::parseMachineFunctions(Module &M, ModuleAnalysisManager &MAM) { + auto &MMI = MAM.getResult<MachineModuleAnalysis>(M).getMMI(); + return Impl->parseMachineFunctions(M, MMI, &MAM); +} + std::unique_ptr<MIRParser> llvm::createMIRParserFromFile( StringRef Filename, SMDiagnostic &Error, LLVMContext &Context, std::function<void(Function &)> ProcessIRFunction) { |