[Mesa-dev] [PATCH 3/3] nir: fix nir_shader_clone() and nir_sweep()

Timothy Arceri timothy.arceri at collabora.com
Wed Nov 2 22:18:19 UTC 2016


These were broken in e1af20f18a8 when the info field in nir_shader was
turned into a pointer.

Clone was copying the pointer rather than the data and nir_sweep was
cleaning up shader_info rather than claiming it.

Cc: Eric Anholt <eric at anholt.net>
---
 src/compiler/nir/nir_clone.c | 2 +-
 src/compiler/nir/nir_sweep.c | 8 ++++++++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/compiler/nir/nir_clone.c b/src/compiler/nir/nir_clone.c
index f23fabc..4f7bdd9 100644
--- a/src/compiler/nir/nir_clone.c
+++ b/src/compiler/nir/nir_clone.c
@@ -710,7 +710,7 @@ nir_shader_clone(void *mem_ctx, const nir_shader *s)
    clone_reg_list(&state, &ns->registers, &s->registers);
    ns->reg_alloc = s->reg_alloc;
 
-   ns->info = s->info;
+   *ns->info = *s->info;
    ns->info->name = ralloc_strdup(ns, ns->info->name);
    if (ns->info->label)
       ns->info->label = ralloc_strdup(ns, ns->info->label);
diff --git a/src/compiler/nir/nir_sweep.c b/src/compiler/nir/nir_sweep.c
index faf696d..e6ae298 100644
--- a/src/compiler/nir/nir_sweep.c
+++ b/src/compiler/nir/nir_sweep.c
@@ -150,9 +150,17 @@ nir_sweep(nir_shader *nir)
 {
    void *rubbish = ralloc_context(NULL);
 
+   /* The shader may not own shader_info so check first */
+   bool steal_info = false;
+   if (nir == ralloc_parent(nir->info))
+      steal_info = true;
+
    /* First, move ownership of all the memory to a temporary context; assume dead. */
    ralloc_adopt(rubbish, nir);
 
+   if (steal_info)
+      ralloc_steal(nir, nir->info);
+
    ralloc_steal(nir, (char *)nir->info->name);
    if (nir->info->label)
       ralloc_steal(nir, (char *)nir->info->label);
-- 
2.7.4



More information about the mesa-dev mailing list