diff options
author | Frank Henigman <[email protected]> | 2013-10-01 15:15:42 -0400 |
---|---|---|
committer | José Fonseca <[email protected]> | 2014-05-14 11:05:00 +0100 |
commit | 865d0312c0dd7411ce813206cef3c399d6641241 (patch) | |
tree | 47ed3c8a2a4c2662f8d38d6bbc5baa80bed4407b /src | |
parent | 2c73102dc33bb2ac2475cecd0614a5889db36630 (diff) |
gallivm: Separate freeing LLVM intermediate data from freeing final code.
Split free_gallivm_state() into two steps. First step is
gallivm_free_ir() which cleans up the LLVM scaffolding used to generate
code while preserving the code itself. Second step is
gallivm_free_code() to free the memory occupied by the code.
v2: s/gallivm_teardown/gallivm_free_ir/ (Jose)
Signed-off-by: José Fonseca <[email protected]>
Reviewed-by: Roland Scheidegger <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_init.c | 27 | ||||
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_init.h | 2 |
2 files changed, 22 insertions, 7 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c b/src/gallium/auxiliary/gallivm/lp_bld_init.c index 982d1db32cc..6feec706bdd 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c @@ -182,10 +182,11 @@ create_pass_manager(struct gallivm_state *gallivm) /** - * Free gallivm object's LLVM allocations, but not the gallivm object itself. + * Free gallivm object's LLVM allocations, but not any generated code + * nor the gallivm object itself. */ -static void -free_gallivm_state(struct gallivm_state *gallivm) +void +gallivm_free_ir(struct gallivm_state *gallivm) { if (gallivm->passmgr) { LLVMDisposePassManager(gallivm->passmgr); @@ -212,14 +213,24 @@ free_gallivm_state(struct gallivm_state *gallivm) if (!USE_GLOBAL_CONTEXT && gallivm->context) LLVMContextDispose(gallivm->context); - lp_free_generated_code(gallivm->code); - gallivm->engine = NULL; gallivm->target = NULL; gallivm->module = NULL; gallivm->passmgr = NULL; gallivm->context = NULL; gallivm->builder = NULL; +} + + +/** + * Free LLVM-generated code. Should be done AFTER gallivm_free_ir(). + */ +static void +gallivm_free_code(struct gallivm_state *gallivm) +{ + assert(!gallivm->module); + assert(!gallivm->engine); + lp_free_generated_code(gallivm->code); gallivm->code = NULL; } @@ -366,7 +377,8 @@ init_gallivm_state(struct gallivm_state *gallivm) return TRUE; fail: - free_gallivm_state(gallivm); + gallivm_free_ir(gallivm); + gallivm_free_code(gallivm); return FALSE; } @@ -497,7 +509,8 @@ gallivm_create(void) void gallivm_destroy(struct gallivm_state *gallivm) { - free_gallivm_state(gallivm); + gallivm_free_ir(gallivm); + gallivm_free_code(gallivm); FREE(gallivm); } diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.h b/src/gallium/auxiliary/gallivm/lp_bld_init.h index e405b8a0e60..b11e9864839 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_init.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.h @@ -59,6 +59,8 @@ gallivm_create(void); void gallivm_destroy(struct gallivm_state *gallivm); +void +gallivm_free_ir(struct gallivm_state *gallivm); void gallivm_verify_function(struct gallivm_state *gallivm, |