From e28b118be0cde71cb0c4e4c840cf075a9803852e Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Tue, 2 Feb 2016 19:31:15 +0000 Subject: [PATCH] [Orc] Turn OrcX86_64::IndirectStubsInfo into a template helper class: GenericIndirectStubsInfo. This will allow architecture support classes for other architectures to re-use this code. llvm-svn: 259549 --- .../ExecutionEngine/Orc/OrcArchitectureSupport.h | 87 +++++++++++----------- .../ExecutionEngine/Orc/OrcArchitectureSupport.cpp | 3 +- 2 files changed, 46 insertions(+), 44 deletions(-) diff --git a/llvm/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h b/llvm/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h index 1b0488b..b5ef286 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h @@ -67,6 +67,49 @@ public: } }; +/// @brief Provide information about stub blocks generated by the +/// makeIndirectStubsBlock function. +template +class GenericIndirectStubsInfo { +public: + const static unsigned StubSize = StubSizeVal; + + GenericIndirectStubsInfo() : NumStubs(0) {} + GenericIndirectStubsInfo(unsigned NumStubs, sys::OwningMemoryBlock StubsMem) + : NumStubs(NumStubs), StubsMem(std::move(StubsMem)) {} + GenericIndirectStubsInfo(GenericIndirectStubsInfo &&Other) + : NumStubs(Other.NumStubs), StubsMem(std::move(Other.StubsMem)) { + Other.NumStubs = 0; + } + GenericIndirectStubsInfo &operator=(GenericIndirectStubsInfo &&Other) { + NumStubs = Other.NumStubs; + Other.NumStubs = 0; + StubsMem = std::move(Other.StubsMem); + return *this; + } + + /// @brief Number of stubs in this block. + unsigned getNumStubs() const { return NumStubs; } + + /// @brief Get a pointer to the stub at the given index, which must be in + /// the range 0 .. getNumStubs() - 1. + void *getStub(unsigned Idx) const { + return static_cast(StubsMem.base()) + Idx; + } + + /// @brief Get a pointer to the implementation-pointer at the given index, + /// which must be in the range 0 .. getNumStubs() - 1. + void **getPtr(unsigned Idx) const { + char *PtrsBase = + static_cast(StubsMem.base()) + NumStubs * StubSize; + return reinterpret_cast(PtrsBase) + Idx; + } + +private: + unsigned NumStubs; + sys::OwningMemoryBlock StubsMem; +}; + /// @brief X86_64 support. /// /// X86_64 supports lazy JITing. @@ -76,6 +119,8 @@ public: static const unsigned TrampolineSize = 8; static const unsigned ResolverCodeSize = 0x78; + typedef GenericIndirectStubsInfo<8> IndirectStubsInfo; + typedef TargetAddress (*JITReentryFn)(void *CallbackMgr, void *TrampolineId); /// @brief Write the resolver code into the given memory. The user is be @@ -89,48 +134,6 @@ public: static void writeTrampolines(uint8_t *TrampolineMem, void *ResolverAddr, unsigned NumTrampolines); - /// @brief Provide information about stub blocks generated by the - /// makeIndirectStubsBlock function. - class IndirectStubsInfo { - friend class OrcX86_64; - - public: - const static unsigned StubSize = 8; - - IndirectStubsInfo() : NumStubs(0) {} - IndirectStubsInfo(IndirectStubsInfo &&Other) - : NumStubs(Other.NumStubs), StubsMem(std::move(Other.StubsMem)) { - Other.NumStubs = 0; - } - IndirectStubsInfo &operator=(IndirectStubsInfo &&Other) { - NumStubs = Other.NumStubs; - Other.NumStubs = 0; - StubsMem = std::move(Other.StubsMem); - return *this; - } - - /// @brief Number of stubs in this block. - unsigned getNumStubs() const { return NumStubs; } - - /// @brief Get a pointer to the stub at the given index, which must be in - /// the range 0 .. getNumStubs() - 1. - void *getStub(unsigned Idx) const { - return static_cast(StubsMem.base()) + Idx; - } - - /// @brief Get a pointer to the implementation-pointer at the given index, - /// which must be in the range 0 .. getNumStubs() - 1. - void **getPtr(unsigned Idx) const { - char *PtrsBase = - static_cast(StubsMem.base()) + NumStubs * StubSize; - return reinterpret_cast(PtrsBase) + Idx; - } - - private: - unsigned NumStubs; - sys::OwningMemoryBlock StubsMem; - }; - /// @brief Emit at least MinStubs worth of indirect call stubs, rounded out to /// the nearest page size. /// diff --git a/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp b/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp index 01e829f..35cb295 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp +++ b/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp @@ -161,8 +161,7 @@ std::error_code OrcX86_64::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo, for (unsigned I = 0; I < NumStubs; ++I) Ptr[I] = InitialPtrVal; - StubsInfo.NumStubs = NumStubs; - StubsInfo.StubsMem = std::move(StubsMem); + StubsInfo = IndirectStubsInfo(NumStubs, std::move(StubsMem)); return std::error_code(); } -- 2.7.4