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