tree-flow.h (struct fieldoff): Decompose field to type, size and decl.

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.

From-SVN: r109376
This commit is contained in:
Richard Guenther 2006-01-05 09:58:57 +00:00 committed by Richard Biener
parent 9220c30c89
commit 35ed859b0d
4 changed files with 37 additions and 20 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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)
{

View File

@ -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);