[llvm] r229973 - [Orc] Add a new JITSymbol constructor to build a symbol from an existing address.

Lang Hames lhames at gmail.com
Thu Feb 19 22:48:29 PST 2015


Author: lhames
Date: Fri Feb 20 00:48:29 2015
New Revision: 229973

URL: http://llvm.org/viewvc/llvm-project?rev=229973&view=rev
Log:
[Orc] Add a new JITSymbol constructor to build a symbol from an existing address.

This constructor is more efficient for symbols that have already been emitted,
since it avoids the construction/execution of a std::function.

Update the ObjectLinkingLayer to use this new constructor where possible.


Modified:
    llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h
    llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h

Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h?rev=229973&r1=229972&r2=229973&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h Fri Feb 20 00:48:29 2015
@@ -28,10 +28,25 @@ class JITSymbol {
 public:
   typedef std::function<TargetAddress()> GetAddressFtor;
 
+  /// @brief Create a 'null' symbol that represents failure to find a symbol
+  ///        definition.
   JITSymbol(std::nullptr_t) : CachedAddr(0) {}
 
+  /// @brief Create a symbol for a definition with a known address.
+  JITSymbol(TargetAddress Addr)
+    : CachedAddr(Addr) {}
+
+  /// @brief Create a symbol for a definition that doesn't have a known address
+  ///        yet.
+  /// @param GetAddress A functor to materialize a definition (fixing the
+  ///        address) on demand.
+  ///
+  ///   This constructor allows a JIT layer to provide a reference to a symbol
+  /// definition without actually materializing the definition up front. The
+  /// user can materialize the definition at any time by calling the getAddress
+  /// method.
   JITSymbol(GetAddressFtor GetAddress)
-      : CachedAddr(0), GetAddress(std::move(GetAddress)) {}
+    : CachedAddr(0), GetAddress(std::move(GetAddress)) {}
 
   /// @brief Returns true if the symbol exists, false otherwise.
   explicit operator bool() const { return CachedAddr || GetAddress; }

Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h?rev=229973&r1=229972&r2=229973&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h Fri Feb 20 00:48:29 2015
@@ -213,16 +213,27 @@ public:
   ///         given object set.
   JITSymbol findSymbolIn(ObjSetHandleT H, StringRef Name,
                          bool ExportedSymbolsOnly) {
-    if (auto Addr = H->getSymbolAddress(Name, ExportedSymbolsOnly))
-      return JITSymbol(
-        [this, Addr, H](){
-          if (H->NeedsFinalization()) {
-            H->Finalize();
-            if (NotifyFinalized)
-              NotifyFinalized(H);
-          }
-          return Addr;
-        });
+    if (auto Addr = H->getSymbolAddress(Name, ExportedSymbolsOnly)) {
+      if (!H->NeedsFinalization()) {
+        // If this instance has already been finalized then we can just return
+        // the address.
+        return JITSymbol(Addr);
+      } else {
+        // If this instance needs finalization return a functor that will do it.
+        // The functor still needs to double-check whether finalization is
+        // required, in case someone else finalizes this set before the functor
+        // is called.
+        return JITSymbol(
+          [this, Addr, H]() {
+            if (H->NeedsFinalization()) {
+              H->Finalize();
+              if (NotifyFinalized)
+                NotifyFinalized(H);
+            }
+            return Addr;
+          });
+      }
+    }
 
     return nullptr;
   }





More information about the llvm-commits mailing list