<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>