diff mbox series

[c-family] Improve support of simple bit-fields in -fdump-ada-spec

Message ID 2215030.ap2kczX0mK@fomalhaut
State New
Headers show
Series [c-family] Improve support of simple bit-fields in -fdump-ada-spec | expand

Commit Message

Eric Botcazou Nov. 28, 2020, 3:40 p.m. UTC
This fixes an issue with nested structures and adds an Alignment clause to 
counter the effect of the Pack aspect.

Tested on x86_64/Linux, applied on the mainline.


2020-11-28  Eric Botcazou  <ebotcazou@adacore.com>

c-family/
      * 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.
diff mbox series

Patch

diff --git a/gcc/c-family/c-ada-spec.c b/gcc/c-family/c-ada-spec.c
index 266a7fe0fa4..883036f4e5c 100644
--- a/gcc/c-family/c-ada-spec.c
+++ b/gcc/c-family/c-ada-spec.c
@@ -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.  */