From: Tom Tromey Date: Wed, 4 Nov 2020 16:17:58 +0000 (-0700) Subject: Print Ada type name in more cases X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8d9fd3a107c4ae251a4cbcfc995115334e0cf84e;p=binutils-gdb.git 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 * ada-typeprint.c (ada_print_type): Handle __T types. gdb/testsuite/ChangeLog 2020-11-04 Tom Tromey * gdb.ada/rec_ptype.exp: New file. * gdb.ada/rec_ptype/main.adb: New file. * gdb.ada/rec_ptype/p.ads: New file. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 913b7ecc5e1..478da8238f5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2020-11-04 Tom Tromey + + * ada-typeprint.c (ada_print_type): Handle __T types. + 2020-11-04 Tom Tromey * dwarf2/read.c (add_partial_symbol, process_die): diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index 11cc51cf106..0892c7c3dcd 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 745413a2e7a..6927735324f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2020-11-04 Tom Tromey + + * 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 * 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 index 00000000000..0639f5505b0 --- /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 . + +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 00000000000..b54ce78564e --- /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 . + +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 00000000000..a175f4a9778 --- /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 . + +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;