[Orc] Move some code up into the JITCompileCallbackManager base class. NFC.

llvm-svn: 254778
This commit is contained in:
Lang Hames 2015-12-04 22:09:19 +00:00
parent 2c7e9b8d27
commit c8c41976a3
2 changed files with 22 additions and 29 deletions

View File

@ -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<TargetAddress> 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<uintptr_t>(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;

View File

@ -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 {