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

Lang Hames lhames at gmail.com
Tue Mar 10 17:50:40 PDT 2015


Thanks Eric and Dave.

I've reapplied with Dave's fix in r231896.

- Lang.

On Tue, Mar 10, 2015 at 11:43 AM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
> 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
>>
>
>
> _______________________________________________
> 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/20150311/3da81056/attachment.html>


More information about the llvm-commits mailing list