From 8e59ff5541889817a160afda130bcbcdb70c4b90 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 28 Nov 2020 16:37:12 +0100 Subject: [PATCH] Improve support of simple bit-fields in -fdump-ada-spec 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) : 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 | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) 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. */