From 1525f2c3a5627b3fd3754c36cbcc7d855f7107cf Mon Sep 17 00:00:00 2001 From: Golovanevsky Olga Date: Fri, 25 Jan 2008 08:02:54 +0000 Subject: [PATCH] ipa-struct-reorg.c (remove_str_allocs_in_func, [...]): New functions. 2008-01-25 Golovanevsky Olga * 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 --- gcc/ChangeLog | 6 ++++++ gcc/ipa-struct-reorg.c | 43 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cf427b45ab5..392999fa36f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-01-25 Golovanevsky Olga + + * 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 * ipa-struct-reorg.c (is_safe_cond_expr, diff --git a/gcc/ipa-struct-reorg.c b/gcc/ipa-struct-reorg.c index 9786db47a36..79a2ffddb02 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); }