OSDN Git Service

2008-01-25 Golovanevsky Olga <olga@il.ibm.com>
authorolga <olga@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Jan 2008 08:02:54 +0000 (08:02 +0000)
committerolga <olga@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Jan 2008 08:02:54 +0000 (08:02 +0000)
* ipa-struct-reorg.c (remove_str_allocs_in_func, remove_str_allocs):
New functions.
(remove_structure): Update allocations list before removing structure.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131818 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ipa-struct-reorg.c

index cf427b4..392999f 100644 (file)
@@ -1,5 +1,11 @@
 2008-01-25  Golovanevsky Olga  <olga@il.ibm.com>
 
 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.
        * 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.
index 9786db4..79a2ffd 100644 (file)
@@ -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.  */
 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;
 
 /* 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);
 }
 
     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 
 /* 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;
 
   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);
 }
   free_data_struct (str);
   VEC_ordered_remove (structure, structures, i);
 }