From 731d55e7ce85ec145d390e8ab6923af321d854b2 Mon Sep 17 00:00:00 2001
From: rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 5 Jan 2006 09:58:57 +0000
Subject: [PATCH] 2006-01-05  Richard Guenther  <rguenther@suse.de>

	* tree-flow.h (struct fieldoff): Decompose field to
	type, size and decl.
	* tree-ssa-alias.c (create_sft): Take type as parameter.
	(create_overlap_variables_for): Store type, size and decl
	in the fieldoff structure.
	* tree-ssa-structalias.c (fieldoff_compare): Adjust users
	of struct fieldoff.
	(push_fields_onto_fieldstack): Likewise.
	(create_variable_info_for): Likewise.  Use offset for the
	SFT name if the decl is not available.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109376 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog              | 13 +++++++++++++
 gcc/tree-flow.h            |  4 +++-
 gcc/tree-ssa-alias.c       | 16 ++++++++--------
 gcc/tree-ssa-structalias.c | 24 +++++++++++++-----------
 4 files changed, 37 insertions(+), 20 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ce301bae890e..9b84502af040 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2006-01-05  Richard Guenther  <rguenther@suse.de>
+
+	* tree-flow.h (struct fieldoff): Decompose field to
+	type, size and decl.
+	* tree-ssa-alias.c (create_sft): Take type as parameter.
+	(create_overlap_variables_for): Store type, size and decl
+	in the fieldoff structure.
+	* tree-ssa-structalias.c (fieldoff_compare): Adjust users
+	of struct fieldoff.
+	(push_fields_onto_fieldstack): Likewise.
+	(create_variable_info_for): Likewise.  Use offset for the
+	SFT name if the decl is not available.
+
 2006-01-04  Paul Brook  <paul@codesourcery.com>
 
 	* config/m68k/m68k.c (m68k_output_mi_thunk): Use jmp, not jsr.
diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h
index 6065a3b39109..d35b7ddf5f47 100644
--- a/gcc/tree-flow.h
+++ b/gcc/tree-flow.h
@@ -863,7 +863,9 @@ tree maybe_fold_tmr (tree);
 
 struct fieldoff
 {
-  tree field;
+  tree type;
+  tree size;
+  tree decl;
   HOST_WIDE_INT offset;  
 };
 typedef struct fieldoff fieldoff_s;
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index d7f12c35cea8..5813a653b158 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -2515,14 +2515,14 @@ get_or_create_used_part_for (size_t uid)
 }
 
 
-/* Create and return a structure sub-variable for field FIELD of
+/* Create and return a structure sub-variable for field type FIELD of
    variable VAR.  */
 
 static tree
 create_sft (tree var, tree field)
 {
   var_ann_t ann;
-  tree subvar = create_tag_raw (STRUCT_FIELD_TAG, TREE_TYPE (field), "SFT");
+  tree subvar = create_tag_raw (STRUCT_FIELD_TAG, field, "SFT");
 
   /* We need to copy the various flags from VAR to SUBVAR, so that
      they are is_global_var iff the original variable was.  */
@@ -2578,9 +2578,9 @@ create_overlap_variables_for (tree var)
 
       for (i = 0; VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
 	{
-	  if (!DECL_SIZE (fo->field) 
-	      || TREE_CODE (DECL_SIZE (fo->field)) != INTEGER_CST
-	      || TREE_CODE (TREE_TYPE (fo->field)) == ARRAY_TYPE
+	  if (!fo->size
+	      || TREE_CODE (fo->size) != INTEGER_CST
+	      || TREE_CODE (fo->type) == ARRAY_TYPE
 	      || fo->offset < 0)
 	    {
 	      notokay = true;
@@ -2632,8 +2632,8 @@ create_overlap_variables_for (tree var)
 	  HOST_WIDE_INT fosize;
 	  tree currfotype;
 
-	  fosize = TREE_INT_CST_LOW (DECL_SIZE (fo->field));
-	  currfotype = TREE_TYPE (fo->field);
+	  fosize = TREE_INT_CST_LOW (fo->size);
+	  currfotype = fo->type;
 
 	  /* If this field isn't in the used portion,
 	     or it has the exact same offset and size as the last
@@ -2650,7 +2650,7 @@ create_overlap_variables_for (tree var)
 	  sv->offset = fo->offset;
 	  sv->size = fosize;
 	  sv->next = *subvars;
-	  sv->var = create_sft (var, fo->field);
+	  sv->var = create_sft (var, fo->type);
 
 	  if (dump_file)
 	    {
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index a3c655cfda1b..bae21a02518a 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -3540,8 +3540,8 @@ fieldoff_compare (const void *pa, const void *pb)
   if (foa->offset != fob->offset)
     return foa->offset - fob->offset;
 
-  foasize = TREE_INT_CST_LOW (DECL_SIZE (foa->field));
-  fobsize = TREE_INT_CST_LOW (DECL_SIZE (fob->field));
+  foasize = TREE_INT_CST_LOW (foa->size);
+  fobsize = TREE_INT_CST_LOW (fob->size);
   return foasize - fobsize;
 }
 
@@ -3597,7 +3597,9 @@ push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
 	    fieldoff_s *pair;
 
 	    pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
-	    pair->field = field;
+	    pair->type = TREE_TYPE (field);
+	    pair->size = DECL_SIZE (field);
+	    pair->decl = field;
 	    pair->offset = offset + bitpos_of_field (field);
 	    count++;
 	  }
@@ -3842,12 +3844,11 @@ create_variable_info_for (tree decl, const char *name)
       unsigned int newindex = VEC_length (varinfo_t, varmap);
       fieldoff_s *fo = NULL;
       unsigned int i;
-      tree field;
 
       for (i = 0; !notokay && VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
 	{
-	  if (!DECL_SIZE (fo->field) 
-	      || TREE_CODE (DECL_SIZE (fo->field)) != INTEGER_CST
+	  if (! fo->size
+	      || TREE_CODE (fo->size) != INTEGER_CST
 	      || fo->offset < 0)
 	    {
 	      notokay = true;
@@ -3882,8 +3883,7 @@ create_variable_info_for (tree decl, const char *name)
 	  return index;
 	}
       
-      field = fo->field;
-      vi->size = TREE_INT_CST_LOW (DECL_SIZE (field));
+      vi->size = TREE_INT_CST_LOW (fo->size);
       vi->offset = fo->offset;
       for (i = 1; VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
 	{
@@ -3891,14 +3891,16 @@ create_variable_info_for (tree decl, const char *name)
 	  const char *newname;
 	  char *tempname;
 
-	  field = fo->field;
 	  newindex = VEC_length (varinfo_t, varmap);
-	  asprintf (&tempname, "%s.%s", vi->name, alias_get_name (field));
+	  if (fo->decl)
+	    asprintf (&tempname, "%s.%s", vi->name, alias_get_name (fo->decl));
+	  else
+	    asprintf (&tempname, "%s." HOST_WIDE_INT_PRINT_DEC, vi->name, fo->offset);
 	  newname = ggc_strdup (tempname);
 	  free (tempname);
 	  newvi = new_var_info (decl, newindex, newname, newindex);
 	  newvi->offset = fo->offset;
-	  newvi->size = TREE_INT_CST_LOW (DECL_SIZE (field));
+	  newvi->size = TREE_INT_CST_LOW (fo->size);
 	  newvi->fullsize = vi->fullsize;
 	  insert_into_field_list (vi, newvi);
 	  VEC_safe_push (varinfo_t, heap, varmap, newvi);
-- 
GitLab