forked from OSchip/llvm-project
Add MachineModuleInfo constructor with external MCContext
Adds a constructor to MachineModuleInfo and MachineModuleInfoWapperPass that takes an external MCContext. If provided, the external context will be used throughout codegen instead of MMI's default one. This enables external drivers to take ownership of data put on the MMI's context during codegen. The internal context is used otherwise and destroyed upon finish. Differential Revision: https://reviews.llvm.org/D91313
This commit is contained in:
parent
173bb3c2eb
commit
d4ba5e15f4
|
@ -83,6 +83,9 @@ class MachineModuleInfo {
|
||||||
|
|
||||||
/// This is the MCContext used for the entire code generator.
|
/// This is the MCContext used for the entire code generator.
|
||||||
MCContext Context;
|
MCContext Context;
|
||||||
|
// This is an external context, that if assigned, will be used instead of the
|
||||||
|
// internal context.
|
||||||
|
MCContext *ExternalContext = nullptr;
|
||||||
|
|
||||||
/// This is the LLVM Module being worked on.
|
/// This is the LLVM Module being worked on.
|
||||||
const Module *TheModule;
|
const Module *TheModule;
|
||||||
|
@ -149,6 +152,9 @@ class MachineModuleInfo {
|
||||||
public:
|
public:
|
||||||
explicit MachineModuleInfo(const LLVMTargetMachine *TM = nullptr);
|
explicit MachineModuleInfo(const LLVMTargetMachine *TM = nullptr);
|
||||||
|
|
||||||
|
explicit MachineModuleInfo(const LLVMTargetMachine *TM,
|
||||||
|
MCContext *ExtContext);
|
||||||
|
|
||||||
MachineModuleInfo(MachineModuleInfo &&MMII);
|
MachineModuleInfo(MachineModuleInfo &&MMII);
|
||||||
|
|
||||||
~MachineModuleInfo();
|
~MachineModuleInfo();
|
||||||
|
@ -158,8 +164,12 @@ public:
|
||||||
|
|
||||||
const LLVMTargetMachine &getTarget() const { return TM; }
|
const LLVMTargetMachine &getTarget() const { return TM; }
|
||||||
|
|
||||||
const MCContext &getContext() const { return Context; }
|
const MCContext &getContext() const {
|
||||||
MCContext &getContext() { return Context; }
|
return ExternalContext ? *ExternalContext : Context;
|
||||||
|
}
|
||||||
|
MCContext &getContext() {
|
||||||
|
return ExternalContext ? *ExternalContext : Context;
|
||||||
|
}
|
||||||
|
|
||||||
const Module *getModule() const { return TheModule; }
|
const Module *getModule() const { return TheModule; }
|
||||||
|
|
||||||
|
@ -266,6 +276,9 @@ public:
|
||||||
static char ID; // Pass identification, replacement for typeid
|
static char ID; // Pass identification, replacement for typeid
|
||||||
explicit MachineModuleInfoWrapperPass(const LLVMTargetMachine *TM = nullptr);
|
explicit MachineModuleInfoWrapperPass(const LLVMTargetMachine *TM = nullptr);
|
||||||
|
|
||||||
|
explicit MachineModuleInfoWrapperPass(const LLVMTargetMachine *TM,
|
||||||
|
MCContext *ExtContext);
|
||||||
|
|
||||||
// Initialization and Finalization
|
// Initialization and Finalization
|
||||||
bool doInitialization(Module &) override;
|
bool doInitialization(Module &) override;
|
||||||
bool doFinalization(Module &) override;
|
bool doFinalization(Module &) override;
|
||||||
|
|
|
@ -170,6 +170,7 @@ void MachineModuleInfo::finalize() {
|
||||||
AddrLabelSymbols = nullptr;
|
AddrLabelSymbols = nullptr;
|
||||||
|
|
||||||
Context.reset();
|
Context.reset();
|
||||||
|
// We don't clear the ExternalContext.
|
||||||
|
|
||||||
delete ObjFileMMI;
|
delete ObjFileMMI;
|
||||||
ObjFileMMI = nullptr;
|
ObjFileMMI = nullptr;
|
||||||
|
@ -187,6 +188,7 @@ MachineModuleInfo::MachineModuleInfo(MachineModuleInfo &&MMI)
|
||||||
HasSplitStack = MMI.HasSplitStack;
|
HasSplitStack = MMI.HasSplitStack;
|
||||||
HasNosplitStack = MMI.HasNosplitStack;
|
HasNosplitStack = MMI.HasNosplitStack;
|
||||||
AddrLabelSymbols = MMI.AddrLabelSymbols;
|
AddrLabelSymbols = MMI.AddrLabelSymbols;
|
||||||
|
ExternalContext = MMI.ExternalContext;
|
||||||
TheModule = MMI.TheModule;
|
TheModule = MMI.TheModule;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,6 +198,14 @@ MachineModuleInfo::MachineModuleInfo(const LLVMTargetMachine *TM)
|
||||||
initialize();
|
initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MachineModuleInfo::MachineModuleInfo(const LLVMTargetMachine *TM,
|
||||||
|
MCContext *ExtContext)
|
||||||
|
: TM(*TM), Context(TM->getMCAsmInfo(), TM->getMCRegisterInfo(),
|
||||||
|
TM->getObjFileLowering(), nullptr, nullptr, false),
|
||||||
|
ExternalContext(ExtContext) {
|
||||||
|
initialize();
|
||||||
|
}
|
||||||
|
|
||||||
MachineModuleInfo::~MachineModuleInfo() { finalize(); }
|
MachineModuleInfo::~MachineModuleInfo() { finalize(); }
|
||||||
|
|
||||||
//===- Address of Block Management ----------------------------------------===//
|
//===- Address of Block Management ----------------------------------------===//
|
||||||
|
@ -204,7 +214,7 @@ ArrayRef<MCSymbol *>
|
||||||
MachineModuleInfo::getAddrLabelSymbolToEmit(const BasicBlock *BB) {
|
MachineModuleInfo::getAddrLabelSymbolToEmit(const BasicBlock *BB) {
|
||||||
// Lazily create AddrLabelSymbols.
|
// Lazily create AddrLabelSymbols.
|
||||||
if (!AddrLabelSymbols)
|
if (!AddrLabelSymbols)
|
||||||
AddrLabelSymbols = new MMIAddrLabelMap(Context);
|
AddrLabelSymbols = new MMIAddrLabelMap(getContext());
|
||||||
return AddrLabelSymbols->getAddrLabelSymbolToEmit(const_cast<BasicBlock*>(BB));
|
return AddrLabelSymbols->getAddrLabelSymbolToEmit(const_cast<BasicBlock*>(BB));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,6 +306,12 @@ MachineModuleInfoWrapperPass::MachineModuleInfoWrapperPass(
|
||||||
initializeMachineModuleInfoWrapperPassPass(*PassRegistry::getPassRegistry());
|
initializeMachineModuleInfoWrapperPassPass(*PassRegistry::getPassRegistry());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MachineModuleInfoWrapperPass::MachineModuleInfoWrapperPass(
|
||||||
|
const LLVMTargetMachine *TM, MCContext *ExtContext)
|
||||||
|
: ImmutablePass(ID), MMI(TM, ExtContext) {
|
||||||
|
initializeMachineModuleInfoWrapperPassPass(*PassRegistry::getPassRegistry());
|
||||||
|
}
|
||||||
|
|
||||||
// Handle the Pass registration stuff necessary to use DataLayout's.
|
// Handle the Pass registration stuff necessary to use DataLayout's.
|
||||||
INITIALIZE_PASS(MachineModuleInfoWrapperPass, "machinemoduleinfo",
|
INITIALIZE_PASS(MachineModuleInfoWrapperPass, "machinemoduleinfo",
|
||||||
"Machine Module Information", false, false)
|
"Machine Module Information", false, false)
|
||||||
|
|
Loading…
Reference in New Issue