summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2006-01-05 09:58:57 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2006-01-05 09:58:57 +0000
commit731d55e7ce85ec145d390e8ab6923af321d854b2 (patch)
treeee642046af609460b576d110ce148485977f3ce5 /gcc
parent3c77e0170281fba1c80ddd18365ef7bcd162128f (diff)
downloadgcc-731d55e7ce85ec145d390e8ab6923af321d854b2.tar.gz
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/tree-flow.h4
-rw-r--r--gcc/tree-ssa-alias.c16
-rw-r--r--gcc/tree-ssa-structalias.c24
4 files changed, 37 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ce301bae890..9b84502af04 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 6065a3b3910..d35b7ddf5f4 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 d7f12c35cea..5813a653b15 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 a3c655cfda1..bae21a02518 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);