@@ -55,6 +55,7 @@ export ExecutionEngine, Interpreter, JIT,
5555
5656@checked struct ExecutionEngine
5757 ref:: API.LLVMExecutionEngineRef
58+ mods:: Set{Module}
5859end
5960
6061Base. unsafe_convert (:: Type{API.LLVMExecutionEngineRef} , engine:: ExecutionEngine ) = engine. ref
@@ -64,29 +65,29 @@ function ExecutionEngine(mod::Module)
6465 out_ref = Ref {API.LLVMExecutionEngineRef} ()
6566 out_error = Ref {Cstring} ()
6667 status = convert (Core. Bool, API. LLVMCreateExecutionEngineForModule (out_ref, mod,
67- out_error))
68+ out_error))
6869
6970 if status
7071 error = unsafe_message (out_error[])
7172 throw (LLVMException (error))
7273 end
7374
74- return ExecutionEngine (out_ref[])
75+ return ExecutionEngine (out_ref[], Set ([mod]) )
7576end
7677function Interpreter (mod:: Module )
7778 API. LLVMLinkInInterpreter ()
7879
7980 out_ref = Ref {API.LLVMExecutionEngineRef} ()
8081 out_error = Ref {Cstring} ()
8182 status = convert (Core. Bool, API. LLVMCreateInterpreterForModule (out_ref, mod,
82- out_error))
83+ out_error))
8384
8485 if status
8586 error = unsafe_message (out_error[])
8687 throw (LLVMException (error))
8788 end
8889
89- return ExecutionEngine (out_ref[])
90+ return ExecutionEngine (out_ref[], Set ([mod]) )
9091end
9192function JIT (mod:: Module , optlevel:: API.LLVMCodeGenOptLevel = API. LLVMCodeGenLevelDefault)
9293 API. LLVMLinkInMCJIT ()
@@ -101,10 +102,15 @@ function JIT(mod::Module, optlevel::API.LLVMCodeGenOptLevel=API.LLVMCodeGenLevel
101102 throw (LLVMException (error))
102103 end
103104
104- return ExecutionEngine (out_ref[])
105+ return ExecutionEngine (out_ref[], Set ([mod]) )
105106end
106107
107- dispose (engine:: ExecutionEngine ) = API. LLVMDisposeExecutionEngine (engine)
108+ function dispose (engine:: ExecutionEngine )
109+ for mod in engine. mods
110+ mod. ref = C_NULL
111+ end
112+ API. LLVMDisposeExecutionEngine (engine)
113+ end
108114
109115for x in [:ExecutionEngine , :Interpreter , :JIT ]
110116 @eval function $x (f:: Core.Function , args... )
@@ -123,7 +129,9 @@ Base.push!(engine::ExecutionEngine, mod::Module) = API.LLVMAddModule(engine.ref,
123129function Base. delete! (engine:: ExecutionEngine , mod:: Module )
124130 out_ref = Ref {API.LLVMModuleRef} ()
125131 API. LLVMRemoveModule (engine. ref, mod. ref, out_ref, Ref {Cstring} ()) # out string is not used
126- return Module (out_ref[])
132+ @assert mod == Module (out_ref[])
133+ delete! (engine. mods, mod)
134+ return
127135end
128136
129137Base. run (engine:: ExecutionEngine , f:: Function , args:: Vector{GenericValue} = GenericValue[]) =
0 commit comments