[llvm] r277257 - [Orc] Add support for updating stub targets to CompileOnDemandLayer.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 29 17:57:54 PDT 2016
Author: lhames
Date: Fri Jul 29 19:57:54 2016
New Revision: 277257
URL: http://llvm.org/viewvc/llvm-project?rev=277257&view=rev
Log:
[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!
Modified:
llvm/trunk/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h
llvm/trunk/include/llvm/ExecutionEngine/Orc/LogicalDylib.h
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h?rev=277257&r1=277256&r2=277257&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h Fri Jul 29 19:57:54 2016
@@ -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>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/LogicalDylib.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LogicalDylib.h?rev=277257&r1=277256&r2=277257&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/LogicalDylib.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/LogicalDylib.h Fri Jul 29 19:57:54 2016
@@ -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;
More information about the llvm-commits
mailing list