<div dir="ltr">Hi Lang,<br><br>This was still breaking the build even after the header fix in 231726 so I've gone ahead and reverted for now.<div><br></div><div><a href="http://lab.llvm.org:8011/builders/lld-x86_64-freebsd/builds/10710">http://lab.llvm.org:8011/builders/lld-x86_64-freebsd/builds/10710</a><br></div><div><br></div><div>seems like a reasonable buildbot to look at :)</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote">On Mon, Mar 9, 2015 at 4:49 PM Lang Hames <<a href="mailto:lhames@gmail.com">lhames@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: lhames<br>
Date: Mon Mar  9 18:44:13 2015<br>
New Revision: 231724<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=231724&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=231724&view=rev</a><br>
Log:<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>
<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/JITSymbol.<u></u>h<br>
    llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>LazyEmittingLayer.h<br>
    llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>ObjectLinkingLayer.h<br>
    llvm/trunk/include/llvm/<u></u>ExecutionEngine/RuntimeDyld.h<br>
    llvm/trunk/include/llvm/<u></u>ExecutionEngine/<u></u>RuntimeDyldChecker.h<br>
    llvm/trunk/lib/<u></u>ExecutionEngine/MCJIT/MCJIT.<u></u>cpp<br>
    llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyld.cpp<br>
    llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldChecker.cpp<br>
    llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldCheckerImpl.h<br>
    llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldImpl.h<br>
    llvm/trunk/tools/llvm-rtdyld/<u></u>llvm-rtdyld.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/JITSymbol.<u></u>h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/include/<u></u>llvm/ExecutionEngine/Orc/<u></u>JITSymbol.h?rev=231724&r1=<u></u>231723&r2=231724&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/JITSymbol.<u></u>h (original)<br>
+++ llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/JITSymbol.<u></u>h Mon Mar  9 18:44:13 2015<br>
@@ -14,6 +14,7 @@<br>
 #ifndef LLVM_EXECUTIONENGINE_ORC_<u></u>JITSYMBOL_H<br>
 #define LLVM_EXECUTIONENGINE_ORC_<u></u>JITSYMBOL_H<br>
<br>
+#include "llvm/ExecutionEngine/<u></u>JITSymbolFlags.h"<br>
 #include "llvm/Support/DataTypes.h"<br>
 #include <cassert><br>
 #include <functional><br>
@@ -25,17 +26,19 @@ namespace orc {<br>
 typedef uint64_t TargetAddress;<br>
<br>
 /// @brief Represents a symbol in the JIT.<br>
-class JITSymbol {<br>
-public:<br>
+class JITSymbol : public JITSymbolBase {<br>
+public:<br>
+<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) : CachedAddr(0) {}<br>
+  JITSymbol(std::nullptr_t)<br>
+      : JITSymbolBase(JITSymbolFlags::<u></u>None), CachedAddr(0) {}<br>
<br>
   /// @brief Create a symbol for a definition with a known address.<br>
-  JITSymbol(TargetAddress Addr)<br>
-    : CachedAddr(Addr) {}<br>
+  JITSymbol(TargetAddress Addr, JITSymbolFlags Flags)<br>
+    : JITSymbolBase(Flags), CachedAddr(Addr) {}<br>
<br>
   /// @brief Create a symbol for a definition that doesn't have a known address<br>
   ///        yet.<br>
@@ -46,8 +49,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)<br>
-    : CachedAddr(0), GetAddress(std::move(<u></u>GetAddress)) {}<br>
+  JITSymbol(GetAddressFtor GetAddress, JITSymbolFlags Flags)<br>
+      : JITSymbolBase(Flags), GetAddress(std::move(<u></u>GetAddress)), CachedAddr(0) {}<br>
<br>
   /// @brief Returns true if the symbol exists, false otherwise.<br>
   explicit operator bool() const { return CachedAddr || GetAddress; }<br>
@@ -64,8 +67,8 @@ public:<br>
   }<br>
<br>
 private:<br>
-  TargetAddress CachedAddr;<br>
   GetAddressFtor GetAddress;<br>
+  TargetAddress CachedAddr;<br>
 };<br>
<br>
 } // End namespace orc.<br>
<br>
Modified: llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>LazyEmittingLayer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/include/<u></u>llvm/ExecutionEngine/Orc/<u></u>LazyEmittingLayer.h?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>LazyEmittingLayer.h (original)<br>
+++ llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>LazyEmittingLayer.h Mon Mar  9 18:44:13 2015<br>
@@ -45,23 +45,25 @@ private:<br>
     JITSymbol find(StringRef Name, bool ExportedSymbolsOnly, BaseLayerT &B) {<br>
       switch (EmitState) {<br>
       case NotEmitted:<br>
-        if (provides(Name, ExportedSymbolsOnly)) {<br>
+        if (auto GV = searchGVs(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>
-          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>
+          auto PName = Name;<br>
+          JITSymbolFlags Flags = JITSymbolBase::<u></u>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(<u></u>GetAddress), Flags);<br>
         } else<br>
           return nullptr;<br>
       case Emitting:<br>
@@ -98,7 +100,8 @@ private:<br>
            std::unique_ptr<<u></u>RTDyldMemoryManager> MM);<br>
<br>
   protected:<br>
-    virtual bool provides(StringRef Name, bool ExportedSymbolsOnly) const = 0;<br>
+    virtual const GlobalValue* searchGVs(StringRef Name,<br>
+                                         bool ExportedSymbolsOnly) const = 0;<br>
     virtual BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) = 0;<br>
<br>
   private:<br>
@@ -115,46 +118,48 @@ private:<br>
<br>
   protected:<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>
-      MangledNames.reset();<br>
-      return BaseLayer.addModuleSet(std::<u></u>move(Ms), std::move(MM));<br>
-    }<br>
-<br>
-    bool provides(StringRef Name, bool ExportedSymbolsOnly) const override {<br>
+    const GlobalValue* searchGVs(StringRef Name,<br>
+                                 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 (MangledNames) {<br>
-        auto VI = MangledNames->find(Name);<br>
-        if (VI == MangledNames->end())<br>
-          return false;<br>
-        return !ExportedSymbolsOnly || VI->second;<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>
       }<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>
-      buildMangledNames(Name, ExportedSymbolsOnly);<br>
-      if (!MangledNames)<br>
-        return true;<br>
-      return false;<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::<u></u>move(Ms), std::move(MM));<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>
-    // 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>
+    // 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>
       // Modules don't "provide" decls or common symbols.<br>
       if (GV.isDeclaration() || GV.hasCommonLinkage())<br>
-        return false;<br>
+        return nullptr;<br>
<br>
       // Mangle the GV name.<br>
       std::string MangledName;<br>
@@ -167,39 +172,42 @@ private:<br>
       // bail out early.<br>
       if (MangledName == SearchName)<br>
         if (!ExportedSymbolsOnly || GV.hasDefaultVisibility())<br>
-          return true;<br>
+          return &GV;<br>
<br>
       // Otherwise add this to the map for later.<br>
-      Names[MangledName] = GV.hasDefaultVisibility();<br>
-      return false;<br>
+      Names[MangledName] = &GV;<br>
+      return nullptr;<br>
     }<br>
<br>
-    // Build the MangledNames map. Bails out early (with MangledNames left set<br>
+    // Build the MangledSymbols map. Bails out early (with MangledSymbols left set<br>
     // to nullptr) if the given SearchName is found while building the map.<br>
-    void buildMangledNames(StringRef SearchName,<br>
-                           bool ExportedSymbolsOnly) const {<br>
-      assert(!MangledNames && "Mangled names map already exists?");<br>
+    const GlobalValue* buildMangledSymbols(StringRef SearchName,<br>
+                                           bool ExportedSymbolsOnly) const {<br>
+      assert(!MangledSymbols && "Mangled symbols map already exists?");<br>
<br>
-      auto Names = llvm::make_unique<StringMap<<u></u>bool>>();<br>
+      auto Symbols = llvm::make_unique<StringMap<<u></u>const GlobalValue*>>();<br>
<br>
       for (const auto &M : Ms) {<br>
         Mangler Mang(&M->getDataLayout());<br>
<br>
-        for (const auto &GV : M->globals())<br>
-          if (addGlobalValue(*Names, GV, Mang, SearchName, ExportedSymbolsOnly))<br>
-            return;<br>
+        for (const auto &V : M->globals())<br>
+          if (auto GV = addGlobalValue(*Symbols, V, Mang, SearchName,<br>
+                                       ExportedSymbolsOnly))<br>
+            return GV;<br>
<br>
         for (const auto &F : *M)<br>
-          if (addGlobalValue(*Names, F, Mang, SearchName, ExportedSymbolsOnly))<br>
-            return;<br>
+          if (auto GV = addGlobalValue(*Symbols, F, Mang, SearchName,<br>
+                                       ExportedSymbolsOnly))<br>
+            return GV;<br>
       }<br>
<br>
-      MangledNames = std::move(Names);<br>
+      MangledSymbols = std::move(Symbols);<br>
+      return nullptr;<br>
     }<br>
<br>
     ModuleSetT Ms;<br>
     std::unique_ptr<<u></u>RTDyldMemoryManager> MM;<br>
-    mutable std::unique_ptr<StringMap<<u></u>bool>> MangledNames;<br>
+    mutable std::unique_ptr<StringMap<<u></u>const GlobalValue*>> MangledSymbols;<br>
   };<br>
<br>
   typedef std::list<std::unique_ptr<<u></u>EmissionDeferredSet>> ModuleSetListT;<br>
<br>
Modified: llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>ObjectLinkingLayer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/include/<u></u>llvm/ExecutionEngine/Orc/<u></u>ObjectLinkingLayer.h?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>ObjectLinkingLayer.h (original)<br>
+++ llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>ObjectLinkingLayer.h Mon Mar  9 18:44:13 2015<br>
@@ -51,10 +51,8 @@ protected:<br>
       return RTDyld->loadObject(Obj);<br>
     }<br>
<br>
-    TargetAddress getSymbolAddress(StringRef Name, bool ExportedSymbolsOnly) {<br>
-      if (ExportedSymbolsOnly)<br>
-        return RTDyld-><u></u>getExportedSymbolLoadAddress(<u></u>Name);<br>
-      return RTDyld->getSymbolLoadAddress(<u></u>Name);<br>
+    RuntimeDyld::SymbolInfo getSymbol(StringRef Name) const {<br>
+      return RTDyld->getSymbol(Name);<br>
     }<br>
<br>
     bool NeedsFinalization() const { return (State == Raw); }<br>
@@ -214,28 +212,32 @@ public:<br>
   ///         given object set.<br>
   JITSymbol findSymbolIn(ObjSetHandleT H, StringRef Name,<br>
                          bool ExportedSymbolsOnly) {<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>
+    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(<u></u>GetAddress), Flags);<br>
+        }<br>
       }<br>
     }<br>
-<br>
     return nullptr;<br>
   }<br>
<br>
<br>
Modified: llvm/trunk/include/llvm/<u></u>ExecutionEngine/RuntimeDyld.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/include/<u></u>llvm/ExecutionEngine/<u></u>RuntimeDyld.h?rev=231724&r1=<u></u>231723&r2=231724&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/include/llvm/<u></u>ExecutionEngine/RuntimeDyld.h (original)<br>
+++ llvm/trunk/include/llvm/<u></u>ExecutionEngine/RuntimeDyld.h Mon Mar  9 18:44:13 2015<br>
@@ -14,6 +14,7 @@<br>
 #ifndef LLVM_EXECUTIONENGINE_<u></u>RUNTIMEDYLD_H<br>
 #define LLVM_EXECUTIONENGINE_<u></u>RUNTIMEDYLD_H<br>
<br>
+#include "JITSymbolFlags.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/ExecutionEngine/<u></u>RTDyldMemoryManager.h"<br>
 #include "llvm/Support/Memory.h"<br>
@@ -28,7 +29,7 @@ namespace object {<br>
<br>
 class RuntimeDyldImpl;<br>
 class RuntimeDyldCheckerImpl;<br>
-<br>
+<br>
 class RuntimeDyld {<br>
   friend class RuntimeDyldCheckerImpl;<br>
<br>
@@ -47,6 +48,18 @@ protected:<br>
   void reassignSectionAddress(<u></u>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::<u></u>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>
@@ -79,15 +92,11 @@ 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 *getSymbolAddress(StringRef Name) const;<br>
+  void *getSymbolLocalAddress(<u></u>StringRef Name) const;<br>
<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(<u></u>StringRef Name) const;<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>
<br>
   /// Resolve the relocations for all symbols we currently know about.<br>
   void resolveRelocations();<br>
<br>
Modified: llvm/trunk/include/llvm/<u></u>ExecutionEngine/<u></u>RuntimeDyldChecker.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/include/<u></u>llvm/ExecutionEngine/<u></u>RuntimeDyldChecker.h?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/include/llvm/<u></u>ExecutionEngine/<u></u>RuntimeDyldChecker.h (original)<br>
+++ llvm/trunk/include/llvm/<u></u>ExecutionEngine/<u></u>RuntimeDyldChecker.h Mon Mar  9 18:44:13 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 'LinkerAddress' is true, this returns the address of the section<br>
-  /// within the linker's memory. If 'LinkerAddress' is false it returns the<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>
   /// 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 LinkerAddress);<br>
+                                                  bool LocalAddress);<br>
<br>
 private:<br>
   std::unique_ptr<<u></u>RuntimeDyldCheckerImpl> Impl;<br>
<br>
Modified: llvm/trunk/lib/<u></u>ExecutionEngine/MCJIT/MCJIT.<u></u>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>ExecutionEngine/MCJIT/MCJIT.<u></u>cpp?rev=231724&r1=231723&r2=<u></u>231724&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/<u></u>ExecutionEngine/MCJIT/MCJIT.<u></u>cpp (original)<br>
+++ llvm/trunk/lib/<u></u>ExecutionEngine/MCJIT/MCJIT.<u></u>cpp Mon Mar  9 18:44:13 2015<br>
@@ -257,7 +257,7 @@ uint64_t MCJIT::<u></u>getExistingSymbolAddress<br>
   Mangler Mang(TM->getDataLayout());<br>
   SmallString<128> FullName;<br>
   Mang.getNameWithPrefix(<u></u>FullName, Name);<br>
-  return Dyld.getSymbolLoadAddress(<u></u>FullName);<br>
+  return Dyld.getSymbol(FullName).<u></u>getAddress();<br>
 }<br>
<br>
 Module *MCJIT::findModuleForSymbol(<u></u>const std::string &Name,<br>
@@ -383,7 +383,7 @@ void *MCJIT::getPointerToFunction(<u></u>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.<u></u>getSymbolLoadAddress(Name);<br>
+  return (void*)Dyld.getSymbol(Name).<u></u>getAddress();<br>
 }<br>
<br>
 void MCJIT::<u></u>runStaticConstructorsDestructo<u></u>rsInModulePtrSet(<br>
<br>
Modified: llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyld.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyld.cpp?rev=231724&r1=<u></u>231723&r2=231724&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyld.cpp (original)<br>
+++ llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyld.cpp Mon Mar  9 18:44:13 2015<br>
@@ -197,10 +197,13 @@ RuntimeDyldImpl::<u></u>loadObjectImpl(const ob<br>
                      << " SID: " << SectionID << " Offset: "<br>
                      << format("%p", (uintptr_t)SectOffset)<br>
                      << " flags: " << Flags << "\n");<br>
-        SymbolInfo::Visibility Vis =<br>
-          (Flags & SymbolRef::SF_Exported) ?<br>
-            SymbolInfo::Default : SymbolInfo::Hidden;<br>
-        GlobalSymbolTable[Name] = SymbolInfo(SectionID, SectOffset, Vis);<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>
       }<br>
     }<br>
   }<br>
@@ -525,12 +528,15 @@ void RuntimeDyldImpl::<u></u>emitCommonSymbols(<br>
       Offset += AlignOffset;<br>
     }<br>
     uint32_t Flags = Sym.getFlags();<br>
-    SymbolInfo::Visibility Vis =<br>
-      (Flags & SymbolRef::SF_Exported) ?<br>
-        SymbolInfo::Default : SymbolInfo::Hidden;<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>
     DEBUG(dbgs() << "Allocating common symbol " << Name << " address "<br>
                  << format("%p", Addr) << "\n");<br>
-    GlobalSymbolTable[Name] = SymbolInfo(SectionID, Offset, Vis);<br>
+    GlobalSymbolTable[Name] =<br>
+      SymbolTableEntry(SectionID, Offset, RTDyldSymFlags);<br>
     Offset += Size;<br>
     Addr += Size;<br>
   }<br>
@@ -894,22 +900,16 @@ RuntimeDyld::loadObject(const ObjectFile<br>
   return Dyld->loadObject(Obj);<br>
 }<br>
<br>
-void *RuntimeDyld::<u></u>getSymbolAddress(StringRef Name) const {<br>
+void *RuntimeDyld::<u></u>getSymbolLocalAddress(<u></u>StringRef Name) const {<br>
   if (!Dyld)<br>
     return nullptr;<br>
-  return Dyld->getSymbolAddress(Name);<br>
+  return Dyld->getSymbolLocalAddress(<u></u>Name);<br>
 }<br>
<br>
-uint64_t RuntimeDyld::<u></u>getSymbolLoadAddress(StringRef Name) const {<br>
+RuntimeDyld::SymbolInfo RuntimeDyld::getSymbol(<u></u>StringRef Name) const {<br>
   if (!Dyld)<br>
-    return 0;<br>
-  return Dyld->getSymbolLoadAddress(<u></u>Name);<br>
-}<br>
-<br>
-uint64_t RuntimeDyld::<u></u>getExportedSymbolLoadAddress(<u></u>StringRef Name) const {<br>
-  if (!Dyld)<br>
-    return 0;<br>
-  return Dyld-><u></u>getExportedSymbolLoadAddress(<u></u>Name);<br>
+    return nullptr;<br>
+  return Dyld->getSymbol(Name);<br>
 }<br>
<br>
 void RuntimeDyld::<u></u>resolveRelocations() { Dyld->resolveRelocations(); }<br>
<br>
Modified: llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldChecker.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldChecker.cpp?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldChecker.cpp (original)<br>
+++ llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldChecker.cpp Mon Mar  9 18:44:13 2015<br>
@@ -310,7 +310,7 @@ private:<br>
           "");<br>
<br>
     uint64_t SymbolAddr = PCtx.IsInsideLoad<br>
-                              ? Checker.getSymbolLinkerAddr(<u></u>Symbol)<br>
+                              ? Checker.getSymbolLocalAddr(<u></u>Symbol)<br>
                               : Checker.getSymbolRemoteAddr(<u></u>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.getSymbolLinkerAddr(<u></u>Symbol)<br>
+    uint64_t Value = PCtx.IsInsideLoad ? Checker.getSymbolLocalAddr(<u></u>Symbol)<br>
                                        : Checker.getSymbolRemoteAddr(<u></u>Symbol);<br>
<br>
     // Looks like a plain symbol reference.<br>
@@ -727,17 +727,17 @@ bool RuntimeDyldCheckerImpl::<u></u>checkAllRul<br>
 }<br>
<br>
 bool RuntimeDyldCheckerImpl::<u></u>isSymbolValid(StringRef Symbol) const {<br>
-  return getRTDyld().getSymbolAddress(<u></u>Symbol) != nullptr;<br>
+  return getRTDyld().<u></u>getSymbolLocalAddress(Symbol) != nullptr;<br>
 }<br>
<br>
-uint64_t RuntimeDyldCheckerImpl::<u></u>getSymbolLinkerAddr(StringRef Symbol) const {<br>
+uint64_t RuntimeDyldCheckerImpl::<u></u>getSymbolLocalAddr(StringRef Symbol) const {<br>
   return static_cast<uint64_t>(<br>
-      reinterpret_cast<uintptr_t>(<u></u>getRTDyld().getSymbolAddress(<u></u>Symbol)));<br>
+      reinterpret_cast<uintptr_t>(<u></u>getRTDyld().<u></u>getSymbolLocalAddress(Symbol))<u></u>);<br>
 }<br>
<br>
 uint64_t RuntimeDyldCheckerImpl::<u></u>getSymbolRemoteAddr(StringRef Symbol) const {<br>
-  if (uint64_t InternalSymbolAddr = getRTDyld().<u></u>getSymbolLoadAddress(Symbol))<br>
-      return InternalSymbolAddr;<br>
+  if (auto InternalSymbol = getRTDyld().getSymbol(Symbol))<br>
+    return InternalSymbol.getAddress();<br>
   return getRTDyld().MemMgr-><u></u>getSymbolAddress(Symbol);<br>
 }<br>
<br>
@@ -929,6 +929,6 @@ bool RuntimeDyldChecker::<u></u>checkAllRulesIn<br>
<br>
 std::pair<uint64_t, std::string><br>
 RuntimeDyldChecker::<u></u>getSectionAddr(StringRef FileName, StringRef SectionName,<br>
-                                   bool LinkerAddress) {<br>
-  return Impl->getSectionAddr(FileName, SectionName, LinkerAddress);<br>
+                                   bool LocalAddress) {<br>
+  return Impl->getSectionAddr(FileName, SectionName, LocalAddress);<br>
 }<br>
<br>
Modified: llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldCheckerImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldCheckerImpl.h?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldCheckerImpl.h (original)<br>
+++ llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldCheckerImpl.h Mon Mar  9 18:44:13 2015<br>
@@ -42,7 +42,7 @@ private:<br>
   RuntimeDyldImpl &getRTDyld() const { return *RTDyld.Dyld; }<br>
<br>
   bool isSymbolValid(StringRef Symbol) const;<br>
-  uint64_t getSymbolLinkerAddr(StringRef Symbol) const;<br>
+  uint64_t getSymbolLocalAddr(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/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldImpl.h?rev=231724&<u></u>r1=231723&r2=231724&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldImpl.h (original)<br>
+++ llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldImpl.h Mon Mar  9 18:44:13 2015<br>
@@ -164,27 +164,24 @@ public:<br>
   }<br>
 };<br>
<br>
-/// @brief Symbol info for RuntimeDyld.<br>
-class SymbolInfo {<br>
+/// @brief Symbol info for RuntimeDyld.<br>
+class SymbolTableEntry : public JITSymbolBase {<br>
 public:<br>
-  typedef enum { Hidden = 0, Default = 1 } Visibility;<br>
+  SymbolTableEntry()<br>
+    : JITSymbolBase(JITSymbolFlags::<u></u>None), Offset(0), SectionID(0) {}<br>
<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>
+  SymbolTableEntry(unsigned SectionID, uint64_t Offset, JITSymbolFlags Flags)<br>
+    : JITSymbolBase(Flags), Offset(Offset), SectionID(SectionID) {}<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 : 31;<br>
-  Visibility Vis : 1;<br>
+  unsigned SectionID;<br>
 };<br>
<br>
-typedef StringMap<SymbolInfo> RTDyldSymbolTable;<br>
+typedef StringMap<SymbolTableEntry> RTDyldSymbolTable;<br>
<br>
 class RuntimeDyldImpl {<br>
   friend class RuntimeDyld::LoadedObjectInfo;<br>
@@ -394,7 +391,7 @@ public:<br>
   virtual std::unique_ptr<RuntimeDyld::<u></u>LoadedObjectInfo><br>
   loadObject(const object::ObjectFile &Obj) = 0;<br>
<br>
-  uint8_t* getSymbolAddress(StringRef Name) const {<br>
+  uint8_t* getSymbolLocalAddress(<u></u>StringRef Name) const {<br>
     // FIXME: Just look up as a function for now. Overly simple of course.<br>
     // Work in progress.<br>
     RTDyldSymbolTable::const_<u></u>iterator pos = GlobalSymbolTable.find(Name);<br>
@@ -404,24 +401,16 @@ public:<br>
     return getSectionAddress(SymInfo.<u></u>getSectionID()) + SymInfo.getOffset();<br>
   }<br>
<br>
-  uint64_t getSymbolLoadAddress(StringRef Name) const {<br>
+  RuntimeDyld::SymbolInfo getSymbol(StringRef Name) const {<br>
     // FIXME: Just look up as a function for now. Overly simple of course.<br>
     // Work in progress.<br>
     RTDyldSymbolTable::const_<u></u>iterator pos = GlobalSymbolTable.find(Name);<br>
     if (pos == GlobalSymbolTable.end())<br>
-      return 0;<br>
-    const auto &SymInfo = pos->second;<br>
-    return getSectionLoadAddress(SymInfo.<u></u>getSectionID()) + SymInfo.getOffset();<br>
-  }<br>
-<br>
-  uint64_t getExportedSymbolLoadAddress(<u></u>StringRef Name) const {<br>
-    RTDyldSymbolTable::const_<u></u>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.<u></u>getSectionID()) + SymInfo.getOffset();<br>
+      return nullptr;<br>
+    const auto &SymEntry = pos->second;<br>
+    uint64_t TargetAddr =<br>
+      getSectionLoadAddress(<u></u>SymEntry.getSectionID()) + SymEntry.getOffset();<br>
+    return RuntimeDyld::SymbolInfo(<u></u>TargetAddr, SymEntry.getFlags());<br>
   }<br>
<br>
   void resolveRelocations();<br>
<br>
Modified: llvm/trunk/tools/llvm-rtdyld/<u></u>llvm-rtdyld.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/tools/llvm-<u></u>rtdyld/llvm-rtdyld.cpp?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/tools/llvm-rtdyld/<u></u>llvm-rtdyld.cpp (original)<br>
+++ llvm/trunk/tools/llvm-rtdyld/<u></u>llvm-rtdyld.cpp Mon Mar  9 18:44:13 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.getSymbolAddress(<u></u>EntryPoint);<br>
+  void *MainAddress = Dyld.getSymbolLocalAddress(<u></u>EntryPoint);<br>
   if (!MainAddress)<br>
     return Error("no definition for '" + EntryPoint + "'");<br>
<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">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/<u></u>mailman/listinfo/llvm-commits</a><br>
</blockquote></div>