summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrank Henigman <[email protected]>2013-10-01 15:15:42 -0400
committerJosé Fonseca <[email protected]>2014-05-14 11:05:00 +0100
commit865d0312c0dd7411ce813206cef3c399d6641241 (patch)
tree47ed3c8a2a4c2662f8d38d6bbc5baa80bed4407b
parent2c73102dc33bb2ac2475cecd0614a5889db36630 (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]>
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_init.c27
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_init.h2
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,