diff options
author | Tom Tromey <tromey@adacore.com> | 2020-11-04 09:17:58 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-11-04 09:17:58 -0700 |
commit | 8d9fd3a107c4ae251a4cbcfc995115334e0cf84e (patch) | |
tree | 48f17c1b0bd417a9e080b148fa0352878c6bf0ae | |
parent | d8f62e8447e7ddba311e9a51d1bf36ef533a2745 (diff) | |
download | gdb-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/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/ada-typeprint.c | 15 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/rec_ptype.exp | 42 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/rec_ptype/main.adb | 23 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/rec_ptype/p.ads | 48 |
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; |