<div dir="ltr">This broke some bots due to the use of brace initialization. I've fixed that in r226349.<div><br></div><div>- Lang.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 16, 2015 at 3:13 PM, Lang Hames <span dir="ltr"><<a href="mailto:lhames@gmail.com" target="_blank">lhames@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: lhames<br>
Date: Fri Jan 16 17:13:56 2015<br>
New Revision: 226341<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=226341&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=226341&view=rev</a><br>
Log:<br>
[RuntimeDyld] Track symbol visibility in RuntimeDyld.<br>
<br>
RuntimeDyld symbol info previously consisted of just a Section/Offset pair. This<br>
patch replaces that pair type with a SymbolInfo class that also tracks symbol<br>
visibility. A new method, RuntimeDyld::getExportedSymbolLoadAddress, is<br>
introduced which only returns a non-zero result for exported symbols. For<br>
non-exported or non-existant symbols this method will return zero. The<br>
RuntimeDyld::getSymbolAddress method retains its current behavior, returning<br>
non-zero results for all symbols regardless of visibility.<br>
<br>
No in-tree clients of RuntimeDyld are changed. The newly introduced<br>
functionality will be used by the Orc APIs.<br>
<br>
No test case: Since this patch doesn't modify the behavior for any in-tree<br>
clients we don't have a good tool to test this with yet. Once Orc is in we can<br>
use it to write regression tests that test these changes.<br>
<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp<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=226341&r1=226340&r2=226341&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=226341&r1=226340&r2=226341&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h Fri Jan 16 17:13:56 2015<br>
@@ -81,10 +81,14 @@ public:<br>
   /// and resolve relocatons based on where they put it).<br>
   void *getSymbolAddress(StringRef Name) const;<br>
<br>
-  /// Get the address of the target copy of the symbol. This is the address<br>
-  /// used for relocation.<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>
<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=226341&r1=226340&r2=226341&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=226341&r1=226340&r2=226341&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Fri Jan 16 17:13:56 2015<br>
@@ -200,9 +200,14 @@ RuntimeDyldImpl::loadObjectImpl(const ob<br>
         bool IsCode = SI->isText();<br>
         unsigned SectionID =<br>
             findOrEmitSection(Obj, *SI, IsCode, LocalSections);<br>
-        DEBUG(dbgs() << "\tOffset: " << format("%p", (uintptr_t)SectOffset)<br>
-                     << " flags: " << Flags << " SID: " << SectionID);<br>
-        GlobalSymbolTable[Name] = SymbolLoc(SectionID, SectOffset);<br>
+        DEBUG(dbgs() << "\tType: " << SymType << " Name: " << Name<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] = {SectionID, SectOffset, Vis};<br>
       }<br>
     }<br>
     DEBUG(dbgs() << "\tType: " << SymType << " Name: " << Name << "\n");<br>
@@ -444,7 +449,7 @@ void RuntimeDyldImpl::writeBytesUnaligne<br>
 void RuntimeDyldImpl::emitCommonSymbols(const ObjectFile &Obj,<br>
                                         const CommonSymbolMap &CommonSymbols,<br>
                                         uint64_t TotalSize,<br>
-                                        SymbolTableMap &SymbolTable) {<br>
+                                        RTDyldSymbolTable &SymbolTable) {<br>
   // Allocate memory for the section<br>
   unsigned SectionID = Sections.size();<br>
   uint8_t *Addr = MemMgr->allocateDataSection(TotalSize, sizeof(void *),<br>
@@ -473,7 +478,11 @@ void RuntimeDyldImpl::emitCommonSymbols(<br>
       DEBUG(dbgs() << "Allocating common symbol " << Name << " address "<br>
                    << format("%p\n", Addr));<br>
     }<br>
-    SymbolTable[Name.data()] = SymbolLoc(SectionID, Offset);<br>
+    uint32_t Flags = it->first.getFlags();<br>
+    SymbolInfo::Visibility Vis =<br>
+      (Flags & SymbolRef::SF_Exported) ?<br>
+        SymbolInfo::Default : SymbolInfo::Hidden;<br>
+    SymbolTable[Name.data()] = {SectionID, Offset, Vis};<br>
     Offset += Size;<br>
     Addr += Size;<br>
   }<br>
@@ -589,14 +598,15 @@ void RuntimeDyldImpl::addRelocationForSy<br>
   // Relocation by symbol.  If the symbol is found in the global symbol table,<br>
   // create an appropriate section relocation.  Otherwise, add it to<br>
   // ExternalSymbolRelocations.<br>
-  SymbolTableMap::const_iterator Loc = GlobalSymbolTable.find(SymbolName);<br>
+  RTDyldSymbolTable::const_iterator Loc = GlobalSymbolTable.find(SymbolName);<br>
   if (Loc == GlobalSymbolTable.end()) {<br>
     ExternalSymbolRelocations[SymbolName].push_back(RE);<br>
   } else {<br>
     // Copy the RE since we want to modify its addend.<br>
     RelocationEntry RECopy = RE;<br>
-    RECopy.Addend += Loc->second.second;<br>
-    Relocations[Loc->second.first].push_back(RECopy);<br>
+    const auto &SymInfo = Loc->second;<br>
+    RECopy.Addend += SymInfo.getOffset();<br>
+    Relocations[SymInfo.getSectionID()].push_back(RECopy);<br>
   }<br>
 }<br>
<br>
@@ -721,7 +731,7 @@ void RuntimeDyldImpl::resolveExternalSym<br>
       resolveRelocationList(Relocs, 0);<br>
     } else {<br>
       uint64_t Addr = 0;<br>
-      SymbolTableMap::const_iterator Loc = GlobalSymbolTable.find(Name);<br>
+      RTDyldSymbolTable::const_iterator Loc = GlobalSymbolTable.find(Name);<br>
       if (Loc == GlobalSymbolTable.end()) {<br>
         // This is an external symbol, try to get its address from<br>
         // MemoryManager.<br>
@@ -736,8 +746,9 @@ void RuntimeDyldImpl::resolveExternalSym<br>
       } else {<br>
         // We found the symbol in our global table.  It was probably in a<br>
         // Module that we loaded previously.<br>
-        SymbolLoc SymLoc = Loc->second;<br>
-        Addr = getSectionLoadAddress(SymLoc.first) + SymLoc.second;<br>
+        const auto &SymInfo = Loc->second;<br>
+        Addr = getSectionLoadAddress(SymInfo.getSectionID()) +<br>
+               SymInfo.getOffset();<br>
       }<br>
<br>
       // FIXME: Implement error handling that doesn't kill the host program!<br>
@@ -834,6 +845,12 @@ uint64_t RuntimeDyld::getSymbolLoadAddre<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>
 void RuntimeDyld::reassignSectionAddress(unsigned SectionID, uint64_t Addr) {<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=226341&r1=226340&r2=226341&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp?rev=226341&r1=226340&r2=226341&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp Fri Jan 16 17:13:56 2015<br>
@@ -850,14 +850,16 @@ std::pair<uint64_t, std::string> Runtime<br>
<br>
 StringRef<br>
 RuntimeDyldCheckerImpl::getSubsectionStartingAt(StringRef Name) const {<br>
-  RuntimeDyldImpl::SymbolTableMap::const_iterator pos =<br>
+  RTDyldSymbolTable::const_iterator pos =<br>
       getRTDyld().GlobalSymbolTable.find(Name);<br>
   if (pos == getRTDyld().GlobalSymbolTable.end())<br>
     return StringRef();<br>
-  RuntimeDyldImpl::SymbolLoc Loc = pos->second;<br>
-  uint8_t *SectionAddr = getRTDyld().getSectionAddress(Loc.first);<br>
-  return StringRef(reinterpret_cast<const char *>(SectionAddr) + Loc.second,<br>
-                   getRTDyld().Sections[Loc.first].Size - Loc.second);<br>
+  const auto &SymInfo = pos->second;<br>
+  uint8_t *SectionAddr = getRTDyld().getSectionAddress(SymInfo.getSectionID());<br>
+  return StringRef(reinterpret_cast<const char *>(SectionAddr) +<br>
+                     SymInfo.getOffset(),<br>
+                   getRTDyld().Sections[SymInfo.getSectionID()].Size -<br>
+                     SymInfo.getOffset());<br>
 }<br>
<br>
 void RuntimeDyldCheckerImpl::registerSection(<br>
@@ -887,9 +889,10 @@ void RuntimeDyldCheckerImpl::registerStu<br>
       // If this is a (Section, Offset) pair, do a reverse lookup in the<br>
       // global symbol table to find the name.<br>
       for (auto &GSTEntry : getRTDyld().GlobalSymbolTable) {<br>
-        if (GSTEntry.second.first == StubMapEntry.first.SectionID &&<br>
-            GSTEntry.second.second ==<br>
-                static_cast<uint64_t>(StubMapEntry.first.Offset)) {<br>
+        const auto &SymInfo = GSTEntry.second;<br>
+        if (SymInfo.getSectionID() == StubMapEntry.first.SectionID &&<br>
+            SymInfo.getOffset() ==<br>
+              static_cast<uint64_t>(StubMapEntry.first.Offset)) {<br>
           SymbolName = GSTEntry.first();<br>
           break;<br>
         }<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp?rev=226341&r1=226340&r2=226341&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp?rev=226341&r1=226340&r2=226341&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp Fri Jan 16 17:13:56 2015<br>
@@ -920,15 +920,16 @@ relocation_iterator RuntimeDyldELF::proc<br>
   SymbolRef::Type SymType = SymbolRef::ST_Unknown;<br>
<br>
   // Search for the symbol in the global symbol table<br>
-  SymbolTableMap::const_iterator gsi = GlobalSymbolTable.end();<br>
+  RTDyldSymbolTable::const_iterator gsi = GlobalSymbolTable.end();<br>
   if (Symbol != Obj.symbol_end()) {<br>
     gsi = GlobalSymbolTable.find(TargetName.data());<br>
     Symbol->getType(SymType);<br>
   }<br>
   if (gsi != GlobalSymbolTable.end()) {<br>
-    Value.SectionID = gsi->second.first;<br>
-    Value.Offset = gsi->second.second;<br>
-    Value.Addend = gsi->second.second + Addend;<br>
+    const auto &SymInfo = gsi->second;<br>
+    Value.SectionID = SymInfo.getSectionID();<br>
+    Value.Offset = SymInfo.getOffset();<br>
+    Value.Addend = SymInfo.getOffset() + Addend;<br>
   } else {<br>
     switch (SymType) {<br>
     case SymbolRef::ST_Debug: {<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=226341&r1=226340&r2=226341&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=226341&r1=226340&r2=226341&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h Fri Jan 16 17:13:56 2015<br>
@@ -156,6 +156,28 @@ public:<br>
   }<br>
 };<br>
<br>
+/// @brief Symbol info for RuntimeDyld.<br>
+class SymbolInfo {<br>
+public:<br>
+  typedef enum { Hidden = 0, Default = 1 } Visibility;<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>
+<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>
+};<br>
+<br>
+typedef StringMap<SymbolInfo> RTDyldSymbolTable;<br>
+<br>
 class RuntimeDyldImpl {<br>
   friend class RuntimeDyld::LoadedObjectInfo;<br>
   friend class RuntimeDyldCheckerImpl;<br>
@@ -178,11 +200,8 @@ protected:<br>
   // references it.<br>
   typedef std::map<SectionRef, unsigned> ObjSectionToIDMap;<br>
<br>
-  // A global symbol table for symbols from all loaded modules.  Maps the<br>
-  // symbol name to a (SectionID, offset in section) pair.<br>
-  typedef std::pair<unsigned, uintptr_t> SymbolLoc;<br>
-  typedef StringMap<SymbolLoc> SymbolTableMap;<br>
-  SymbolTableMap GlobalSymbolTable;<br>
+  // A global symbol table for symbols from all loaded modules.<br>
+  RTDyldSymbolTable GlobalSymbolTable;<br>
<br>
   // Pair representing the size and alignment requirement for a common symbol.<br>
   typedef std::pair<unsigned, unsigned> CommonSymbolInfo;<br>
@@ -289,7 +308,7 @@ protected:<br>
   /// symbol table.<br>
   void emitCommonSymbols(const ObjectFile &Obj,<br>
                          const CommonSymbolMap &CommonSymbols,<br>
-                         uint64_t TotalSize, SymbolTableMap &SymbolTable);<br>
+                         uint64_t TotalSize, RTDyldSymbolTable &SymbolTable);<br>
<br>
   /// \brief Emits section data from the object file to the MemoryManager.<br>
   /// \param IsCode if it's true then allocateCodeSection() will be<br>
@@ -374,21 +393,31 @@ public:<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>
-    SymbolTableMap::const_iterator pos = GlobalSymbolTable.find(Name);<br>
+    RTDyldSymbolTable::const_iterator pos = GlobalSymbolTable.find(Name);<br>
     if (pos == GlobalSymbolTable.end())<br>
       return nullptr;<br>
-    SymbolLoc Loc = pos->second;<br>
-    return getSectionAddress(Loc.first) + Loc.second;<br>
+    const auto &SymInfo = pos->second;<br>
+    return getSectionAddress(SymInfo.getSectionID()) + SymInfo.getOffset();<br>
   }<br>
<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>
-    SymbolTableMap::const_iterator pos = GlobalSymbolTable.find(Name);<br>
+    RTDyldSymbolTable::const_iterator pos = GlobalSymbolTable.find(Name);<br>
+    if (pos == GlobalSymbolTable.end())<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>
-    SymbolLoc Loc = pos->second;<br>
-    return getSectionLoadAddress(Loc.first) + Loc.second;<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/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp?rev=226341&r1=226340&r2=226341&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp?rev=226341&r1=226340&r2=226341&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp Fri Jan 16 17:13:56 2015<br>
@@ -64,11 +64,12 @@ RelocationValueRef RuntimeDyldMachO::get<br>
     symbol_iterator Symbol = RI->getSymbol();<br>
     StringRef TargetName;<br>
     Symbol->getName(TargetName);<br>
-    SymbolTableMap::const_iterator SI =<br>
+    RTDyldSymbolTable::const_iterator SI =<br>
       GlobalSymbolTable.find(TargetName.data());<br>
     if (SI != GlobalSymbolTable.end()) {<br>
-      Value.SectionID = SI->second.first;<br>
-      Value.Offset = SI->second.second + RE.Addend;<br>
+      const auto &SymInfo = SI->second;<br>
+      Value.SectionID = SymInfo.getSectionID();<br>
+      Value.Offset = SymInfo.getOffset() + RE.Addend;<br>
     } else {<br>
       Value.SymbolName = TargetName.data();<br>
       Value.Offset = RE.Addend;<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>