diff --git a/src/backends/llvm.c b/src/backends/llvm.c index 39302c967f7e638e2d0caa3936b9de8237b25c8b..24111452ce56965ea03c4101d12da616ac792f35 100644 --- a/src/backends/llvm.c +++ b/src/backends/llvm.c @@ -116,7 +116,14 @@ int h_llvm_compile(HAllocator* mm__, HParser* parser, const void* params) { char* dump = LLVMPrintModuleToString(mod); fprintf(stderr, "\n\n%s\n\n", dump); // Package up the pointers that comprise the module and stash it in the original HParser - HLLVMParser *llvm_parser = h_new(HLLVMParser, 1); + HLLVMParser *llvm_parser; + if (!(parser->backend_data)) { + llvm_parser = h_new(HLLVMParser, 1); + parser->backend_data = llvm_parser; + } else { + llvm_parser = parser->backend_data; + memset(llvm_parser, 0, sizeof(*llvm_parser)); + } llvm_parser->mod = mod; llvm_parser->func = parse_func; llvm_parser->engine = engine; @@ -130,9 +137,19 @@ int h_llvm_compile(HAllocator* mm__, HParser* parser, const void* params) { void h_llvm_free(HParser *parser) { HLLVMParser *llvm_parser = parser->backend_data; - LLVMDisposeBuilder(llvm_parser->builder); + LLVMModuleRef mod_out; + char *err_out; + + llvm_parser->func = NULL; + LLVMRemoveModule(llvm_parser->engine, llvm_parser->mod, &mod_out, &err_out); LLVMDisposeExecutionEngine(llvm_parser->engine); + llvm_parser->engine = NULL; + + LLVMDisposeBuilder(llvm_parser->builder); + llvm_parser->builder = NULL; + LLVMDisposeModule(llvm_parser->mod); + llvm_parser->mod = NULL; } HParseResult *h_llvm_parse(HAllocator* mm__, const HParser* parser, HInputStream *input_stream) {