gallivm: Separate freeing LLVM intermediate data from freeing final code.
authorFrank Henigman <fjhenigman@google.com>
Tue, 1 Oct 2013 19:15:42 +0000 (15:15 -0400)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 14 May 2014 10:05:00 +0000 (11:05 +0100)
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 <jfonseca@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_init.c
src/gallium/auxiliary/gallivm/lp_bld_init.h

index 982d1db32ccb25596f4009087ead16e544a27175..6feec706bdd0bb024d970d478bbbc30ccbcadab4 100644 (file)
@@ -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);
 }
 
index e405b8a0e609b9d9a5fb946d477bbe9a3ce91ec7..b11e9864839685f4f84c55cfdb7fc5077362e37a 100644 (file)
@@ -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,