stor-layout.c (place_field): Finalize non-constant offset for the field, if any.

* stor-layout.c (place_field): Finalize non-constant offset for the
	field, if any.
ada/
	* gcc-interface/decl.c (create_field_decl_from): Finalize non-constant
	offset for the field, if any.

From-SVN: r209369
This commit is contained in:
Eric Botcazou 2014-04-14 13:33:23 +00:00 committed by Eric Botcazou
parent 069fdd05da
commit cb27986c9b
4 changed files with 16 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2014-04-14 Eric Botcazou <ebotcazou@adacore.com>
* stor-layout.c (place_field): Finalize non-constant offset for the
field, if any.
2014-04-14 Richard Biener <rguenther@suse.de> 2014-04-14 Richard Biener <rguenther@suse.de>
* tree-switch-conversion.c (lshift_cheap_p): Get speed_p * tree-switch-conversion.c (lshift_cheap_p): Get speed_p

View File

@ -1,3 +1,8 @@
2014-04-14 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (create_field_decl_from): Finalize non-constant
offset for the field, if any.
2014-04-09 Eric Botcazou <ebotcazou@adacore.com> 2014-04-09 Eric Botcazou <ebotcazou@adacore.com>
Svante Signell <svante.signell@gmail.com> Svante Signell <svante.signell@gmail.com>

View File

@ -8443,7 +8443,8 @@ create_field_decl_from (tree old_field, tree field_type, tree record_type,
if (!new_pos) if (!new_pos)
{ {
normalize_offset (&pos, &bitpos, offset_align); normalize_offset (&pos, &bitpos, offset_align);
DECL_FIELD_OFFSET (new_field) = pos; /* Finalize the position. */
DECL_FIELD_OFFSET (new_field) = variable_size (pos);
DECL_FIELD_BIT_OFFSET (new_field) = bitpos; DECL_FIELD_BIT_OFFSET (new_field) = bitpos;
SET_DECL_OFFSET_ALIGN (new_field, offset_align); SET_DECL_OFFSET_ALIGN (new_field, offset_align);
DECL_SIZE (new_field) = size; DECL_SIZE (new_field) = size;

View File

@ -1417,6 +1417,10 @@ place_field (record_layout_info rli, tree field)
DECL_FIELD_BIT_OFFSET (field) = rli->bitpos; DECL_FIELD_BIT_OFFSET (field) = rli->bitpos;
SET_DECL_OFFSET_ALIGN (field, rli->offset_align); SET_DECL_OFFSET_ALIGN (field, rli->offset_align);
/* Evaluate nonconstant offsets only once, either now or as soon as safe. */
if (TREE_CODE (DECL_FIELD_OFFSET (field)) != INTEGER_CST)
DECL_FIELD_OFFSET (field) = variable_size (DECL_FIELD_OFFSET (field));
/* If this field ended up more aligned than we thought it would be (we /* If this field ended up more aligned than we thought it would be (we
approximate this by seeing if its position changed), lay out the field approximate this by seeing if its position changed), lay out the field
again; perhaps we can use an integral mode for it now. */ again; perhaps we can use an integral mode for it now. */