aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2020-11-04 09:17:58 -0700
committerTom Tromey <tromey@adacore.com>2020-11-04 09:17:58 -0700
commit8d9fd3a107c4ae251a4cbcfc995115334e0cf84e (patch)
tree48f17c1b0bd417a9e080b148fa0352878c6bf0ae
parentd8f62e8447e7ddba311e9a51d1bf36ef533a2745 (diff)
downloadgdb-8d9fd3a107c4ae251a4cbcfc995115334e0cf84e.zip
gdb-8d9fd3a107c4ae251a4cbcfc995115334e0cf84e.tar.gz
gdb-8d9fd3a107c4ae251a4cbcfc995115334e0cf84e.tar.bz2
Print Ada type name in more cases
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.
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/ada-typeprint.c15
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.ada/rec_ptype.exp42
-rw-r--r--gdb/testsuite/gdb.ada/rec_ptype/main.adb23
-rw-r--r--gdb/testsuite/gdb.ada/rec_ptype/p.ads48
6 files changed, 137 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 913b7ec..478da82 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,9 @@
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):
Handle DW_TAG_array_type.
(is_type_tag_for_partial): Add "lang" parameter.
diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c
index 11cc51c..0892c7c 100644
--- a/gdb/ada-typeprint.c
+++ b/gdb/ada-typeprint.c
@@ -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)
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 745413a..6927735 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,11 @@
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.
* gdb.ada/tick_length_array_enum_idx/foo_n207_004.adb
(PT_Full): New variable.
diff --git a/gdb/testsuite/gdb.ada/rec_ptype.exp b/gdb/testsuite/gdb.ada/rec_ptype.exp
new file mode 100644
index 0000000..0639f55
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/rec_ptype.exp
@@ -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
index 0000000..b54ce78
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/rec_ptype/main.adb
@@ -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
index 0000000..a175f4a
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/rec_ptype/p.ads
@@ -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;