Revising the MCJIT ObjectCache interface to allow subclasses to avoid retaining references to returned objects

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185221 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrew Kaylor 2013-06-28 21:40:16 +00:00
parent 75f29256f3
commit 40d8171e3e
3 changed files with 14 additions and 25 deletions

View File

@ -30,23 +30,9 @@ public:
/// getObjectCopy - Returns a pointer to a newly allocated MemoryBuffer that /// getObjectCopy - Returns a pointer to a newly allocated MemoryBuffer that
/// contains the object which corresponds with Module M, or 0 if an object is /// contains the object which corresponds with Module M, or 0 if an object is
/// not available. The caller owns the MemoryBuffer returned by this function. /// not available. The caller owns both the MemoryBuffer returned by this
MemoryBuffer* getObjectCopy(const Module* M) { /// and the memory it references.
const MemoryBuffer* Obj = getObject(M); virtual MemoryBuffer* getObject(const Module* M) = 0;
if (Obj)
return MemoryBuffer::getMemBufferCopy(Obj->getBuffer());
else
return 0;
}
protected:
/// getObject - Returns a pointer to a MemoryBuffer that contains an object
/// that corresponds with Module M, or 0 if an object is not available.
/// The pointer returned by this function is not suitable for loading because
/// the memory is read-only and owned by the ObjectCache. To retrieve an
/// owning pointer to a MemoryBuffer (which is suitable for calling
/// RuntimeDyld::loadObject() with) use getObjectCopy() instead.
virtual const MemoryBuffer* getObject(const Module* M) = 0;
}; };
} }

View File

@ -129,7 +129,7 @@ void MCJIT::loadObject(Module *M) {
OwningPtr<ObjectBuffer> ObjectToLoad; OwningPtr<ObjectBuffer> ObjectToLoad;
// Try to load the pre-compiled object from cache if possible // Try to load the pre-compiled object from cache if possible
if (0 != ObjCache) { if (0 != ObjCache) {
OwningPtr<MemoryBuffer> PreCompiledObject(ObjCache->getObjectCopy(M)); OwningPtr<MemoryBuffer> PreCompiledObject(ObjCache->getObject(M));
if (0 != PreCompiledObject.get()) if (0 != PreCompiledObject.get())
ObjectToLoad.reset(new ObjectBuffer(PreCompiledObject.take())); ObjectToLoad.reset(new ObjectBuffer(PreCompiledObject.take()));
} }

View File

@ -45,6 +45,16 @@ public:
ObjMap[ModuleID] = copyBuffer(Obj); ObjMap[ModuleID] = copyBuffer(Obj);
} }
virtual MemoryBuffer* getObject(const Module* M) {
const MemoryBuffer* BufferFound = getObjectInternal(M);
ModulesLookedUp.insert(M->getModuleIdentifier());
if (!BufferFound)
return NULL;
// Our test cache wants to maintain ownership of its object buffers
// so we make a copy here for the execution engine.
return MemoryBuffer::getMemBufferCopy(BufferFound->getBuffer());
}
// Test-harness-specific functions // Test-harness-specific functions
bool wereDuplicatesInserted() { return DuplicateInserted; } bool wereDuplicatesInserted() { return DuplicateInserted; }
@ -62,13 +72,6 @@ public:
return it->second; return it->second;
} }
protected:
virtual const MemoryBuffer* getObject(const Module* M) {
const MemoryBuffer* BufferFound = getObjectInternal(M);
ModulesLookedUp.insert(M->getModuleIdentifier());
return BufferFound;
}
private: private:
MemoryBuffer *copyBuffer(const MemoryBuffer *Buf) { MemoryBuffer *copyBuffer(const MemoryBuffer *Buf) {
// Create a local copy of the buffer. // Create a local copy of the buffer.