Print Ada type name in more cases
authorTom Tromey <tromey@adacore.com>
Wed, 4 Nov 2020 16:17:58 +0000 (09:17 -0700)
committerTom Tromey <tromey@adacore.com>
Wed, 4 Nov 2020 16:17:58 +0000 (09:17 -0700)
In some cases the name of an Ada type cannot be decoded by
decoded_type_name.  For example, the name
"p__complex_variable_record_type__T9s" in the included test case is
rejected due to the "T".  This causes ptype to display the full
contents of a record type -- when in fact the name is available and
ought to be printed.

Fixing this in decoded_type_name isn't possible because the "__T" name
is not the real name of the type -- it is just a compiler-assigned
name of convenience.

This patch fixes the problem by using the resolved type's name when
the original type's name isn't suitable.

gdb/ChangeLog
2020-11-04  Tom Tromey  <tromey@adacore.com>

* ada-typeprint.c (ada_print_type): Handle __T types.

gdb/testsuite/ChangeLog
2020-11-04  Tom Tromey  <tromey@adacore.com>

* gdb.ada/rec_ptype.exp: New file.
* gdb.ada/rec_ptype/main.adb: New file.
* gdb.ada/rec_ptype/p.ads: New file.

gdb/ChangeLog
gdb/ada-typeprint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/rec_ptype.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/rec_ptype/main.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/rec_ptype/p.ads [new file with mode: 0644]

index 913b7ecc5e15958d3a6d941d12eb8c343b3d5cb0..478da8238f5064ff4ebadaa2f85453f748d83857 100644 (file)
@@ -1,3 +1,7 @@
+2020-11-04  Tom Tromey  <tromey@adacore.com>
+
+       * ada-typeprint.c (ada_print_type): Handle __T types.
+
 2020-11-04  Tom Tromey  <tromey@adacore.com>
 
        * dwarf2/read.c (add_partial_symbol, process_die):
index 11cc51cf106dfe3dcbb9c1baeb00c7e6d29ad325..0892c7c3dcd9dd7be230e44115daa82cd1f7151e 100644 (file)
@@ -955,7 +955,20 @@ ada_print_type (struct type *type0, const char *varstring,
                const struct type_print_options *flags)
 {
   struct type *type = ada_check_typedef (ada_get_base_type (type0));
-  char *type_name = decoded_type_name (type0);
+  /* If we can decode the original type name, use it.  However, there
+     are cases where the original type is an internally-generated type
+     with a name that can't be decoded (and whose encoded name might
+     not actually bear any relation to the type actually declared in
+     the sources). In that case, try using the name of the base type
+     in its place.
+
+     Note that we looked at the possibility of always using the name
+     of the base type. This does not always work, unfortunately, as
+     there are situations where it's the base type which has an
+     internally-generated name.  */
+  const char *type_name = decoded_type_name (type0);
+  if (type_name == nullptr)
+    type_name = decoded_type_name (type);
   int is_var_decl = (varstring != NULL && varstring[0] != '\0');
 
   if (type == NULL)
index 745413a2e7a8074026c2b6e835191bc9f4357529..6927735324f61c4bca9da807459a670cc1452d8b 100644 (file)
@@ -1,3 +1,9 @@
+2020-11-04  Tom Tromey  <tromey@adacore.com>
+
+       * gdb.ada/rec_ptype.exp: New file.
+       * gdb.ada/rec_ptype/main.adb: New file.
+       * gdb.ada/rec_ptype/p.ads: New file.
+
 2020-11-04  Tom Tromey  <tromey@adacore.com>
 
        * gdb.ada/tick_length_array_enum_idx.exp: Add ptype test.
diff --git a/gdb/testsuite/gdb.ada/rec_ptype.exp b/gdb/testsuite/gdb.ada/rec_ptype.exp
new file mode 100644 (file)
index 0000000..0639f55
--- /dev/null
@@ -0,0 +1,42 @@
+# Copyright 2020 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib "ada.exp"
+
+if { [skip_ada_tests] } { return -1 }
+
+standard_ada_testfile main
+
+# Note we don't test the "none" (no -fgnat-encodings option) scenario
+# here, because "all" and "minimal" cover the cases, and this way we
+# don't have to update the test when gnat changes its default.
+foreach_with_prefix scenario {all minimal} {
+    set flags [list debug additional_flags=-fgnat-encodings=$scenario]
+
+    if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $flags] != ""} {
+       return -1
+    }
+
+    clean_restart ${testfile}
+
+    set bp_location [gdb_get_line_number "STOP" ${testdir}/main.adb]
+    runto "main.adb:$bp_location"
+
+    gdb_test "ptype Test.top_level_record_complex_record" \
+       [multi_line "type = record" \
+            "    kind: p.kind_type;" \
+            "    complex_variable_record_variable_record: p.variable_record_type;" \
+            "end record"]
+}
diff --git a/gdb/testsuite/gdb.ada/rec_ptype/main.adb b/gdb/testsuite/gdb.ada/rec_ptype/main.adb
new file mode 100644 (file)
index 0000000..b54ce78
--- /dev/null
@@ -0,0 +1,23 @@
+--  Copyright 2020 Free Software Foundation, Inc.
+--
+--  This program is free software; you can redistribute it and/or modify
+--  it under the terms of the GNU General Public License as published by
+--  the Free Software Foundation; either version 3 of the License, or
+--  (at your option) any later version.
+--
+--  This program is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY; without even the implied warranty of
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--  GNU General Public License for more details.
+--
+--  You should have received a copy of the GNU General Public License
+--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+with P; use P;
+
+procedure Main is
+   Test : Top_Level_Record_Type := Top_Level_Record_Type'
+     (Top_Level_Record_Complex_Record => (Kind => A_Kind, others => <>));
+begin
+   null; -- STOP
+end Main;
diff --git a/gdb/testsuite/gdb.ada/rec_ptype/p.ads b/gdb/testsuite/gdb.ada/rec_ptype/p.ads
new file mode 100644 (file)
index 0000000..a175f4a
--- /dev/null
@@ -0,0 +1,48 @@
+--  Copyright 2020 Free Software Foundation, Inc.
+--
+--  This program is free software; you can redistribute it and/or modify
+--  it under the terms of the GNU General Public License as published by
+--  the Free Software Foundation; either version 3 of the License, or
+--  (at your option) any later version.
+--
+--  This program is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY; without even the implied warranty of
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--  GNU General Public License for more details.
+--
+--  You should have received a copy of the GNU General Public License
+--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+package P is
+
+   type Kind_Type is (No_Kind, A_Kind, B_Kind);
+
+   type PID_Type is new Integer;
+   Default_Value : constant PID_Type := 0;
+
+   type Name_Type is array (1 ..3) of Character;
+   Name_Default_Value : constant Name_Type := "AAA";
+
+   type Variable_Record_Type(Kind : Kind_Type := No_Kind) is record
+      case Kind is
+         when A_Kind =>
+            Variable_Record_A : PID_Type := Default_Value;
+
+         when B_Kind =>
+            Variable_Record_B : Name_Type := Name_Default_Value;
+
+         when No_Kind =>
+            null;
+
+      end case;
+   end record;
+
+   type Complex_Variable_Record_Type (Kind : Kind_Type := No_Kind) is record
+      Complex_Variable_Record_Variable_Record : Variable_Record_Type(Kind);
+   end record;
+
+   type Top_Level_Record_Type is record
+      Top_Level_Record_Complex_Record : Complex_Variable_Record_Type;
+   end record;
+
+end P;