decl.c (components_to_record): Do not reorder in non- packed record types if...
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 9 Sep 2017 12:48:41 +0000 (12:48 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 9 Sep 2017 12:48:41 +0000 (12:48 +0000)
* gcc-interface/decl.c (components_to_record): Do not reorder in non-
packed record types if pragma Optimize_Alignment (Space) is enabled.

From-SVN: r251936

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

index 804a79e1c1bf06f62162bb6d1f55912f73ec2cd3..e929eff15fa18ef0f96867621e43390c6a43934f 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (components_to_record): Do not reorder in non-
+       packed record types if pragma Optimize_Alignment (Space) is enabled.
+
 2017-09-09  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/trans.c (Subprogram_Body_to_gnu): Disregard inlining
index f8752c8ae61159dcde88fc814a67ab559e54528c..569e64db626a0983b2d40d0653d979897d9a6d5a 100644 (file)
@@ -7683,7 +7683,9 @@ components_to_record (Node_Id gnat_component_list, Entity_Id gnat_record_type,
      of a byte, so that they don't cause the regular fields to be either at
      self-referential/variable offset or misaligned.  Note, in the latter
      case, that this can only happen in packed record types so the alignment
-     is effectively capped to the byte for the whole record.
+     is effectively capped to the byte for the whole record.  But we don't
+     do it for non-packed record types if pragma Optimize_Alignment (Space)
+     is specified because this can prevent alignment gaps from being filled.
 
      Optionally, if the layout warning is enabled, keep track of the above 4
      different kinds of fields and issue a warning if some of them would be
@@ -7694,6 +7696,8 @@ components_to_record (Node_Id gnat_component_list, Entity_Id gnat_record_type,
   const bool do_reorder
     = (Convention (gnat_record_type) == Convention_Ada
        && !No_Reordering (gnat_record_type)
+       && (!Optimize_Alignment_Space (gnat_record_type)
+          || Is_Packed (gnat_record_type))
        && !debug__debug_flag_dot_r);
   const bool w_reorder
     = (Convention (gnat_record_type) == Convention_Ada