[PATCH] a68: set names for the DWARF base types
Cupertino Miranda
cupertinomiranda@gmail.com
Sun Sep 27 20:32:29 GMT 2026
DWARF output contained no names for the compiler's base types, so
they were emitted with the type name __unknown__. In dwarf2out.cc,
comments suggest that the __unknown__ type code flow is likely a bug.
a68 frontend never assigned names to its built-in types.
This patch sets a type name for every built-in type during a68
initialization so they are emitted correctly in DWARF output.
Signed-off-by: Cupertino Miranda <cupertinomiranda@gmail.com>
gcc/algol68/ChangeLog
* a68-lang.cc (PUSH_TYPE): Macro definition
(a68_build_a68_type_nodes): Inserted type names using
PUSH_TYPE macro.
(pushdecl): Added logic to insert name to the type
declaration.
---
gcc/algol68/a68-lang.cc | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/gcc/algol68/a68-lang.cc b/gcc/algol68/a68-lang.cc
index 1cefb08c5ab..192e396fb49 100644
--- a/gcc/algol68/a68-lang.cc
+++ b/gcc/algol68/a68-lang.cc
@@ -123,6 +123,13 @@ a68_type_moid (tree type)
return TYPE_LANG_SPECIFIC (type)->moid;
}
+/* Prototyped to avoid a major reordering of the function definitions. */
+static tree pushdecl (tree decl);
+
+#define PUSH_TYPE(name, node) \
+ pushdecl (build_decl (input_location, \
+ TYPE_DECL, get_identifier (name), node))
+
/* Build the type trees in a68_global_trees. */
static void
@@ -138,9 +145,11 @@ a68_build_a68_type_nodes (void)
/* BOOL */
a68_bool_type = boolean_type_node;
+ PUSH_TYPE ("BOOL", a68_bool_type);
/* CHAR */
a68_char_type = uint32_type_node;
+ PUSH_TYPE ("CHAR", a68_char_type);
/* SHORT SHORT INT
SHORT INT
@@ -148,6 +157,9 @@ a68_build_a68_type_nodes (void)
a68_short_short_int_type = signed_char_type_node;
a68_short_int_type = short_integer_type_node;
a68_int_type = integer_type_node;
+ PUSH_TYPE ("SHORT SHORT INT", a68_short_short_int_type);
+ PUSH_TYPE ("SHORT INT", a68_short_int_type);
+ PUSH_TYPE ("INT", a68_int_type);
/* LONG INT */
if (int_size_in_bytes (long_integer_type_node)
@@ -158,6 +170,7 @@ a68_build_a68_type_nodes (void)
a68_long_int_type = long_long_integer_type_node;
else
a68_long_int_type = a68_int_type;
+ PUSH_TYPE ("LONG INT", a68_long_int_type);
/* LONG LONG INT */
if (int_size_in_bytes (long_integer_type_node)
@@ -168,6 +181,7 @@ a68_build_a68_type_nodes (void)
a68_long_long_int_type = long_long_integer_type_node;
else
a68_long_long_int_type = a68_long_int_type;
+ PUSH_TYPE ("LONG LONG INT", a68_long_long_int_type);
/* SHORT SHORT BITS
SHORT BITS
@@ -175,6 +189,9 @@ a68_build_a68_type_nodes (void)
a68_short_short_bits_type = unsigned_char_type_node;
a68_short_bits_type = short_unsigned_type_node;
a68_bits_type = unsigned_type_node;
+ PUSH_TYPE ("SHORT SHORT BITS", a68_short_short_bits_type);
+ PUSH_TYPE ("SHORT BITS", a68_short_bits_type);
+ PUSH_TYPE ("BITS", a68_bits_type);
/* LONG BITS */
if (int_size_in_bytes (long_unsigned_type_node)
@@ -185,6 +202,7 @@ a68_build_a68_type_nodes (void)
a68_long_bits_type = long_long_unsigned_type_node;
else
a68_long_bits_type = a68_bits_type;
+ PUSH_TYPE ("LONG BITS", a68_long_bits_type);
/* LONG LONG BITS */
if (int_size_in_bytes (long_unsigned_type_node)
@@ -195,11 +213,14 @@ a68_build_a68_type_nodes (void)
a68_long_long_bits_type = long_long_unsigned_type_node;
else
a68_long_long_bits_type = a68_long_bits_type;
+ PUSH_TYPE ("LONG LONG BITS", a68_long_long_bits_type);
/* BYTES
LONG BYTES */
a68_bytes_type = unsigned_type_node;
a68_long_bytes_type = long_unsigned_type_node;
+ PUSH_TYPE ("BYTES", a68_bytes_type);
+ PUSH_TYPE ("LONG BYTES", a68_long_bytes_type);
/* REAL
LONG REAL
@@ -207,6 +228,9 @@ a68_build_a68_type_nodes (void)
a68_real_type = float_type_node;
a68_long_real_type = double_type_node;
a68_long_long_real_type = long_double_type_node;
+ PUSH_TYPE ("REAL", a68_real_type);
+ PUSH_TYPE ("LONG REAL", a68_long_real_type);
+ PUSH_TYPE ("LONG LONG REAL", a68_long_long_real_type);
}
/* Language hooks data structures. This is the main interface between
@@ -435,6 +459,16 @@ pushdecl (tree decl)
else
a68_add_decl (decl);
+ /* For the declaration of a type, set its name if it is not already set. */
+
+ if (TREE_CODE (decl) == TYPE_DECL && TYPE_NAME (TREE_TYPE (decl)) == 0)
+ {
+ if (DECL_SOURCE_LINE (decl) == 0)
+ TYPE_NAME (TREE_TYPE (decl)) = decl;
+ else
+ TYPE_NAME (TREE_TYPE (decl)) = DECL_NAME (decl);
+ }
+
return decl;
}
--
2.47.3
More information about the Algol68
mailing list