[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