diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-05-17 19:44:50 -0400 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-06-10 13:17:04 -0700 |
| commit | 5c5095d25e3652c434c8d4ec178e6844877e3c2d (patch) | |
| tree | c43b05c69fa971a2be82bb62b7f814ddcc4aa1b6 /src/rustllvm/RustWrapper.cpp | |
| parent | 779191cd4b8719e8efdf69fb6da93e2a8905ca1d (diff) | |
| download | rust-5c5095d25e3652c434c8d4ec178e6844877e3c2d.tar.gz rust-5c5095d25e3652c434c8d4ec178e6844877e3c2d.zip | |
Have JIT execution take ownership of the LLVMContextRef
Also stop leaking the ExecutionEngine created for jit code by forcibly disposing of it after the JIT code has finished executing
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 30 |
1 files changed, 12 insertions, 18 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 17eb0f50b9b..30e01b53ab7 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -329,12 +329,12 @@ LLVMRustLoadCrate(void* mem, const char* crate) { return true; } -extern "C" void* -LLVMRustExecuteJIT(void* mem, - LLVMPassManagerRef PMR, - LLVMModuleRef M, - CodeGenOpt::Level OptLevel, - bool EnableSegmentedStacks) { +extern "C" LLVMExecutionEngineRef +LLVMRustBuildJIT(void* mem, + LLVMPassManagerRef PMR, + LLVMModuleRef M, + CodeGenOpt::Level OptLevel, + bool EnableSegmentedStacks) { InitializeNativeTarget(); InitializeNativeTargetAsmPrinter(); @@ -371,21 +371,15 @@ LLVMRustExecuteJIT(void* mem, if(!EE || Err != "") { LLVMRustError = Err.c_str(); - return 0; + // The EngineBuilder only takes ownership of these two structures if the + // create() call is successful, but here it wasn't successful. + LLVMDisposeModule(M); + delete MM; + return NULL; } MM->invalidateInstructionCache(); - Function* func = EE->FindFunctionNamed("_rust_main"); - - if(!func || Err != "") { - LLVMRustError = Err.c_str(); - return 0; - } - - void* entry = EE->getPointerToFunction(func); - assert(entry); - - return entry; + return wrap(EE); } extern "C" bool |
