decl.c (components_to_record): Add more comments.
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 1 May 2017 08:12:31 +0000 (08:12 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 1 May 2017 08:12:31 +0000 (08:12 +0000)
* gcc-interface/decl.c (components_to_record): Add more comments.
Put back pending fields onto the regular list if the misalignment
happens to cancel itself.

From-SVN: r247426

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

index 6c9b9474cfd3a68dcdde58c5f6059e5bb62b906c..1b80de8ef3540f0beadab353f0184a6b052f7a3f 100644 (file)
@@ -1,3 +1,9 @@
+2017-05-01  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (components_to_record): Add more comments.
+       Put back pending fields onto the regular list if the misalignment
+       happens to cancel itself.
+
 2017-04-28  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_ch4.adb (Complete_Object_Operation): When rewriting the
index 0c9c78ac10af2db7cd0ae41301d918d2016a6061..c243d40d17bb95c308722c89770ee109e05f5b68 100644 (file)
@@ -7956,6 +7956,10 @@ components_to_record (Node_Id gnat_component_list, Entity_Id gnat_record_type,
      different kinds of fields and issue a warning if some of them would be
      (or are being) reordered by the reordering mechanism.
 
+     Finally, pull out the fields whose size is not a multiple of a byte, so
+     that they don't cause the regular fields to be misaligned.  As this can
+     only happen in packed record types, the alignment is capped to the byte.
+
      ??? If we reorder them, debugging information will be wrong but there is
      nothing that can be done about this at the moment.  */
   const bool do_reorder = OK_To_Reorder_Components (gnat_record_type);
@@ -8155,8 +8159,15 @@ components_to_record (Node_Id gnat_component_list, Entity_Id gnat_record_type,
                             in_variant, do_reorder);
   if (do_reorder)
     {
+      /* If we have pending bit-packed fields on the temporary list, we put
+        them either on the bit-packed list or back on the regular list.  */
       if (gnu_tmp_bitp_list)
-       gnu_bitp_list = chainon (gnu_tmp_bitp_list, gnu_bitp_list);
+       {
+         if (tmp_bitp_size != 0)
+           gnu_bitp_list = chainon (gnu_tmp_bitp_list, gnu_bitp_list);
+         else
+           gnu_field_list = chainon (gnu_tmp_bitp_list, gnu_field_list);
+       }
 
       gnu_field_list
        = chainon (gnu_field_list,