[llvm] r231731 - Temporarily revert r231726 and r231724 as they're breaking the build.:

David Blaikie dblaikie at gmail.com
Mon Mar 9 17:43:21 PDT 2015


On Mon, Mar 9, 2015 at 5:33 PM, Eric Christopher <echristo at gmail.com> wrote:

> Author: echristo
> Date: Mon Mar  9 19:33:27 2015
> New Revision: 231731
>
> URL: http://llvm.org/viewvc/llvm-project?rev=231731&view=rev
> Log:
> Temporarily revert r231726 and r231724 as they're breaking the build.:
>
> Author: Lang Hames <lhames at gmail.com>
> Date:   Mon Mar 9 23:51:09 2015 +0000
>
>     [Orc][MCJIT][RuntimeDyld] Add header that was accidentally left out of
> r231724.
>
> Author: Lang Hames <lhames at gmail.com>
> Date:   Mon Mar 9 23:44:13 2015 +0000
>
>     [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.
>

Looks like the op| & related functions just need to be marked inline.

Ben Kramer - another place/context where -Wmissing-prototype would help :)


>
> Removed:
>     llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h
> 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
>
> Removed: llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h?rev=231730&view=auto
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h (removed)
> @@ -1,81 +0,0 @@
> -//===------ JITSymbolFlags.h - Flags for symbols in the JIT -----*- C++
> -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
>
> -//===----------------------------------------------------------------------===//
> -//
> -// Symbol flags for symbols in the JIT (e.g. weak, exported).
> -//
>
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H
> -#define LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H
> -
> -#include "llvm/IR/GlobalValue.h"
> -
> -namespace llvm {
> -
> -/// @brief Flags for symbols in the JIT.
> -enum class JITSymbolFlags : char {
> -  None = 0,
> -  Weak = 1U << 0,
> -  Exported = 1U << 1
> -};
> -
> -JITSymbolFlags operator|(JITSymbolFlags LHS, JITSymbolFlags RHS) {
> -  typedef std::underlying_type<JITSymbolFlags>::type UT;
> -  return static_cast<JITSymbolFlags>(
> -           static_cast<UT>(LHS) | static_cast<UT>(RHS));
> -}
> -
> -JITSymbolFlags& operator |=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
> -  LHS = LHS | RHS;
> -  return LHS;
> -}
> -
> -JITSymbolFlags operator&(JITSymbolFlags LHS, JITSymbolFlags RHS) {
> -  typedef std::underlying_type<JITSymbolFlags>::type UT;
> -  return static_cast<JITSymbolFlags>(
> -           static_cast<UT>(LHS) & static_cast<UT>(RHS));
> -}
> -
> -JITSymbolFlags& operator &=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
> -  LHS = LHS & RHS;
> -  return LHS;
> -}
> -
> -/// @brief Base class for symbols in the JIT.
> -class JITSymbolBase {
> -public:
> -  JITSymbolBase(JITSymbolFlags Flags) : Flags(Flags) {}
> -
> -  JITSymbolFlags getFlags() const { return Flags; }
> -
> -  bool isWeak() const {
> -    return (Flags & JITSymbolFlags::Weak) == JITSymbolFlags::Weak;
> -  }
> -
> -  bool isExported() const {
> -    return (Flags & JITSymbolFlags::Exported) == JITSymbolFlags::Exported;
> -  }
> -
> -  static JITSymbolFlags flagsFromGlobalValue(const GlobalValue &GV) {
> -    JITSymbolFlags Flags = JITSymbolFlags::None;
> -    if (GV.hasWeakLinkage())
> -      Flags |= JITSymbolFlags::Weak;
> -    if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())
> -      Flags |= JITSymbolFlags::Exported;
> -    return Flags;
> -
> -  }
> -
> -private:
> -  JITSymbolFlags Flags;
> -};
> -
> -} // end namespace llvm
> -
> -#endif
>
> 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=231731&r1=231730&r2=231731&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h Mon Mar  9
> 19:33:27 2015
> @@ -14,7 +14,6 @@
>  #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>
> @@ -26,19 +25,17 @@ namespace orc {
>  typedef uint64_t TargetAddress;
>
>  /// @brief Represents a symbol in the JIT.
> -class JITSymbol : public JITSymbolBase {
> -public:
> -
> +class JITSymbol {
> +public:
>    typedef std::function<TargetAddress()> GetAddressFtor;
>
>    /// @brief Create a 'null' symbol that represents failure to find a
> symbol
>    ///        definition.
> -  JITSymbol(std::nullptr_t)
> -      : JITSymbolBase(JITSymbolFlags::None), CachedAddr(0) {}
> +  JITSymbol(std::nullptr_t) : CachedAddr(0) {}
>
>    /// @brief Create a symbol for a definition with a known address.
> -  JITSymbol(TargetAddress Addr, JITSymbolFlags Flags)
> -    : JITSymbolBase(Flags), CachedAddr(Addr) {}
> +  JITSymbol(TargetAddress Addr)
> +    : CachedAddr(Addr) {}
>
>    /// @brief Create a symbol for a definition that doesn't have a known
> address
>    ///        yet.
> @@ -49,8 +46,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, JITSymbolFlags Flags)
> -      : JITSymbolBase(Flags), GetAddress(std::move(GetAddress)),
> CachedAddr(0) {}
> +  JITSymbol(GetAddressFtor GetAddress)
> +    : CachedAddr(0), GetAddress(std::move(GetAddress)) {}
>
>    /// @brief Returns true if the symbol exists, false otherwise.
>    explicit operator bool() const { return CachedAddr || GetAddress; }
> @@ -67,8 +64,8 @@ public:
>    }
>
>  private:
> -  GetAddressFtor GetAddress;
>    TargetAddress CachedAddr;
> +  GetAddressFtor GetAddress;
>  };
>
>  } // 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=231731&r1=231730&r2=231731&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h
> (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h Mon
> Mar  9 19:33:27 2015
> @@ -45,25 +45,23 @@ private:
>      JITSymbol find(StringRef Name, bool ExportedSymbolsOnly, BaseLayerT
> &B) {
>        switch (EmitState) {
>        case NotEmitted:
> -        if (auto GV = searchGVs(Name, ExportedSymbolsOnly)) {
> +        if (provides(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.
> -          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);
> +          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();
> +              });
>          } else
>            return nullptr;
>        case Emitting:
> @@ -100,8 +98,7 @@ private:
>             std::unique_ptr<RTDyldMemoryManager> MM);
>
>    protected:
> -    virtual const GlobalValue* searchGVs(StringRef Name,
> -                                         bool ExportedSymbolsOnly) const
> = 0;
> +    virtual bool provides(StringRef Name, bool ExportedSymbolsOnly) const
> = 0;
>      virtual BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) = 0;
>
>    private:
> @@ -118,48 +115,46 @@ private:
>
>    protected:
>
> -    const GlobalValue* searchGVs(StringRef Name,
> -                                 bool ExportedSymbolsOnly) const override
> {
> +    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 {
>        // 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 (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 (MangledNames) {
> +        auto VI = MangledNames->find(Name);
> +        if (VI == MangledNames->end())
> +          return false;
> +        return !ExportedSymbolsOnly || VI->second;
>        }
>
>        // 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.
> -      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));
> +      buildMangledNames(Name, ExportedSymbolsOnly);
> +      if (!MangledNames)
> +        return true;
> +      return false;
>      }
>
>    private:
>      // If the mangled name of the given GlobalValue matches the given
> search
>      // name (and its visibility conforms to the ExportedSymbolsOnly flag)
> then
> -    // 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 {
> +    // 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 {
>        // Modules don't "provide" decls or common symbols.
>        if (GV.isDeclaration() || GV.hasCommonLinkage())
> -        return nullptr;
> +        return false;
>
>        // Mangle the GV name.
>        std::string MangledName;
> @@ -172,42 +167,39 @@ private:
>        // bail out early.
>        if (MangledName == SearchName)
>          if (!ExportedSymbolsOnly || GV.hasDefaultVisibility())
> -          return &GV;
> +          return true;
>
>        // Otherwise add this to the map for later.
> -      Names[MangledName] = &GV;
> -      return nullptr;
> +      Names[MangledName] = GV.hasDefaultVisibility();
> +      return false;
>      }
>
> -    // Build the MangledSymbols map. Bails out early (with MangledSymbols
> left set
> +    // Build the MangledNames map. Bails out early (with MangledNames
> left set
>      // to nullptr) if the given SearchName is found while building the
> map.
> -    const GlobalValue* buildMangledSymbols(StringRef SearchName,
> -                                           bool ExportedSymbolsOnly)
> const {
> -      assert(!MangledSymbols && "Mangled symbols map already exists?");
> +    void buildMangledNames(StringRef SearchName,
> +                           bool ExportedSymbolsOnly) const {
> +      assert(!MangledNames && "Mangled names map already exists?");
>
> -      auto Symbols = llvm::make_unique<StringMap<const GlobalValue*>>();
> +      auto Names = llvm::make_unique<StringMap<bool>>();
>
>        for (const auto &M : Ms) {
>          Mangler Mang(&M->getDataLayout());
>
> -        for (const auto &V : M->globals())
> -          if (auto GV = addGlobalValue(*Symbols, V, Mang, SearchName,
> -                                       ExportedSymbolsOnly))
> -            return GV;
> +        for (const auto &GV : M->globals())
> +          if (addGlobalValue(*Names, GV, Mang, SearchName,
> ExportedSymbolsOnly))
> +            return;
>
>          for (const auto &F : *M)
> -          if (auto GV = addGlobalValue(*Symbols, F, Mang, SearchName,
> -                                       ExportedSymbolsOnly))
> -            return GV;
> +          if (addGlobalValue(*Names, F, Mang, SearchName,
> ExportedSymbolsOnly))
> +            return;
>        }
>
> -      MangledSymbols = std::move(Symbols);
> -      return nullptr;
> +      MangledNames = std::move(Names);
>      }
>
>      ModuleSetT Ms;
>      std::unique_ptr<RTDyldMemoryManager> MM;
> -    mutable std::unique_ptr<StringMap<const GlobalValue*>> MangledSymbols;
> +    mutable std::unique_ptr<StringMap<bool>> MangledNames;
>    };
>
>    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=231731&r1=231730&r2=231731&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h
> (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h Mon
> Mar  9 19:33:27 2015
> @@ -51,8 +51,10 @@ protected:
>        return RTDyld->loadObject(Obj);
>      }
>
> -    RuntimeDyld::SymbolInfo getSymbol(StringRef Name) const {
> -      return RTDyld->getSymbol(Name);
> +    TargetAddress getSymbolAddress(StringRef Name, bool
> ExportedSymbolsOnly) {
> +      if (ExportedSymbolsOnly)
> +        return RTDyld->getExportedSymbolLoadAddress(Name);
> +      return RTDyld->getSymbolLoadAddress(Name);
>      }
>
>      bool NeedsFinalization() const { return (State == Raw); }
> @@ -212,32 +214,28 @@ public:
>    ///         given object set.
>    JITSymbol findSymbolIn(ObjSetHandleT H, StringRef Name,
>                           bool ExportedSymbolsOnly) {
> -    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);
> -        }
> +    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;
> +          });
>        }
>      }
> +
>      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=231731&r1=231730&r2=231731&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h Mon Mar  9
> 19:33:27 2015
> @@ -14,7 +14,6 @@
>  #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"
> @@ -29,7 +28,7 @@ namespace object {
>
>  class RuntimeDyldImpl;
>  class RuntimeDyldCheckerImpl;
> -
> +
>  class RuntimeDyld {
>    friend class RuntimeDyldCheckerImpl;
>
> @@ -48,18 +47,6 @@ 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;
> @@ -92,11 +79,15 @@ 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 *getSymbolLocalAddress(StringRef Name) const;
> +  void *getSymbolAddress(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;
> +  /// 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/include/llvm/ExecutionEngine/RuntimeDyldChecker.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h?rev=231731&r1=231730&r2=231731&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h Mon Mar
> 9 19:33:27 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 'LocalAddress' is true, this returns the address of the section
> -  /// within the linker's memory. If 'LocalAddress' is false it returns
> the
> +  /// if 'LinkerAddress' is true, this returns the address of the section
> +  /// within the linker's memory. If 'LinkerAddress' 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 LocalAddress);
> +                                                  bool LinkerAddress);
>
>  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=231731&r1=231730&r2=231731&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Mon Mar  9 19:33:27 2015
> @@ -257,7 +257,7 @@ uint64_t MCJIT::getExistingSymbolAddress
>    Mangler Mang(TM->getDataLayout());
>    SmallString<128> FullName;
>    Mang.getNameWithPrefix(FullName, Name);
> -  return Dyld.getSymbol(FullName).getAddress();
> +  return Dyld.getSymbolLoadAddress(FullName);
>  }
>
>  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.getSymbol(Name).getAddress();
> +  return (void*)Dyld.getSymbolLoadAddress(Name);
>  }
>
>  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=231731&r1=231730&r2=231731&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Mon Mar  9
> 19:33:27 2015
> @@ -197,13 +197,10 @@ RuntimeDyldImpl::loadObjectImpl(const ob
>                       << " SID: " << SectionID << " Offset: "
>                       << format("%p", (uintptr_t)SectOffset)
>                       << " flags: " << Flags << "\n");
> -        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);
> +        SymbolInfo::Visibility Vis =
> +          (Flags & SymbolRef::SF_Exported) ?
> +            SymbolInfo::Default : SymbolInfo::Hidden;
> +        GlobalSymbolTable[Name] = SymbolInfo(SectionID, SectOffset, Vis);
>        }
>      }
>    }
> @@ -528,15 +525,12 @@ void RuntimeDyldImpl::emitCommonSymbols(
>        Offset += AlignOffset;
>      }
>      uint32_t Flags = Sym.getFlags();
> -    JITSymbolFlags RTDyldSymFlags = JITSymbolFlags::None;
> -    if (Flags & SymbolRef::SF_Weak)
> -      RTDyldSymFlags |= JITSymbolFlags::Weak;
> -    if (Flags & SymbolRef::SF_Exported)
> -      RTDyldSymFlags |= JITSymbolFlags::Exported;
> +    SymbolInfo::Visibility Vis =
> +      (Flags & SymbolRef::SF_Exported) ?
> +        SymbolInfo::Default : SymbolInfo::Hidden;
>      DEBUG(dbgs() << "Allocating common symbol " << Name << " address "
>                   << format("%p", Addr) << "\n");
> -    GlobalSymbolTable[Name] =
> -      SymbolTableEntry(SectionID, Offset, RTDyldSymFlags);
> +    GlobalSymbolTable[Name] = SymbolInfo(SectionID, Offset, Vis);
>      Offset += Size;
>      Addr += Size;
>    }
> @@ -900,16 +894,22 @@ RuntimeDyld::loadObject(const ObjectFile
>    return Dyld->loadObject(Obj);
>  }
>
> -void *RuntimeDyld::getSymbolLocalAddress(StringRef Name) const {
> +void *RuntimeDyld::getSymbolAddress(StringRef Name) const {
>    if (!Dyld)
>      return nullptr;
> -  return Dyld->getSymbolLocalAddress(Name);
> +  return Dyld->getSymbolAddress(Name);
>  }
>
> -RuntimeDyld::SymbolInfo RuntimeDyld::getSymbol(StringRef Name) const {
> +uint64_t RuntimeDyld::getSymbolLoadAddress(StringRef Name) const {
>    if (!Dyld)
> -    return nullptr;
> -  return Dyld->getSymbol(Name);
> +    return 0;
> +  return Dyld->getSymbolLoadAddress(Name);
> +}
> +
> +uint64_t RuntimeDyld::getExportedSymbolLoadAddress(StringRef Name) const {
> +  if (!Dyld)
> +    return 0;
> +  return Dyld->getExportedSymbolLoadAddress(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=231731&r1=231730&r2=231731&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp
> (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp Mon
> Mar  9 19:33:27 2015
> @@ -310,7 +310,7 @@ private:
>            "");
>
>      uint64_t SymbolAddr = PCtx.IsInsideLoad
> -                              ? Checker.getSymbolLocalAddr(Symbol)
> +                              ? Checker.getSymbolLinkerAddr(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.getSymbolLocalAddr(Symbol)
> +    uint64_t Value = PCtx.IsInsideLoad ?
> Checker.getSymbolLinkerAddr(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().getSymbolLocalAddress(Symbol) != nullptr;
> +  return getRTDyld().getSymbolAddress(Symbol) != nullptr;
>  }
>
> -uint64_t RuntimeDyldCheckerImpl::getSymbolLocalAddr(StringRef Symbol)
> const {
> +uint64_t RuntimeDyldCheckerImpl::getSymbolLinkerAddr(StringRef Symbol)
> const {
>    return static_cast<uint64_t>(
> -
> reinterpret_cast<uintptr_t>(getRTDyld().getSymbolLocalAddress(Symbol)));
> +      reinterpret_cast<uintptr_t>(getRTDyld().getSymbolAddress(Symbol)));
>  }
>
>  uint64_t RuntimeDyldCheckerImpl::getSymbolRemoteAddr(StringRef Symbol)
> const {
> -  if (auto InternalSymbol = getRTDyld().getSymbol(Symbol))
> -    return InternalSymbol.getAddress();
> +  if (uint64_t InternalSymbolAddr =
> getRTDyld().getSymbolLoadAddress(Symbol))
> +      return InternalSymbolAddr;
>    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 LocalAddress) {
> -  return Impl->getSectionAddr(FileName, SectionName, LocalAddress);
> +                                   bool LinkerAddress) {
> +  return Impl->getSectionAddr(FileName, SectionName, LinkerAddress);
>  }
>
> Modified:
> llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h?rev=231731&r1=231730&r2=231731&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h
> (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h
> Mon Mar  9 19:33:27 2015
> @@ -42,7 +42,7 @@ private:
>    RuntimeDyldImpl &getRTDyld() const { return *RTDyld.Dyld; }
>
>    bool isSymbolValid(StringRef Symbol) const;
> -  uint64_t getSymbolLocalAddr(StringRef Symbol) const;
> +  uint64_t getSymbolLinkerAddr(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=231731&r1=231730&r2=231731&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h Mon Mar
> 9 19:33:27 2015
> @@ -164,24 +164,27 @@ public:
>    }
>  };
>
> -/// @brief Symbol info for RuntimeDyld.
> -class SymbolTableEntry : public JITSymbolBase {
> +/// @brief Symbol info for RuntimeDyld.
> +class SymbolInfo {
>  public:
> -  SymbolTableEntry()
> -    : JITSymbolBase(JITSymbolFlags::None), Offset(0), SectionID(0) {}
> +  typedef enum { Hidden = 0, Default = 1 } Visibility;
>
> -  SymbolTableEntry(unsigned SectionID, uint64_t Offset, JITSymbolFlags
> Flags)
> -    : JITSymbolBase(Flags), Offset(Offset), SectionID(SectionID) {}
> +  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;
> +  unsigned SectionID : 31;
> +  Visibility Vis : 1;
>  };
>
> -typedef StringMap<SymbolTableEntry> RTDyldSymbolTable;
> +typedef StringMap<SymbolInfo> RTDyldSymbolTable;
>
>  class RuntimeDyldImpl {
>    friend class RuntimeDyld::LoadedObjectInfo;
> @@ -391,7 +394,7 @@ public:
>    virtual std::unique_ptr<RuntimeDyld::LoadedObjectInfo>
>    loadObject(const object::ObjectFile &Obj) = 0;
>
> -  uint8_t* getSymbolLocalAddress(StringRef Name) const {
> +  uint8_t* getSymbolAddress(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);
> @@ -401,16 +404,24 @@ public:
>      return getSectionAddress(SymInfo.getSectionID()) +
> SymInfo.getOffset();
>    }
>
> -  RuntimeDyld::SymbolInfo getSymbol(StringRef Name) const {
> +  uint64_t getSymbolLoadAddress(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 nullptr;
> -    const auto &SymEntry = pos->second;
> -    uint64_t TargetAddr =
> -      getSectionLoadAddress(SymEntry.getSectionID()) +
> SymEntry.getOffset();
> -    return RuntimeDyld::SymbolInfo(TargetAddr, SymEntry.getFlags());
> +      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();
>    }
>
>    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=231731&r1=231730&r2=231731&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp (original)
> +++ llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp Mon Mar  9 19:33:27 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.getSymbolLocalAddress(EntryPoint);
> +  void *MainAddress = Dyld.getSymbolAddress(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/20150309/7efafd51/attachment.html>


More information about the llvm-commits mailing list