aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-family/c-ada-spec.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/c-family/c-ada-spec.c')
-rw-r--r--gcc/c-family/c-ada-spec.c116
1 files changed, 52 insertions, 64 deletions
diff --git a/gcc/c-family/c-ada-spec.c b/gcc/c-family/c-ada-spec.c
index 751cc0e..a2669c6 100644
--- a/gcc/c-family/c-ada-spec.c
+++ b/gcc/c-family/c-ada-spec.c
@@ -408,8 +408,8 @@ dump_ada_macros (pretty_printer *pp, const char* file)
}
else
{
- chars_seen = sprintf
- ((char *) buffer, "Character'Val (%d)", (int) c);
+ chars_seen = sprintf ((char *) buffer,
+ "Character'Val (%d)", (int) c);
buffer += chars_seen;
}
}
@@ -611,7 +611,7 @@ dump_ada_macros (pretty_printer *pp, const char* file)
pp_string (pp, "; -- ");
pp_string (pp, sloc.file);
pp_colon (pp);
- pp_scalar (pp, "%d", sloc.line);
+ pp_decimal_int (pp, sloc.line);
pp_newline (pp);
}
else
@@ -1464,28 +1464,21 @@ dump_ada_decl_name (pretty_printer *buffer, tree decl, bool limited_access)
{
pp_string (buffer, "anon");
if (TREE_CODE (decl) == FIELD_DECL)
- pp_scalar (buffer, "%d", DECL_UID (decl));
+ pp_decimal_int (buffer, DECL_UID (decl));
else
- pp_scalar (buffer, "%d", TYPE_UID (TREE_TYPE (decl)));
+ pp_decimal_int (buffer, TYPE_UID (TREE_TYPE (decl)));
}
else if (TREE_CODE (type_name) == IDENTIFIER_NODE)
pp_ada_tree_identifier (buffer, type_name, decl, limited_access);
}
}
-/* Dump in BUFFER a name for the type T, which is a _TYPE without TYPE_NAME.
- PARENT is the parent node of T. */
+/* Dump in BUFFER a name for the type T, which is a TYPE without TYPE_NAME. */
static void
-dump_anonymous_type_name (pretty_printer *buffer, tree t, tree parent)
+dump_anonymous_type_name (pretty_printer *buffer, tree t)
{
- if (DECL_NAME (parent))
- pp_ada_tree_identifier (buffer, DECL_NAME (parent), parent, false);
- else
- {
- pp_string (buffer, "anon");
- pp_scalar (buffer, "%d", TYPE_UID (TREE_TYPE (parent)));
- }
+ pp_string (buffer, "anon");
switch (TREE_CODE (t))
{
@@ -1506,7 +1499,7 @@ dump_anonymous_type_name (pretty_printer *buffer, tree t, tree parent)
break;
}
- pp_scalar (buffer, "%d", TYPE_UID (t));
+ pp_decimal_int (buffer, TYPE_UID (t));
}
/* Dump in BUFFER aspect Import on a given node T. SPC is the current
@@ -1757,12 +1750,12 @@ dump_sloc (pretty_printer *buffer, tree node)
{
expanded_location xloc;
- xloc.file = NULL;
-
if (DECL_P (node))
xloc = expand_location (DECL_SOURCE_LOCATION (node));
else if (EXPR_HAS_LOCATION (node))
xloc = expand_location (EXPR_LOCATION (node));
+ else
+ xloc.file = NULL;
if (xloc.file)
{
@@ -1790,11 +1783,11 @@ is_char_array (tree t)
&& id_equal (DECL_NAME (TYPE_NAME (t)), "char");
}
-/* Dump in BUFFER an array type NODE of type TYPE in Ada syntax. SPC is the
- indentation level. */
+/* Dump in BUFFER an array type NODE in Ada syntax. SPC is the indentation
+ level. */
static void
-dump_ada_array_type (pretty_printer *buffer, tree node, tree type, int spc)
+dump_ada_array_type (pretty_printer *buffer, tree node, int spc)
{
const bool char_array = is_char_array (node);
@@ -1823,8 +1816,8 @@ dump_ada_array_type (pretty_printer *buffer, tree node, tree type, int spc)
|| (!RECORD_OR_UNION_TYPE_P (tmp)
&& TREE_CODE (tmp) != ENUMERAL_TYPE))
dump_ada_node (buffer, tmp, node, spc, false, true);
- else if (type)
- dump_anonymous_type_name (buffer, tmp, type);
+ else
+ dump_anonymous_type_name (buffer, tmp);
}
}
@@ -1954,11 +1947,10 @@ is_simple_enum (tree node)
}
/* Dump in BUFFER the declaration of enumeral NODE of type TYPE in Ada syntax.
- PARENT is the parent node of NODE. SPC is the indentation level. */
+ SPC is the indentation level. */
static void
-dump_ada_enum_type (pretty_printer *buffer, tree node, tree type, tree parent,
- int spc)
+dump_ada_enum_type (pretty_printer *buffer, tree node, tree type, int spc)
{
if (is_simple_enum (node))
{
@@ -2005,7 +1997,7 @@ dump_ada_enum_type (pretty_printer *buffer, tree node, tree type, tree parent,
else if (type)
dump_ada_node (buffer, type, NULL_TREE, spc, false, true);
else
- dump_anonymous_type_name (buffer, node, parent);
+ dump_anonymous_type_name (buffer, node);
pp_underscore (buffer);
pp_ada_tree_identifier (buffer, TREE_PURPOSE (value), node, false);
@@ -2016,7 +2008,7 @@ dump_ada_enum_type (pretty_printer *buffer, tree node, tree type, tree parent,
else if (type)
dump_ada_node (buffer, type, NULL_TREE, spc, false, true);
else
- dump_anonymous_type_name (buffer, node, parent);
+ dump_anonymous_type_name (buffer, node);
pp_string (buffer, " := ");
dump_ada_node (buffer, int_val, node, spc, false, true);
@@ -2106,7 +2098,7 @@ dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc,
if (name_only)
dump_ada_node (buffer, TYPE_NAME (node), node, spc, false, true);
else
- dump_ada_enum_type (buffer, node, type, NULL_TREE, spc);
+ dump_ada_enum_type (buffer, node, type, spc);
break;
case REAL_TYPE:
@@ -2116,6 +2108,7 @@ dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc,
pp_string (buffer, "Extensions.Float_128");
break;
}
+
/* fallthrough */
case INTEGER_TYPE:
@@ -2298,7 +2291,7 @@ dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc,
dump_ada_node (buffer, TYPE_NAME (node), node, spc, limited_access,
true);
else
- dump_ada_array_type (buffer, node, type, spc);
+ dump_ada_array_type (buffer, node, spc);
break;
case RECORD_TYPE:
@@ -2490,7 +2483,12 @@ dump_forward_type (pretty_printer *buffer, tree type, tree t, int spc)
TREE_VISITED (decl) = 1;
}
-static void dump_nested_type (pretty_printer *, tree, tree, tree, bitmap, int);
+/* Bitmap of anonymous types already dumped. Anonymous array types are shared
+ throughout the compilation so it needs to be global. */
+
+static bitmap dumped_anonymous_types;
+
+static void dump_nested_type (pretty_printer *, tree, tree, int);
/* Dump in BUFFER anonymous types nested inside T's definition. PARENT is the
parent node of T. DUMPED_TYPES is the bitmap of already dumped types. SPC
@@ -2506,8 +2504,7 @@ static void dump_nested_type (pretty_printer *, tree, tree, tree, bitmap, int);
pass on the nested TYPE_DECLs and a second pass on the unnamed types. */
static void
-dump_nested_types_1 (pretty_printer *buffer, tree t, tree parent,
- bitmap dumped_types, int spc)
+dump_nested_types (pretty_printer *buffer, tree t, int spc)
{
tree type, field;
@@ -2521,31 +2518,18 @@ dump_nested_types_1 (pretty_printer *buffer, tree t, tree parent,
&& DECL_NAME (field) != DECL_NAME (t)
&& !DECL_ORIGINAL_TYPE (field)
&& TYPE_NAME (TREE_TYPE (field)) != TYPE_NAME (type))
- dump_nested_type (buffer, field, t, parent, dumped_types, spc);
+ dump_nested_type (buffer, field, t, spc);
for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
if (TREE_CODE (field) == FIELD_DECL && !TYPE_NAME (TREE_TYPE (field)))
- dump_nested_type (buffer, field, t, parent, dumped_types, spc);
+ dump_nested_type (buffer, field, t, spc);
}
-/* Likewise, but to be invoked only at top level. We dump each anonymous type
- nested inside T's definition exactly once, even if it is referenced several
- times in it (typically an array type), with a name prefixed by that of T. */
+/* Dump in BUFFER the anonymous type of FIELD inside T. SPC is the indentation
+ level. */
static void
-dump_nested_types (pretty_printer *buffer, tree t, int spc)
-{
- auto_bitmap dumped_types;
- dump_nested_types_1 (buffer, t, t, dumped_types, spc);
-}
-
-/* Dump in BUFFER the anonymous type of FIELD inside T. PARENT is the parent
- node of T. DUMPED_TYPES is the bitmap of already dumped types. SPC is the
- indentation level. */
-
-static void
-dump_nested_type (pretty_printer *buffer, tree field, tree t, tree parent,
- bitmap dumped_types, int spc)
+dump_nested_type (pretty_printer *buffer, tree field, tree t, int spc)
{
tree field_type = TREE_TYPE (field);
tree decl, tmp;
@@ -2559,7 +2543,7 @@ dump_nested_type (pretty_printer *buffer, tree field, tree t, tree parent,
case ARRAY_TYPE:
/* Anonymous array types are shared. */
- if (!bitmap_set_bit (dumped_types, TYPE_UID (field_type)))
+ if (!bitmap_set_bit (dumped_anonymous_types, TYPE_UID (field_type)))
return;
/* Recurse on the element type if need be. */
@@ -2573,7 +2557,7 @@ dump_nested_type (pretty_printer *buffer, tree field, tree t, tree parent,
&& !TREE_VISITED (decl))
{
/* Generate full declaration. */
- dump_nested_type (buffer, decl, t, parent, dumped_types, spc);
+ dump_nested_type (buffer, decl, t, spc);
TREE_VISITED (decl) = 1;
}
else if (!decl && TREE_CODE (tmp) == POINTER_TYPE)
@@ -2585,9 +2569,9 @@ dump_nested_type (pretty_printer *buffer, tree field, tree t, tree parent,
else
pp_string (buffer, "type ");
- dump_anonymous_type_name (buffer, field_type, parent);
+ dump_anonymous_type_name (buffer, field_type);
pp_string (buffer, " is ");
- dump_ada_array_type (buffer, field_type, parent, spc);
+ dump_ada_array_type (buffer, field_type, spc);
pp_semicolon (buffer);
newline_and_indent (buffer, spc);
break;
@@ -2601,23 +2585,23 @@ dump_nested_type (pretty_printer *buffer, tree field, tree t, tree parent,
if (TYPE_NAME (field_type))
dump_ada_node (buffer, field_type, NULL_TREE, spc, false, true);
else
- dump_anonymous_type_name (buffer, field_type, parent);
+ dump_anonymous_type_name (buffer, field_type);
pp_string (buffer, " is ");
- dump_ada_enum_type (buffer, field_type, NULL_TREE, parent, spc);
+ dump_ada_enum_type (buffer, field_type, NULL_TREE, spc);
pp_semicolon (buffer);
newline_and_indent (buffer, spc);
break;
case RECORD_TYPE:
case UNION_TYPE:
- dump_nested_types_1 (buffer, field, parent, dumped_types, spc);
+ dump_nested_types (buffer, field, spc);
pp_string (buffer, "type ");
if (TYPE_NAME (field_type))
dump_ada_node (buffer, field_type, NULL_TREE, spc, false, true);
else
- dump_anonymous_type_name (buffer, field_type, parent);
+ dump_anonymous_type_name (buffer, field_type);
if (TREE_CODE (field_type) == UNION_TYPE)
pp_string (buffer, " (discr : unsigned := 0)");
@@ -2953,7 +2937,7 @@ dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc)
if (orig && TYPE_NAME (orig))
dump_ada_node (buffer, TYPE_NAME (orig), type, spc, false, true);
else
- dump_ada_array_type (buffer, TREE_TYPE (t), type, spc);
+ dump_ada_array_type (buffer, TREE_TYPE (t), spc);
}
else
{
@@ -2968,9 +2952,9 @@ dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc)
if (TYPE_NAME (TREE_TYPE (t)))
dump_ada_node (buffer, TREE_TYPE (t), type, spc, false, true);
else if (type)
- dump_anonymous_type_name (buffer, TREE_TYPE (t), type);
+ dump_anonymous_type_name (buffer, TREE_TYPE (t));
else
- dump_ada_array_type (buffer, TREE_TYPE (t), type, spc);
+ dump_ada_array_type (buffer, TREE_TYPE (t), spc);
}
}
else if (TREE_CODE (t) == FUNCTION_DECL)
@@ -3206,7 +3190,7 @@ dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc)
&& TREE_CODE (TREE_TYPE (t)) != ENUMERAL_TYPE))
dump_ada_node (buffer, TREE_TYPE (t), t, spc, false, true);
else if (type)
- dump_anonymous_type_name (buffer, TREE_TYPE (t), type);
+ dump_anonymous_type_name (buffer, TREE_TYPE (t));
}
}
@@ -3516,7 +3500,11 @@ dump_ada_specs (void (*collect_all_refs)(const char *),
/* Iterate over the list of files to dump specs for. */
for (int i = 0; i < source_refs_used; i++)
- dump_ads (source_refs[i], collect_all_refs, check);
+ {
+ dumped_anonymous_types = BITMAP_ALLOC (NULL);
+ dump_ads (source_refs[i], collect_all_refs, check);
+ BITMAP_FREE (dumped_anonymous_types);
+ }
/* Free various tables. */
free (source_refs);