Let SourceInfo take charage of and LLVM module.
I.e., a module never escapes from its associated SourceInfo object.
Change-Id: Ib7fe914052e8b1b06b879737f57828739d54e0f0
diff --git a/lib/ExecutionEngine/SourceInfo.cpp b/lib/ExecutionEngine/SourceInfo.cpp
index 019ecb1..9c49fcc 100644
--- a/lib/ExecutionEngine/SourceInfo.cpp
+++ b/lib/ExecutionEngine/SourceInfo.cpp
@@ -34,6 +34,9 @@
#include <bcc/bcc.h>
#include <bcc/bcc_cache.h>
+#include <llvm/Bitcode/ReaderWriter.h>
+#include <llvm/Module.h>
+#include <llvm/LLVMContext.h>
#include <llvm/ADT/OwningPtr.h>
#include <llvm/ADT/StringRef.h>
#include <llvm/Support/MemoryBuffer.h>
@@ -114,7 +117,7 @@
}
result->type = SourceKind::Module;
- result->module.reset(module);
+ result->module = module;
result->flags = flags;
#if USE_CACHE
@@ -133,44 +136,63 @@
}
-int SourceInfo::prepareModule(ScriptCompiled *SC) {
+int SourceInfo::prepareModule(llvm::LLVMContext *context) {
+ if (module)
+ return 0;
+
+ llvm::OwningPtr<llvm::MemoryBuffer> mem;
+ std::string errmsg;
+
switch (type) {
case SourceKind::Buffer:
{
- llvm::OwningPtr<llvm::MemoryBuffer> MEM(
- llvm::MemoryBuffer::getMemBuffer(
+ mem.reset(llvm::MemoryBuffer::getMemBuffer(
llvm::StringRef(buffer.bitcode, buffer.bitcodeSize)));
- if (!MEM.get()) {
+ if (!mem.get()) {
ALOGE("Unable to MemoryBuffer::getMemBuffer(addr=%p, size=%lu)\n",
- buffer.bitcode, (unsigned long)buffer.bitcodeSize);
+ buffer.bitcode, (unsigned long)buffer.bitcodeSize);
return 1;
}
-
- module.reset(SC->parseBitcodeFile(MEM.get()));
}
break;
case SourceKind::File:
{
- llvm::OwningPtr<llvm::MemoryBuffer> MEM;
-
- if (llvm::error_code ec = llvm::MemoryBuffer::getFile(file.path, MEM)) {
- ALOGE("Unable to MemoryBuffer::getFile(path=%s)\n", file.path);
+ if (llvm::error_code ec = llvm::MemoryBuffer::getFile(file.path, mem)) {
+ ALOGE("Unable to MemoryBuffer::getFile(path=%s, %s)\n",
+ file.path, ec.message().c_str());
return 1;
}
-
- module.reset(SC->parseBitcodeFile(MEM.get()));
}
break;
default:
+ return 0;
break;
}
- return (module.get()) ? 0 : 1;
+ if (context)
+ shared_context = true;
+ else
+ context = new llvm::LLVMContext();
+
+ module = llvm::ParseBitcodeFile(mem.get(), *context, &errmsg);
+ if (module == NULL) {
+ ALOGE("Unable to ParseBitcodeFile: %s\n", errmsg.c_str());
+ if (!shared_context)
+ delete context;
+ }
+
+ return (module == NULL);
}
+SourceInfo::~SourceInfo() {
+ llvm::LLVMContext *context = &module->getContext();
+ delete module;
+ if (!shared_context)
+ delete context;
+}
#if USE_CACHE
template <typename T> void SourceInfo::introDependency(T &checker) {