forked from OSchip/llvm-project
[Orc] Add support for updating stub targets to CompileOnDemandLayer.
This makes it possible to implement re-optimization on top of the CompileOnDemandLayer. Test case to come in a future patch: This will need an execution test, and execution tests require a full working stack. The best option is to plumb this API up to the C Bindings stack and add a C bindings test for this. Patch by Sean Ogden. Thanks Sean! llvm-svn: 277257
This commit is contained in:
parent
bc1b58d086
commit
c31d594228
|
@ -236,6 +236,32 @@ public:
|
|||
return H->findSymbol(Name, ExportedSymbolsOnly);
|
||||
}
|
||||
|
||||
/// @brief Update the stub for the given function to point at FnBodyAddr.
|
||||
/// This can be used to support re-optimization.
|
||||
/// @return true if the function exists and the stub is updated, false
|
||||
/// otherwise.
|
||||
//
|
||||
// FIXME: We should track and free associated resources (unused compile
|
||||
// callbacks, uncompiled IR, and no-longer-needed/reachable function
|
||||
// implementations).
|
||||
// FIXME: Return Error once the JIT APIs are Errorized.
|
||||
bool updatePointer(std::string FuncName, TargetAddress FnBodyAddr) {
|
||||
//Find out which logical dylib contains our symbol
|
||||
auto LDI = LogicalDylibs.begin();
|
||||
for (auto LDE = LogicalDylibs.end(); LDI != LDE; ++LDI) {
|
||||
if (auto LMResources = LDI->getLogicalModuleResourcesForSymbol(FuncName, false)) {
|
||||
Module &SrcM = LMResources->SourceModule->getResource();
|
||||
std::string CalledFnName = mangle(FuncName, SrcM.getDataLayout());
|
||||
if (auto EC = LMResources->StubsMgr->updatePointer(CalledFnName, FnBodyAddr)) {
|
||||
return false;
|
||||
}
|
||||
else
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
template <typename ModulePtrT>
|
||||
|
|
|
@ -123,6 +123,16 @@ public:
|
|||
|
||||
LogicalDylibResources& getDylibResources() { return DylibResources; }
|
||||
|
||||
LogicalModuleResources*
|
||||
getLogicalModuleResourcesForSymbol(const std::string &Name,
|
||||
bool ExportedSymbolsOnly) {
|
||||
for (auto LMI = LogicalModules.begin(), LME = LogicalModules.end();
|
||||
LMI != LME; ++LMI)
|
||||
if (auto Sym = LMI->Resources.findSymbol(Name, ExportedSymbolsOnly))
|
||||
return &LMI->Resources;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
protected:
|
||||
BaseLayerT BaseLayer;
|
||||
LogicalModuleList LogicalModules;
|
||||
|
|
Loading…
Reference in New Issue