stor-layout.c (place_field): Finalize non-constant offset for the field, if any.
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 14 Apr 2014 13:33:23 +0000 (13:33 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 14 Apr 2014 13:33:23 +0000 (13:33 +0000)
* 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

gcc/ChangeLog
gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/stor-layout.c

index 61e0e21..0bec304 100644 (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>
 
        * tree-switch-conversion.c (lshift_cheap_p): Get speed_p
index b89bfec..a779988 100644 (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>
            Svante Signell <svante.signell@gmail.com>
 
index 4180e59..1e07693 100644 (file)
@@ -8443,7 +8443,8 @@ create_field_decl_from (tree old_field, tree field_type, tree record_type,
   if (!new_pos)
     {
       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;
       SET_DECL_OFFSET_ALIGN (new_field, offset_align);
       DECL_SIZE (new_field) = size;
index 084d195..e3f8406 100644 (file)
@@ -1417,6 +1417,10 @@ place_field (record_layout_info rli, tree field)
   DECL_FIELD_BIT_OFFSET (field) = rli->bitpos;
   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
      approximate this by seeing if its position changed), lay out the field
      again; perhaps we can use an integral mode for it now.  */