From: Lang Hames Date: Fri, 4 Dec 2015 22:09:19 +0000 (+0000) Subject: [Orc] Move some code up into the JITCompileCallbackManager base class. NFC. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=c5aab87e68369e95e4fbe83f6ed2bd38ec9f41d6 [Orc] Move some code up into the JITCompileCallbackManager base class. NFC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254778 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h b/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h index b5b258e7a05..3bfff059110 100644 --- a/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h +++ b/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h @@ -84,7 +84,11 @@ public: } /// @brief Reserve a compile callback. - virtual CompileCallbackInfo getCompileCallback() = 0; + CompileCallbackInfo getCompileCallback() { + TargetAddress TrampolineAddr = getAvailableTrampolineAddr(); + auto &Compile = this->ActiveTrampolines[TrampolineAddr]; + return CompileCallbackInfo(TrampolineAddr, Compile); + } /// @brief Get a CompileCallbackInfo for an existing callback. CompileCallbackInfo getCompileCallbackInfo(TargetAddress TrampolineAddr) { @@ -113,6 +117,20 @@ protected: std::vector AvailableTrampolines; private: + + TargetAddress getAvailableTrampolineAddr() { + if (this->AvailableTrampolines.empty()) + grow(); + assert(!this->AvailableTrampolines.empty() && + "Failed to grow available trampolines."); + TargetAddress TrampolineAddr = this->AvailableTrampolines.back(); + this->AvailableTrampolines.pop_back(); + return TrampolineAddr; + } + + // Create new trampolines - to be implemented in subclasses. + virtual void grow() = 0; + virtual void anchor(); }; @@ -145,13 +163,6 @@ public: assert(!EC && "Failed to mprotect resolver block"); } - /// @brief Get/create a compile callback with the given signature. - CompileCallbackInfo getCompileCallback() final { - TargetAddress TrampolineAddr = getAvailableTrampolineAddr(); - auto &Compile = this->ActiveTrampolines[TrampolineAddr]; - return CompileCallbackInfo(TrampolineAddr, Compile); - } - private: static TargetAddress reenter(void *CCMgr, void *TrampolineId) { @@ -162,17 +173,7 @@ private: reinterpret_cast(TrampolineId))); } - TargetAddress getAvailableTrampolineAddr() { - if (this->AvailableTrampolines.empty()) - grow(); - assert(!this->AvailableTrampolines.empty() && - "Failed to grow available trampolines."); - TargetAddress TrampolineAddr = this->AvailableTrampolines.back(); - this->AvailableTrampolines.pop_back(); - return TrampolineAddr; - } - - void grow() { + void grow() override { assert(this->AvailableTrampolines.empty() && "Growing prematurely?"); std::error_code EC; diff --git a/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp b/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp index 4a30cfc4297..ca508d0a756 100644 --- a/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp +++ b/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp @@ -18,17 +18,9 @@ namespace { class DummyCallbackManager : public orc::JITCompileCallbackManager { public: - DummyCallbackManager() - : JITCompileCallbackManager(0), NextStubAddress(0), - UniversalCompile([]() { return 0; }) { - } - - CompileCallbackInfo getCompileCallback() override { - return CompileCallbackInfo(++NextStubAddress, UniversalCompile); - } + DummyCallbackManager() : JITCompileCallbackManager(0) { } public: - TargetAddress NextStubAddress; - CompileFtor UniversalCompile; + void grow() override { llvm_unreachable("not implemented"); } }; class DummyStubsManager : public orc::IndirectStubsManagerBase {