Revising the MCJIT ObjectCache interface to allow subclasses to avoid retaining refer...
authorAndrew Kaylor <andrew.kaylor@intel.com>
Fri, 28 Jun 2013 21:40:16 +0000 (21:40 +0000)
committerAndrew Kaylor <andrew.kaylor@intel.com>
Fri, 28 Jun 2013 21:40:16 +0000 (21:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185221 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ExecutionEngine/ObjectCache.h
lib/ExecutionEngine/MCJIT/MCJIT.cpp
unittests/ExecutionEngine/MCJIT/MCJITObjectCacheTest.cpp

index 0bee86161bb7afe0a2b76055cbc28c3815838089..aa200fbcdd68b25913e5be00738d458fc33237cc 100644 (file)
@@ -30,23 +30,9 @@ public:
 
   /// getObjectCopy - Returns a pointer to a newly allocated MemoryBuffer that
   /// 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.
-  MemoryBuffer* getObjectCopy(const Module* M) {
-    const MemoryBuffer* Obj = getObject(M);
-    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;
+  /// not available. The caller owns both the MemoryBuffer returned by this
+  /// and the memory it references.
+  virtual MemoryBuffer* getObject(const Module* M) = 0;
 };
 
 }
index e8619385635fdd9467e858abe07ed141918a5d04..09dd92471708dee99f4ff283d8a1644381020225 100644 (file)
@@ -129,7 +129,7 @@ void MCJIT::loadObject(Module *M) {
   OwningPtr<ObjectBuffer> ObjectToLoad;
   // Try to load the pre-compiled object from cache if possible
   if (0 != ObjCache) {
-    OwningPtr<MemoryBuffer> PreCompiledObject(ObjCache->getObjectCopy(M));
+    OwningPtr<MemoryBuffer> PreCompiledObject(ObjCache->getObject(M));
     if (0 != PreCompiledObject.get())
       ObjectToLoad.reset(new ObjectBuffer(PreCompiledObject.take()));
   }
index 32fc292496c55afe0e55760c4f674885026dadb5..2cc045ba97f7b013099ed2d0f463dc1c821b3e66 100644 (file)
@@ -45,6 +45,16 @@ public:
     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
   bool wereDuplicatesInserted() { return DuplicateInserted; }
 
@@ -62,13 +72,6 @@ public:
     return it->second;
   }
 
-protected:
-  virtual const MemoryBuffer* getObject(const Module* M) {
-    const MemoryBuffer* BufferFound = getObjectInternal(M);
-    ModulesLookedUp.insert(M->getModuleIdentifier());
-    return BufferFound;
-  }
-
 private:
   MemoryBuffer *copyBuffer(const MemoryBuffer *Buf) {
     // Create a local copy of the buffer.