aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGolovanevsky Olga <olga@il.ibm.com>2008-01-25 08:02:54 +0000
committerOlga Golovanevsky <olga@gcc.gnu.org>2008-01-25 08:02:54 +0000
commit1525f2c3a5627b3fd3754c36cbcc7d855f7107cf (patch)
treeb7f43043132a654f9b071fd72aee83a8a848eb0c
parentbd91d74392900e18b3eb5c06ddd39cd06977890a (diff)
downloadgcc-1525f2c3a5627b3fd3754c36cbcc7d855f7107cf.zip
gcc-1525f2c3a5627b3fd3754c36cbcc7d855f7107cf.tar.gz
gcc-1525f2c3a5627b3fd3754c36cbcc7d855f7107cf.tar.bz2
ipa-struct-reorg.c (remove_str_allocs_in_func, [...]): New functions.
2008-01-25 Golovanevsky Olga <olga@il.ibm.com> * ipa-struct-reorg.c (remove_str_allocs_in_func, remove_str_allocs): New functions. (remove_structure): Update allocations list before removing structure. From-SVN: r131818
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-struct-reorg.c43
2 files changed, 47 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cf427b4..392999f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2008-01-25 Golovanevsky Olga <olga@il.ibm.com>
+ * ipa-struct-reorg.c (remove_str_allocs_in_func, remove_str_allocs):
+ New functions.
+ (remove_structure): Update allocations list before removing structure.
+
+2008-01-25 Golovanevsky Olga <olga@il.ibm.com>
+
* ipa-struct-reorg.c (is_safe_cond_expr,
create_new_stmts_for_cond_expr): Use integer_zerop function,
that recognize not only zero-pointer, but zero-integer too.
diff --git a/gcc/ipa-struct-reorg.c b/gcc/ipa-struct-reorg.c
index 9786db4..79a2ffd 100644
--- a/gcc/ipa-struct-reorg.c
+++ b/gcc/ipa-struct-reorg.c
@@ -187,7 +187,7 @@ typedef struct func_alloc_sites *fallocs_t;
typedef const struct func_alloc_sites *const_fallocs_t;
/* All allocation sites in the program. */
-htab_t alloc_sites;
+htab_t alloc_sites = NULL;
/* New global variables. Generated once for whole program. */
htab_t new_global_vars;
@@ -2347,6 +2347,41 @@ dump_access_sites (htab_t accs)
htab_traverse (accs, dump_acc, NULL);
}
+/* This function is a callback for alloc_sites hashtable
+ traversal. SLOT is a pointer to fallocs_t. This function
+ removes all allocations of the structure defined by DATA. */
+
+static int
+remove_str_allocs_in_func (void **slot, void *data)
+{
+ fallocs_t fallocs = *(fallocs_t *) slot;
+ unsigned i = 0;
+ alloc_site_t *call;
+
+ while (VEC_iterate (alloc_site_t, fallocs->allocs, i, call))
+ {
+ if (call->str == (d_str) data)
+ VEC_ordered_remove (alloc_site_t, fallocs->allocs, i);
+ else
+ i++;
+ }
+
+ return 1;
+}
+
+/* This function remove all entries corresponding to the STR structure
+ from alloc_sites hashtable. */
+
+static void
+remove_str_allocs (d_str str)
+{
+ if (!str)
+ return;
+
+ if (alloc_sites)
+ htab_traverse (alloc_sites, remove_str_allocs_in_func, str);
+}
+
/* This function removes the structure with index I from structures vector. */
static void
@@ -2357,7 +2392,11 @@ remove_structure (unsigned i)
if (i >= VEC_length (structure, structures))
return;
- str = VEC_index (structure, structures, i);
+ str = VEC_index (structure, structures, i);
+
+ /* Before removing the structure str, we have to remove its
+ allocations from alloc_sites hashtable. */
+ remove_str_allocs (str);
free_data_struct (str);
VEC_ordered_remove (structure, structures, i);
}