Improve support of simple bit-fields in -fdump-ada-spec
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 28 Nov 2020 15:37:12 +0000 (16:37 +0100)
committerEric Botcazou <ebotcazou@adacore.com>
Sat, 28 Nov 2020 15:39:20 +0000 (16:39 +0100)
This fixes an issue with nested structures and adds an Alignment clause
to counter the effect of the Pack aspect.

gcc/c-family/ChangeLog:
* c-ada-spec.c (dump_nested_type) <RECORD_TYPE>: Remove obsolete code.
(dump_ada_structure): Also deal with convention, unchecked union and
bit-field for nested types.  In the latter case, print an Alignment
aspect along with the Pack aspect.

gcc/c-family/c-ada-spec.c

index 266a7fe0fa439a5566f40e6ffb135dd81a4ee914..883036f4e5c900f9f761caf2485d2d4ff1eb6aaa 100644 (file)
@@ -2598,16 +2598,6 @@ dump_nested_type (pretty_printer *buffer, tree field, tree t, tree parent,
 
       pp_string (buffer, " is ");
       dump_ada_structure (buffer, field_type, t, true, spc);
-
-      pp_string (buffer, "with Convention => C_Pass_By_Copy");
-
-      if (TREE_CODE (field_type) == UNION_TYPE)
-       {
-         pp_comma (buffer);
-         newline_and_indent (buffer, spc + 5);
-         pp_string (buffer, "Unchecked_Union => True");
-       }
-
       pp_semicolon (buffer);
       newline_and_indent (buffer, spc);
       break;
@@ -3318,10 +3308,7 @@ dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested,
   newline_and_indent (buffer, spc);
 
   /* We disregard the methods for anonymous nested types.  */
-  if (nested)
-    return;
-
-  if (has_nontrivial_methods (node))
+  if (has_nontrivial_methods (node) && !nested)
     {
       pp_string (buffer, "with Import => True,");
       newline_and_indent (buffer, spc + 5);
@@ -3339,12 +3326,20 @@ dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested,
 
   if (bitfield_used)
     {
+      char buf[32];
       pp_comma (buffer);
       newline_and_indent (buffer, spc + 5);
       pp_string (buffer, "Pack => True");
+      pp_comma (buffer);
+      newline_and_indent (buffer, spc + 5);
+      sprintf (buf, "Alignment => %d", TYPE_ALIGN (node) / BITS_PER_UNIT);
+      pp_string (buffer, buf);
       bitfield_used = false;
     }
 
+  if (nested)
+    return;
+
   need_semicolon = !dump_ada_methods (buffer, node, spc);
 
   /* Print the static fields of the structure, if any.  */