[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