[llvm] r251658 - [Orc] Teach IndirectStubsManager to manage an expandable pool of stubs, rather

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 29 15:15:57 PDT 2015


On Thu, Oct 29, 2015 at 3:04 PM, Lang Hames via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: lhames
> Date: Thu Oct 29 17:04:22 2015
> New Revision: 251658
>
> URL: http://llvm.org/viewvc/llvm-project?rev=251658&view=rev
> Log:
> [Orc] Teach IndirectStubsManager to manage an expandable pool of stubs,
> rather
> than a pre-allocated slab of stubs. Also add a convenience method for
> creating a
> single stub, rather than a whole block a time.
>

Even with the lighter weight stub construction this still seems to be a hot
point & worth removing the upfront O(sizeof initial module) cost with the
smaller factor? (I know we chatted about it a week or two ago & you weren't
sure if that'd be the case)


>
>
> Modified:
>     llvm/trunk/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h
>     llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcTargetSupport.h
>     llvm/trunk/lib/ExecutionEngine/Orc/OrcTargetSupport.cpp
>     llvm/trunk/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp
>
> Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h?rev=251658&r1=251657&r2=251658&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h
> (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h Thu Oct
> 29 17:04:22 2015
> @@ -234,6 +234,10 @@ public:
>
>    virtual ~IndirectStubsManagerBase() {}
>
> +  /// @brief Create a single stub with the given name, target address and
> flags.
> +  virtual std::error_code createStub(StringRef StubName, TargetAddress
> StubAddr,
> +                                     JITSymbolFlags StubFlags) = 0;
> +
>    /// @brief Create StubInits.size() stubs with the given names, target
>    ///        addresses, and flags.
>    virtual std::error_code createStubs(const StubInitsMap &StubInits) = 0;
> @@ -252,25 +256,29 @@ private:
>    virtual void anchor();
>  };
>
> -/// @brief IndirectStubsManager implementation for a concrete target,
> e.g. OrcX86_64.
> -///        (See OrcTargetSupport.h).
> +/// @brief IndirectStubsManager implementation for a concrete target, e.g.
> +///        OrcX86_64. (See OrcTargetSupport.h).
>  template <typename TargetT>
>  class IndirectStubsManager : public IndirectStubsManagerBase {
>  public:
>
> -  std::error_code
> -  createStubs(const StubInitsMap &StubInits) override {
> -    if (auto EC = TargetT::emitIndirectStubsBlock(IndirectStubsInfo,
> -                                                  StubInits.size(),
> -                                                  nullptr))
> +  std::error_code createStub(StringRef StubName, TargetAddress StubAddr,
> +                             JITSymbolFlags StubFlags) override {
> +    if (auto EC = reserveStubs(1))
>        return EC;
>
> -    unsigned I = 0;
> -    for (auto &Entry : StubInits) {
> -      *IndirectStubsInfo.getPtr(I) =
> -
> reinterpret_cast<void*>(static_cast<uintptr_t>(Entry.second.first));
> -      StubIndexes[Entry.first()] = std::make_pair(I++,
> Entry.second.second);
> -    }
> +    createStubInternal(StubName, StubAddr, StubFlags);
> +
> +    return std::error_code();
> +  }
> +
> +  std::error_code createStubs(const StubInitsMap &StubInits) override {
> +    if (auto EC = reserveStubs(StubInits.size()))
> +      return EC;
> +
> +    for (auto &Entry : StubInits)
> +      createStubInternal(Entry.first(), Entry.second.first,
> +                         Entry.second.second);
>
>      return std::error_code();
>    }
> @@ -279,7 +287,8 @@ public:
>      auto I = StubIndexes.find(Name);
>      if (I == StubIndexes.end())
>        return nullptr;
> -    void *StubAddr = IndirectStubsInfo.getStub(I->second.first);
> +    auto Key = I->second.first;
> +    void *StubAddr = IndirectStubsInfos[Key.first].getStub(Key.second);
>      assert(StubAddr && "Missing stub address");
>      auto StubTargetAddr =
>        static_cast<TargetAddress>(reinterpret_cast<uintptr_t>(StubAddr));
> @@ -293,23 +302,54 @@ public:
>      auto I = StubIndexes.find(Name);
>      if (I == StubIndexes.end())
>        return nullptr;
> -    void *PtrAddr = IndirectStubsInfo.getPtr(StubIndexes[Name].first);
> +    auto Key = I->second.first;
> +    void *PtrAddr = IndirectStubsInfos[Key.first].getPtr(Key.second);
>      assert(PtrAddr && "Missing pointer address");
>      auto PtrTargetAddr =
>        static_cast<TargetAddress>(reinterpret_cast<uintptr_t>(PtrAddr));
> -    return JITSymbol(PtrTargetAddr, JITSymbolFlags::None);
> +    return JITSymbol(PtrTargetAddr, I->second.second);
>    }
>
>    std::error_code updatePointer(StringRef Name, TargetAddress NewAddr)
> override {
> -    assert(StubIndexes.count(Name) && "No stub pointer for symbol");
> -    *IndirectStubsInfo.getPtr(StubIndexes[Name].first) =
> +    auto I = StubIndexes.find(Name);
> +    assert(I != StubIndexes.end() && "No stub pointer for symbol");
> +    auto Key = I->second.first;
> +    *IndirectStubsInfos[Key.first].getPtr(Key.second) =
>        reinterpret_cast<void*>(static_cast<uintptr_t>(NewAddr));
>      return std::error_code();
>    }
>
>  private:
> -  typename TargetT::IndirectStubsInfo IndirectStubsInfo;
> -  StringMap<std::pair<unsigned, JITSymbolFlags>> StubIndexes;
> +
> +  std::error_code reserveStubs(unsigned NumStubs) {
> +    if (NumStubs <= FreeStubs.size())
> +      return std::error_code();
> +
> +    unsigned NewStubsRequired = NumStubs - FreeStubs.size();
> +    unsigned NewBlockId = IndirectStubsInfos.size();
> +    typename TargetT::IndirectStubsInfo ISI;
> +    if (auto EC = TargetT::emitIndirectStubsBlock(ISI, NewStubsRequired,
> +                                                  nullptr))
> +      return EC;
> +    for (unsigned I = 0; I < ISI.getNumStubs(); ++I)
> +      FreeStubs.push_back(std::make_pair(NewBlockId, I));
> +    IndirectStubsInfos.push_back(std::move(ISI));
> +    return std::error_code();
> +  }
> +
> +  void createStubInternal(StringRef StubName, TargetAddress InitAddr,
> +                          JITSymbolFlags StubFlags) {
> +    auto Key = FreeStubs.back();
> +    FreeStubs.pop_back();
> +    *IndirectStubsInfos[Key.first].getPtr(Key.second) =
> +      reinterpret_cast<void*>(static_cast<uintptr_t>(InitAddr));
> +    StubIndexes[StubName] = std::make_pair(Key, StubFlags);
> +  }
> +
> +  std::vector<typename TargetT::IndirectStubsInfo> IndirectStubsInfos;
> +  typedef std::pair<uint16_t, uint16_t> StubKey;
> +  std::vector<StubKey> FreeStubs;
> +  StringMap<std::pair<StubKey, JITSymbolFlags>> StubIndexes;
>  };
>
>  /// @brief Build a function pointer of FunctionType with the given
> constant
>
> Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcTargetSupport.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcTargetSupport.h?rev=251658&r1=251657&r2=251658&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcTargetSupport.h
> (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcTargetSupport.h Thu Oct
> 29 17:04:22 2015
> @@ -59,6 +59,8 @@ public:
>      const static unsigned PtrSize = 8;
>
>      IndirectStubsInfo() : NumStubs(0) {}
> +    IndirectStubsInfo(IndirectStubsInfo&&);
> +    IndirectStubsInfo& operator=(IndirectStubsInfo&&);
>      ~IndirectStubsInfo();
>
>      /// @brief Number of stubs in this block.
>
> Modified: llvm/trunk/lib/ExecutionEngine/Orc/OrcTargetSupport.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcTargetSupport.cpp?rev=251658&r1=251657&r2=251658&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/Orc/OrcTargetSupport.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/Orc/OrcTargetSupport.cpp Thu Oct 29
> 17:04:22 2015
> @@ -144,6 +144,22 @@ OrcX86_64::insertCompileCallbackTrampoli
>    return GetLabelName;
>  }
>
> +OrcX86_64::IndirectStubsInfo::IndirectStubsInfo(IndirectStubsInfo
> &&Other) {
> +  StubsBlock = std::move(Other.StubsBlock);
> +  PtrsBlock = std::move(Other.PtrsBlock);
> +  Other.StubsBlock = sys::MemoryBlock();
> +  Other.PtrsBlock = sys::MemoryBlock();
> +}
> +
> +OrcX86_64::IndirectStubsInfo&
> +OrcX86_64::IndirectStubsInfo::operator=(IndirectStubsInfo &&Other) {
> +  StubsBlock = std::move(Other.StubsBlock);
> +  PtrsBlock = std::move(Other.PtrsBlock);
> +  Other.StubsBlock = sys::MemoryBlock();
> +  Other.PtrsBlock = sys::MemoryBlock();
> +  return *this;
> +}
> +
>  OrcX86_64::IndirectStubsInfo::~IndirectStubsInfo() {
>    sys::Memory::releaseMappedMemory(StubsBlock);
>    sys::Memory::releaseMappedMemory(PtrsBlock);
>
> Modified:
> llvm/trunk/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp?rev=251658&r1=251657&r2=251658&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp
> (original)
> +++ llvm/trunk/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp
> Thu Oct 29 17:04:22 2015
> @@ -33,6 +33,11 @@ public:
>
>  class DummyStubsManager : public orc::IndirectStubsManagerBase {
>  public:
> +  std::error_code createStub(StringRef StubName, TargetAddress InitAddr,
> +                             JITSymbolFlags Flags) override {
> +    llvm_unreachable("Not implemented");
> +  }
> +
>    std::error_code createStubs(const StubInitsMap &StubInits) override {
>      llvm_unreachable("Not implemented");
>    }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151029/2e0a9696/attachment-0001.html>


More information about the llvm-commits mailing list