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