<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 9, 2015 at 5:33 PM, Eric Christopher <span dir="ltr"><<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: echristo<br>
Date: Mon Mar  9 19:33:27 2015<br>
New Revision: 231731<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=231731&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=231731&view=rev</a><br>
Log:<br>
Temporarily revert r231726 and r231724 as they're breaking the build.:<br>
<br>
Author: Lang Hames <<a href="mailto:lhames@gmail.com">lhames@gmail.com</a>><br>
Date:   Mon Mar 9 23:51:09 2015 +0000<br>
<br>
    [Orc][MCJIT][RuntimeDyld] Add header that was accidentally left out of r231724.<br>
<br>
Author: Lang Hames <<a href="mailto:lhames@gmail.com">lhames@gmail.com</a>><br>
Date:   Mon Mar 9 23:44:13 2015 +0000<br>
<br>
    [Orc][MCJIT][RuntimeDyld] Add symbol flags to symbols in RuntimeDyld. Thread the<br>
    new types through MCJIT and Orc.<br>
<br>
    In particular, add a 'weak' flag. When plumbed through RTDyldMemoryManager, this<br>
    will allow us to distinguish between weak and strong definitions and find the<br>
    right ones during symbol resolution.<br></blockquote><div><br>Looks like the op| & related functions just need to be marked inline.<br><br>Ben Kramer - another place/context where -Wmissing-prototype would help :)<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Removed:<br>
    llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h<br>
Modified:<br>
    llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h<br>
    llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h<br>
    llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp<br>
<br>
Removed: llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h?rev=231730&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h?rev=231730&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h (removed)<br>
@@ -1,81 +0,0 @@<br>
-//===------ JITSymbolFlags.h - Flags for symbols in the JIT -----*- C++ -*-===//<br>
-//<br>
-//                     The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-//<br>
-// Symbol flags for symbols in the JIT (e.g. weak, exported).<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-#ifndef LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H<br>
-#define LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H<br>
-<br>
-#include "llvm/IR/GlobalValue.h"<br>
-<br>
-namespace llvm {<br>
-<br>
-/// @brief Flags for symbols in the JIT.<br>
-enum class JITSymbolFlags : char {<br>
-  None = 0,<br>
-  Weak = 1U << 0,<br>
-  Exported = 1U << 1<br>
-};<br>
-<br>
-JITSymbolFlags operator|(JITSymbolFlags LHS, JITSymbolFlags RHS) {<br>
-  typedef std::underlying_type<JITSymbolFlags>::type UT;<br>
-  return static_cast<JITSymbolFlags>(<br>
-           static_cast<UT>(LHS) | static_cast<UT>(RHS));<br>
-}<br>
-<br>
-JITSymbolFlags& operator |=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {<br>
-  LHS = LHS | RHS;<br>
-  return LHS;<br>
-}<br>
-<br>
-JITSymbolFlags operator&(JITSymbolFlags LHS, JITSymbolFlags RHS) {<br>
-  typedef std::underlying_type<JITSymbolFlags>::type UT;<br>
-  return static_cast<JITSymbolFlags>(<br>
-           static_cast<UT>(LHS) & static_cast<UT>(RHS));<br>
-}<br>
-<br>
-JITSymbolFlags& operator &=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {<br>
-  LHS = LHS & RHS;<br>
-  return LHS;<br>
-}<br>
-<br>
-/// @brief Base class for symbols in the JIT.<br>
-class JITSymbolBase {<br>
-public:<br>
-  JITSymbolBase(JITSymbolFlags Flags) : Flags(Flags) {}<br>
-<br>
-  JITSymbolFlags getFlags() const { return Flags; }<br>
-<br>
-  bool isWeak() const {<br>
-    return (Flags & JITSymbolFlags::Weak) == JITSymbolFlags::Weak;<br>
-  }<br>
-<br>
-  bool isExported() const {<br>
-    return (Flags & JITSymbolFlags::Exported) == JITSymbolFlags::Exported;<br>
-  }<br>
-<br>
-  static JITSymbolFlags flagsFromGlobalValue(const GlobalValue &GV) {<br>
-    JITSymbolFlags Flags = JITSymbolFlags::None;<br>
-    if (GV.hasWeakLinkage())<br>
-      Flags |= JITSymbolFlags::Weak;<br>
-    if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())<br>
-      Flags |= JITSymbolFlags::Exported;<br>
-    return Flags;<br>
-<br>
-  }<br>
-<br>
-private:<br>
-  JITSymbolFlags Flags;<br>
-};<br>
-<br>
-} // end namespace llvm<br>
-<br>
-#endif<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h Mon Mar  9 19:33:27 2015<br>
@@ -14,7 +14,6 @@<br>
 #ifndef LLVM_EXECUTIONENGINE_ORC_JITSYMBOL_H<br>
 #define LLVM_EXECUTIONENGINE_ORC_JITSYMBOL_H<br>
<br>
-#include "llvm/ExecutionEngine/JITSymbolFlags.h"<br>
 #include "llvm/Support/DataTypes.h"<br>
 #include <cassert><br>
 #include <functional><br>
@@ -26,19 +25,17 @@ namespace orc {<br>
 typedef uint64_t TargetAddress;<br>
<br>
 /// @brief Represents a symbol in the JIT.<br>
-class JITSymbol : public JITSymbolBase {<br>
-public:<br>
-<br>
+class JITSymbol {<br>
+public:<br>
   typedef std::function<TargetAddress()> GetAddressFtor;<br>
<br>
   /// @brief Create a 'null' symbol that represents failure to find a symbol<br>
   ///        definition.<br>
-  JITSymbol(std::nullptr_t)<br>
-      : JITSymbolBase(JITSymbolFlags::None), CachedAddr(0) {}<br>
+  JITSymbol(std::nullptr_t) : CachedAddr(0) {}<br>
<br>
   /// @brief Create a symbol for a definition with a known address.<br>
-  JITSymbol(TargetAddress Addr, JITSymbolFlags Flags)<br>
-    : JITSymbolBase(Flags), CachedAddr(Addr) {}<br>
+  JITSymbol(TargetAddress Addr)<br>
+    : CachedAddr(Addr) {}<br>
<br>
   /// @brief Create a symbol for a definition that doesn't have a known address<br>
   ///        yet.<br>
@@ -49,8 +46,8 @@ public:<br>
   /// definition without actually materializing the definition up front. The<br>
   /// user can materialize the definition at any time by calling the getAddress<br>
   /// method.<br>
-  JITSymbol(GetAddressFtor GetAddress, JITSymbolFlags Flags)<br>
-      : JITSymbolBase(Flags), GetAddress(std::move(GetAddress)), CachedAddr(0) {}<br>
+  JITSymbol(GetAddressFtor GetAddress)<br>
+    : CachedAddr(0), GetAddress(std::move(GetAddress)) {}<br>
<br>
   /// @brief Returns true if the symbol exists, false otherwise.<br>
   explicit operator bool() const { return CachedAddr || GetAddress; }<br>
@@ -67,8 +64,8 @@ public:<br>
   }<br>
<br>
 private:<br>
-  GetAddressFtor GetAddress;<br>
   TargetAddress CachedAddr;<br>
+  GetAddressFtor GetAddress;<br>
 };<br>
<br>
 } // End namespace orc.<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h Mon Mar  9 19:33:27 2015<br>
@@ -45,25 +45,23 @@ private:<br>
     JITSymbol find(StringRef Name, bool ExportedSymbolsOnly, BaseLayerT &B) {<br>
       switch (EmitState) {<br>
       case NotEmitted:<br>
-        if (auto GV = searchGVs(Name, ExportedSymbolsOnly)) {<br>
+        if (provides(Name, ExportedSymbolsOnly)) {<br>
           // Create a std::string version of Name to capture here - the argument<br>
           // (a StringRef) may go away before the lambda is executed.<br>
           // FIXME: Use capture-init when we move to C++14.<br>
-          auto PName = Name;<br>
-          JITSymbolFlags Flags = JITSymbolBase::flagsFromGlobalValue(*GV);<br>
-          auto GetAddress =<br>
-            [this, ExportedSymbolsOnly, PName, &B]() -> TargetAddress {<br>
-              if (this->EmitState == Emitting)<br>
-                return 0;<br>
-              else if (this->EmitState == NotEmitted) {<br>
-                this->EmitState = Emitting;<br>
-                Handle = this->emitToBaseLayer(B);<br>
-                this->EmitState = Emitted;<br>
-              }<br>
-              auto Sym = B.findSymbolIn(Handle, PName, ExportedSymbolsOnly);<br>
-              return Sym.getAddress();<br>
-          };<br>
-          return JITSymbol(std::move(GetAddress), Flags);<br>
+          std::string PName = Name;<br>
+          return JITSymbol(<br>
+              [this, ExportedSymbolsOnly, PName, &B]() -> TargetAddress {<br>
+                if (this->EmitState == Emitting)<br>
+                  return 0;<br>
+                else if (this->EmitState == NotEmitted) {<br>
+                  this->EmitState = Emitting;<br>
+                  Handle = this->emitToBaseLayer(B);<br>
+                  this->EmitState = Emitted;<br>
+                }<br>
+                return B.findSymbolIn(Handle, PName, ExportedSymbolsOnly)<br>
+                          .getAddress();<br>
+              });<br>
         } else<br>
           return nullptr;<br>
       case Emitting:<br>
@@ -100,8 +98,7 @@ private:<br>
            std::unique_ptr<RTDyldMemoryManager> MM);<br>
<br>
   protected:<br>
-    virtual const GlobalValue* searchGVs(StringRef Name,<br>
-                                         bool ExportedSymbolsOnly) const = 0;<br>
+    virtual bool provides(StringRef Name, bool ExportedSymbolsOnly) const = 0;<br>
     virtual BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) = 0;<br>
<br>
   private:<br>
@@ -118,48 +115,46 @@ private:<br>
<br>
   protected:<br>
<br>
-    const GlobalValue* searchGVs(StringRef Name,<br>
-                                 bool ExportedSymbolsOnly) const override {<br>
+    BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) override {<br>
+      // We don't need the mangled names set any more: Once we've emitted this<br>
+      // to the base layer we'll just look for symbols there.<br>
+      MangledNames.reset();<br>
+      return BaseLayer.addModuleSet(std::move(Ms), std::move(MM));<br>
+    }<br>
+<br>
+    bool provides(StringRef Name, bool ExportedSymbolsOnly) const override {<br>
       // FIXME: We could clean all this up if we had a way to reliably demangle<br>
       //        names: We could just demangle name and search, rather than<br>
       //        mangling everything else.<br>
<br>
       // If we have already built the mangled name set then just search it.<br>
-      if (MangledSymbols) {<br>
-        auto VI = MangledSymbols->find(Name);<br>
-        if (VI == MangledSymbols->end())<br>
-          return nullptr;<br>
-        auto GV = VI->second;<br>
-        if (!ExportedSymbolsOnly || GV->hasDefaultVisibility())<br>
-          return GV;<br>
-        return nullptr;<br>
+      if (MangledNames) {<br>
+        auto VI = MangledNames->find(Name);<br>
+        if (VI == MangledNames->end())<br>
+          return false;<br>
+        return !ExportedSymbolsOnly || VI->second;<br>
       }<br>
<br>
       // If we haven't built the mangled name set yet, try to build it. As an<br>
       // optimization this will leave MangledNames set to nullptr if we find<br>
       // Name in the process of building the set.<br>
-      return buildMangledSymbols(Name, ExportedSymbolsOnly);<br>
-    }<br>
-<br>
-    BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) override {<br>
-      // We don't need the mangled names set any more: Once we've emitted this<br>
-      // to the base layer we'll just look for symbols there.<br>
-      MangledSymbols.reset();<br>
-      return BaseLayer.addModuleSet(std::move(Ms), std::move(MM));<br>
+      buildMangledNames(Name, ExportedSymbolsOnly);<br>
+      if (!MangledNames)<br>
+        return true;<br>
+      return false;<br>
     }<br>
<br>
   private:<br>
     // If the mangled name of the given GlobalValue matches the given search<br>
     // name (and its visibility conforms to the ExportedSymbolsOnly flag) then<br>
-    // return the symbol. Otherwise, add the mangled name to the Names map and<br>
-    // return nullptr.<br>
-    const GlobalValue* addGlobalValue(StringMap<const GlobalValue*> &Names,<br>
-                                      const GlobalValue &GV,<br>
-                                      const Mangler &Mang, StringRef SearchName,<br>
-                                      bool ExportedSymbolsOnly) const {<br>
+    // just return 'true'. Otherwise, add the mangled name to the Names map and<br>
+    // return 'false'.<br>
+    bool addGlobalValue(StringMap<bool> &Names, const GlobalValue &GV,<br>
+                        const Mangler &Mang, StringRef SearchName,<br>
+                        bool ExportedSymbolsOnly) const {<br>
       // Modules don't "provide" decls or common symbols.<br>
       if (GV.isDeclaration() || GV.hasCommonLinkage())<br>
-        return nullptr;<br>
+        return false;<br>
<br>
       // Mangle the GV name.<br>
       std::string MangledName;<br>
@@ -172,42 +167,39 @@ private:<br>
       // bail out early.<br>
       if (MangledName == SearchName)<br>
         if (!ExportedSymbolsOnly || GV.hasDefaultVisibility())<br>
-          return &GV;<br>
+          return true;<br>
<br>
       // Otherwise add this to the map for later.<br>
-      Names[MangledName] = &GV;<br>
-      return nullptr;<br>
+      Names[MangledName] = GV.hasDefaultVisibility();<br>
+      return false;<br>
     }<br>
<br>
-    // Build the MangledSymbols map. Bails out early (with MangledSymbols left set<br>
+    // Build the MangledNames map. Bails out early (with MangledNames left set<br>
     // to nullptr) if the given SearchName is found while building the map.<br>
-    const GlobalValue* buildMangledSymbols(StringRef SearchName,<br>
-                                           bool ExportedSymbolsOnly) const {<br>
-      assert(!MangledSymbols && "Mangled symbols map already exists?");<br>
+    void buildMangledNames(StringRef SearchName,<br>
+                           bool ExportedSymbolsOnly) const {<br>
+      assert(!MangledNames && "Mangled names map already exists?");<br>
<br>
-      auto Symbols = llvm::make_unique<StringMap<const GlobalValue*>>();<br>
+      auto Names = llvm::make_unique<StringMap<bool>>();<br>
<br>
       for (const auto &M : Ms) {<br>
         Mangler Mang(&M->getDataLayout());<br>
<br>
-        for (const auto &V : M->globals())<br>
-          if (auto GV = addGlobalValue(*Symbols, V, Mang, SearchName,<br>
-                                       ExportedSymbolsOnly))<br>
-            return GV;<br>
+        for (const auto &GV : M->globals())<br>
+          if (addGlobalValue(*Names, GV, Mang, SearchName, ExportedSymbolsOnly))<br>
+            return;<br>
<br>
         for (const auto &F : *M)<br>
-          if (auto GV = addGlobalValue(*Symbols, F, Mang, SearchName,<br>
-                                       ExportedSymbolsOnly))<br>
-            return GV;<br>
+          if (addGlobalValue(*Names, F, Mang, SearchName, ExportedSymbolsOnly))<br>
+            return;<br>
       }<br>
<br>
-      MangledSymbols = std::move(Symbols);<br>
-      return nullptr;<br>
+      MangledNames = std::move(Names);<br>
     }<br>
<br>
     ModuleSetT Ms;<br>
     std::unique_ptr<RTDyldMemoryManager> MM;<br>
-    mutable std::unique_ptr<StringMap<const GlobalValue*>> MangledSymbols;<br>
+    mutable std::unique_ptr<StringMap<bool>> MangledNames;<br>
   };<br>
<br>
   typedef std::list<std::unique_ptr<EmissionDeferredSet>> ModuleSetListT;<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h Mon Mar  9 19:33:27 2015<br>
@@ -51,8 +51,10 @@ protected:<br>
       return RTDyld->loadObject(Obj);<br>
     }<br>
<br>
-    RuntimeDyld::SymbolInfo getSymbol(StringRef Name) const {<br>
-      return RTDyld->getSymbol(Name);<br>
+    TargetAddress getSymbolAddress(StringRef Name, bool ExportedSymbolsOnly) {<br>
+      if (ExportedSymbolsOnly)<br>
+        return RTDyld->getExportedSymbolLoadAddress(Name);<br>
+      return RTDyld->getSymbolLoadAddress(Name);<br>
     }<br>
<br>
     bool NeedsFinalization() const { return (State == Raw); }<br>
@@ -212,32 +214,28 @@ public:<br>
   ///         given object set.<br>
   JITSymbol findSymbolIn(ObjSetHandleT H, StringRef Name,<br>
                          bool ExportedSymbolsOnly) {<br>
-    if (auto Sym = H->getSymbol(Name)) {<br>
-      if (Sym.isExported() || !ExportedSymbolsOnly) {<br>
-        auto Addr = Sym.getAddress();<br>
-        auto Flags = Sym.getFlags();<br>
-        if (!H->NeedsFinalization()) {<br>
-          // If this instance has already been finalized then we can just return<br>
-          // the address.<br>
-          return JITSymbol(Addr, Flags);<br>
-        } else {<br>
-          // If this instance needs finalization return a functor that will do<br>
-          // it. The functor still needs to double-check whether finalization is<br>
-          // required, in case someone else finalizes this set before the<br>
-          // functor is called.<br>
-          auto GetAddress =<br>
-            [this, Addr, H]() {<br>
-              if (H->NeedsFinalization()) {<br>
-                H->Finalize();<br>
-                if (NotifyFinalized)<br>
-                  NotifyFinalized(H);<br>
-              }<br>
-              return Addr;<br>
-            };<br>
-          return JITSymbol(std::move(GetAddress), Flags);<br>
-        }<br>
+    if (auto Addr = H->getSymbolAddress(Name, ExportedSymbolsOnly)) {<br>
+      if (!H->NeedsFinalization()) {<br>
+        // If this instance has already been finalized then we can just return<br>
+        // the address.<br>
+        return JITSymbol(Addr);<br>
+      } else {<br>
+        // If this instance needs finalization return a functor that will do it.<br>
+        // The functor still needs to double-check whether finalization is<br>
+        // required, in case someone else finalizes this set before the functor<br>
+        // is called.<br>
+        return JITSymbol(<br>
+          [this, Addr, H]() {<br>
+            if (H->NeedsFinalization()) {<br>
+              H->Finalize();<br>
+              if (NotifyFinalized)<br>
+                NotifyFinalized(H);<br>
+            }<br>
+            return Addr;<br>
+          });<br>
       }<br>
     }<br>
+<br>
     return nullptr;<br>
   }<br>
<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h Mon Mar  9 19:33:27 2015<br>
@@ -14,7 +14,6 @@<br>
 #ifndef LLVM_EXECUTIONENGINE_RUNTIMEDYLD_H<br>
 #define LLVM_EXECUTIONENGINE_RUNTIMEDYLD_H<br>
<br>
-#include "JITSymbolFlags.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/ExecutionEngine/RTDyldMemoryManager.h"<br>
 #include "llvm/Support/Memory.h"<br>
@@ -29,7 +28,7 @@ namespace object {<br>
<br>
 class RuntimeDyldImpl;<br>
 class RuntimeDyldCheckerImpl;<br>
-<br>
+<br>
 class RuntimeDyld {<br>
   friend class RuntimeDyldCheckerImpl;<br>
<br>
@@ -48,18 +47,6 @@ protected:<br>
   void reassignSectionAddress(unsigned SectionID, uint64_t Addr);<br>
 public:<br>
<br>
-  /// \brief Information about a named symbol.<br>
-  class SymbolInfo : public JITSymbolBase {<br>
-  public:<br>
-    SymbolInfo(std::nullptr_t) : JITSymbolBase(JITSymbolFlags::None), Address(0) {}<br>
-    SymbolInfo(uint64_t Address, JITSymbolFlags Flags)<br>
-      : JITSymbolBase(Flags), Address(Address) {}<br>
-    explicit operator bool() const { return Address != 0; }<br>
-    uint64_t getAddress() const { return Address; }<br>
-  private:<br>
-    uint64_t Address;<br>
-  };<br>
-<br>
   /// \brief Information about the loaded object.<br>
   class LoadedObjectInfo {<br>
     friend class RuntimeDyldImpl;<br>
@@ -92,11 +79,15 @@ public:<br>
   /// Get the address of our local copy of the symbol. This may or may not<br>
   /// be the address used for relocation (clients can copy the data around<br>
   /// and resolve relocatons based on where they put it).<br>
-  void *getSymbolLocalAddress(StringRef Name) const;<br>
+  void *getSymbolAddress(StringRef Name) const;<br>
<br>
-  /// Get the target address and flags for the named symbol.<br>
-  /// This address is the one used for relocation.<br>
-  SymbolInfo getSymbol(StringRef Name) const;<br>
+  /// Get the address of the target copy of the symbol (works for both exported<br>
+  /// and non-exported symbols). This is the address used for relocation.<br>
+  uint64_t getSymbolLoadAddress(StringRef Name) const;<br>
+<br>
+  /// Get the address of the target copy of the symbol (works for exported<br>
+  /// symbols only). This is the address used for relocation.<br>
+  uint64_t getExportedSymbolLoadAddress(StringRef Name) const;<br>
<br>
   /// Resolve the relocations for all symbols we currently know about.<br>
   void resolveRelocations();<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h Mon Mar  9 19:33:27 2015<br>
@@ -86,12 +86,12 @@ public:<br>
   /// \brief Returns the address of the requested section (or an error message<br>
   ///        in the second element of the pair if the address cannot be found).<br>
   ///<br>
-  /// if 'LocalAddress' is true, this returns the address of the section<br>
-  /// within the linker's memory. If 'LocalAddress' is false it returns the<br>
+  /// if 'LinkerAddress' is true, this returns the address of the section<br>
+  /// within the linker's memory. If 'LinkerAddress' is false it returns the<br>
   /// address within the target process (i.e. the load address).<br>
   std::pair<uint64_t, std::string> getSectionAddr(StringRef FileName,<br>
                                                   StringRef SectionName,<br>
-                                                  bool LocalAddress);<br>
+                                                  bool LinkerAddress);<br>
<br>
 private:<br>
   std::unique_ptr<RuntimeDyldCheckerImpl> Impl;<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Mon Mar  9 19:33:27 2015<br>
@@ -257,7 +257,7 @@ uint64_t MCJIT::getExistingSymbolAddress<br>
   Mangler Mang(TM->getDataLayout());<br>
   SmallString<128> FullName;<br>
   Mang.getNameWithPrefix(FullName, Name);<br>
-  return Dyld.getSymbol(FullName).getAddress();<br>
+  return Dyld.getSymbolLoadAddress(FullName);<br>
 }<br>
<br>
 Module *MCJIT::findModuleForSymbol(const std::string &Name,<br>
@@ -383,7 +383,7 @@ void *MCJIT::getPointerToFunction(Functi<br>
   //<br>
   // This is the accessor for the target address, so make sure to check the<br>
   // load address of the symbol, not the local address.<br>
-  return (void*)Dyld.getSymbol(Name).getAddress();<br>
+  return (void*)Dyld.getSymbolLoadAddress(Name);<br>
 }<br>
<br>
 void MCJIT::runStaticConstructorsDestructorsInModulePtrSet(<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Mon Mar  9 19:33:27 2015<br>
@@ -197,13 +197,10 @@ RuntimeDyldImpl::loadObjectImpl(const ob<br>
                      << " SID: " << SectionID << " Offset: "<br>
                      << format("%p", (uintptr_t)SectOffset)<br>
                      << " flags: " << Flags << "\n");<br>
-        JITSymbolFlags RTDyldSymFlags = JITSymbolFlags::None;<br>
-        if (Flags & SymbolRef::SF_Weak)<br>
-          RTDyldSymFlags |= JITSymbolFlags::Weak;<br>
-        if (Flags & SymbolRef::SF_Exported)<br>
-          RTDyldSymFlags |= JITSymbolFlags::Exported;<br>
-        GlobalSymbolTable[Name] =<br>
-          SymbolTableEntry(SectionID, SectOffset, RTDyldSymFlags);<br>
+        SymbolInfo::Visibility Vis =<br>
+          (Flags & SymbolRef::SF_Exported) ?<br>
+            SymbolInfo::Default : SymbolInfo::Hidden;<br>
+        GlobalSymbolTable[Name] = SymbolInfo(SectionID, SectOffset, Vis);<br>
       }<br>
     }<br>
   }<br>
@@ -528,15 +525,12 @@ void RuntimeDyldImpl::emitCommonSymbols(<br>
       Offset += AlignOffset;<br>
     }<br>
     uint32_t Flags = Sym.getFlags();<br>
-    JITSymbolFlags RTDyldSymFlags = JITSymbolFlags::None;<br>
-    if (Flags & SymbolRef::SF_Weak)<br>
-      RTDyldSymFlags |= JITSymbolFlags::Weak;<br>
-    if (Flags & SymbolRef::SF_Exported)<br>
-      RTDyldSymFlags |= JITSymbolFlags::Exported;<br>
+    SymbolInfo::Visibility Vis =<br>
+      (Flags & SymbolRef::SF_Exported) ?<br>
+        SymbolInfo::Default : SymbolInfo::Hidden;<br>
     DEBUG(dbgs() << "Allocating common symbol " << Name << " address "<br>
                  << format("%p", Addr) << "\n");<br>
-    GlobalSymbolTable[Name] =<br>
-      SymbolTableEntry(SectionID, Offset, RTDyldSymFlags);<br>
+    GlobalSymbolTable[Name] = SymbolInfo(SectionID, Offset, Vis);<br>
     Offset += Size;<br>
     Addr += Size;<br>
   }<br>
@@ -900,16 +894,22 @@ RuntimeDyld::loadObject(const ObjectFile<br>
   return Dyld->loadObject(Obj);<br>
 }<br>
<br>
-void *RuntimeDyld::getSymbolLocalAddress(StringRef Name) const {<br>
+void *RuntimeDyld::getSymbolAddress(StringRef Name) const {<br>
   if (!Dyld)<br>
     return nullptr;<br>
-  return Dyld->getSymbolLocalAddress(Name);<br>
+  return Dyld->getSymbolAddress(Name);<br>
 }<br>
<br>
-RuntimeDyld::SymbolInfo RuntimeDyld::getSymbol(StringRef Name) const {<br>
+uint64_t RuntimeDyld::getSymbolLoadAddress(StringRef Name) const {<br>
   if (!Dyld)<br>
-    return nullptr;<br>
-  return Dyld->getSymbol(Name);<br>
+    return 0;<br>
+  return Dyld->getSymbolLoadAddress(Name);<br>
+}<br>
+<br>
+uint64_t RuntimeDyld::getExportedSymbolLoadAddress(StringRef Name) const {<br>
+  if (!Dyld)<br>
+    return 0;<br>
+  return Dyld->getExportedSymbolLoadAddress(Name);<br>
 }<br>
<br>
 void RuntimeDyld::resolveRelocations() { Dyld->resolveRelocations(); }<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp Mon Mar  9 19:33:27 2015<br>
@@ -310,7 +310,7 @@ private:<br>
           "");<br>
<br>
     uint64_t SymbolAddr = PCtx.IsInsideLoad<br>
-                              ? Checker.getSymbolLocalAddr(Symbol)<br>
+                              ? Checker.getSymbolLinkerAddr(Symbol)<br>
                               : Checker.getSymbolRemoteAddr(Symbol);<br>
     uint64_t NextPC = SymbolAddr + InstSize;<br>
<br>
@@ -437,7 +437,7 @@ private:<br>
     // The value for the symbol depends on the context we're evaluating in:<br>
     // Inside a load this is the address in the linker's memory, outside a<br>
     // load it's the address in the target processes memory.<br>
-    uint64_t Value = PCtx.IsInsideLoad ? Checker.getSymbolLocalAddr(Symbol)<br>
+    uint64_t Value = PCtx.IsInsideLoad ? Checker.getSymbolLinkerAddr(Symbol)<br>
                                        : Checker.getSymbolRemoteAddr(Symbol);<br>
<br>
     // Looks like a plain symbol reference.<br>
@@ -727,17 +727,17 @@ bool RuntimeDyldCheckerImpl::checkAllRul<br>
 }<br>
<br>
 bool RuntimeDyldCheckerImpl::isSymbolValid(StringRef Symbol) const {<br>
-  return getRTDyld().getSymbolLocalAddress(Symbol) != nullptr;<br>
+  return getRTDyld().getSymbolAddress(Symbol) != nullptr;<br>
 }<br>
<br>
-uint64_t RuntimeDyldCheckerImpl::getSymbolLocalAddr(StringRef Symbol) const {<br>
+uint64_t RuntimeDyldCheckerImpl::getSymbolLinkerAddr(StringRef Symbol) const {<br>
   return static_cast<uint64_t>(<br>
-      reinterpret_cast<uintptr_t>(getRTDyld().getSymbolLocalAddress(Symbol)));<br>
+      reinterpret_cast<uintptr_t>(getRTDyld().getSymbolAddress(Symbol)));<br>
 }<br>
<br>
 uint64_t RuntimeDyldCheckerImpl::getSymbolRemoteAddr(StringRef Symbol) const {<br>
-  if (auto InternalSymbol = getRTDyld().getSymbol(Symbol))<br>
-    return InternalSymbol.getAddress();<br>
+  if (uint64_t InternalSymbolAddr = getRTDyld().getSymbolLoadAddress(Symbol))<br>
+      return InternalSymbolAddr;<br>
   return getRTDyld().MemMgr->getSymbolAddress(Symbol);<br>
 }<br>
<br>
@@ -929,6 +929,6 @@ bool RuntimeDyldChecker::checkAllRulesIn<br>
<br>
 std::pair<uint64_t, std::string><br>
 RuntimeDyldChecker::getSectionAddr(StringRef FileName, StringRef SectionName,<br>
-                                   bool LocalAddress) {<br>
-  return Impl->getSectionAddr(FileName, SectionName, LocalAddress);<br>
+                                   bool LinkerAddress) {<br>
+  return Impl->getSectionAddr(FileName, SectionName, LinkerAddress);<br>
 }<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h Mon Mar  9 19:33:27 2015<br>
@@ -42,7 +42,7 @@ private:<br>
   RuntimeDyldImpl &getRTDyld() const { return *RTDyld.Dyld; }<br>
<br>
   bool isSymbolValid(StringRef Symbol) const;<br>
-  uint64_t getSymbolLocalAddr(StringRef Symbol) const;<br>
+  uint64_t getSymbolLinkerAddr(StringRef Symbol) const;<br>
   uint64_t getSymbolRemoteAddr(StringRef Symbol) const;<br>
   uint64_t readMemoryAtAddr(uint64_t Addr, unsigned Size) const;<br>
<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h Mon Mar  9 19:33:27 2015<br>
@@ -164,24 +164,27 @@ public:<br>
   }<br>
 };<br>
<br>
-/// @brief Symbol info for RuntimeDyld.<br>
-class SymbolTableEntry : public JITSymbolBase {<br>
+/// @brief Symbol info for RuntimeDyld.<br>
+class SymbolInfo {<br>
 public:<br>
-  SymbolTableEntry()<br>
-    : JITSymbolBase(JITSymbolFlags::None), Offset(0), SectionID(0) {}<br>
+  typedef enum { Hidden = 0, Default = 1 } Visibility;<br>
<br>
-  SymbolTableEntry(unsigned SectionID, uint64_t Offset, JITSymbolFlags Flags)<br>
-    : JITSymbolBase(Flags), Offset(Offset), SectionID(SectionID) {}<br>
+  SymbolInfo() : Offset(0), SectionID(0), Vis(Hidden) {}<br>
+<br>
+  SymbolInfo(unsigned SectionID, uint64_t Offset, Visibility Vis)<br>
+    : Offset(Offset), SectionID(SectionID), Vis(Vis) {}<br>
<br>
   unsigned getSectionID() const { return SectionID; }<br>
   uint64_t getOffset() const { return Offset; }<br>
+  Visibility getVisibility() const { return Vis; }<br>
<br>
 private:<br>
   uint64_t Offset;<br>
-  unsigned SectionID;<br>
+  unsigned SectionID : 31;<br>
+  Visibility Vis : 1;<br>
 };<br>
<br>
-typedef StringMap<SymbolTableEntry> RTDyldSymbolTable;<br>
+typedef StringMap<SymbolInfo> RTDyldSymbolTable;<br>
<br>
 class RuntimeDyldImpl {<br>
   friend class RuntimeDyld::LoadedObjectInfo;<br>
@@ -391,7 +394,7 @@ public:<br>
   virtual std::unique_ptr<RuntimeDyld::LoadedObjectInfo><br>
   loadObject(const object::ObjectFile &Obj) = 0;<br>
<br>
-  uint8_t* getSymbolLocalAddress(StringRef Name) const {<br>
+  uint8_t* getSymbolAddress(StringRef Name) const {<br>
     // FIXME: Just look up as a function for now. Overly simple of course.<br>
     // Work in progress.<br>
     RTDyldSymbolTable::const_iterator pos = GlobalSymbolTable.find(Name);<br>
@@ -401,16 +404,24 @@ public:<br>
     return getSectionAddress(SymInfo.getSectionID()) + SymInfo.getOffset();<br>
   }<br>
<br>
-  RuntimeDyld::SymbolInfo getSymbol(StringRef Name) const {<br>
+  uint64_t getSymbolLoadAddress(StringRef Name) const {<br>
     // FIXME: Just look up as a function for now. Overly simple of course.<br>
     // Work in progress.<br>
     RTDyldSymbolTable::const_iterator pos = GlobalSymbolTable.find(Name);<br>
     if (pos == GlobalSymbolTable.end())<br>
-      return nullptr;<br>
-    const auto &SymEntry = pos->second;<br>
-    uint64_t TargetAddr =<br>
-      getSectionLoadAddress(SymEntry.getSectionID()) + SymEntry.getOffset();<br>
-    return RuntimeDyld::SymbolInfo(TargetAddr, SymEntry.getFlags());<br>
+      return 0;<br>
+    const auto &SymInfo = pos->second;<br>
+    return getSectionLoadAddress(SymInfo.getSectionID()) + SymInfo.getOffset();<br>
+  }<br>
+<br>
+  uint64_t getExportedSymbolLoadAddress(StringRef Name) const {<br>
+    RTDyldSymbolTable::const_iterator pos = GlobalSymbolTable.find(Name);<br>
+    if (pos == GlobalSymbolTable.end())<br>
+      return 0;<br>
+    const auto &SymInfo = pos->second;<br>
+    if (SymInfo.getVisibility() == SymbolInfo::Hidden)<br>
+      return 0;<br>
+    return getSectionLoadAddress(SymInfo.getSectionID()) + SymInfo.getOffset();<br>
   }<br>
<br>
   void resolveRelocations();<br>
<br>
Modified: llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp (original)<br>
+++ llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp Mon Mar  9 19:33:27 2015<br>
@@ -298,7 +298,7 @@ static int executeInput() {<br>
   // FIXME: Error out if there are unresolved relocations.<br>
<br>
   // Get the address of the entry point (_main by default).<br>
-  void *MainAddress = Dyld.getSymbolLocalAddress(EntryPoint);<br>
+  void *MainAddress = Dyld.getSymbolAddress(EntryPoint);<br>
   if (!MainAddress)<br>
     return Error("no definition for '" + EntryPoint + "'");<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>