From 32fa152e3bfcf021ce49767be547fae5129d922b Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 22 Jul 2020 12:28:33 -0600 Subject: [PATCH] Fix crash in -stack-list-arguments -stack-list-arguments will crash when stopped in an Ada procedure that has an argument with a certain name ("_objectO" -- which can only be generated by the compiler). The bug occurs because lookup_symbol will fail in this case. This patch changes -stack-list-arguments to mirror what is done with arguments elsewhere. (As an aside, I don't understand why this lookup is even needed, but I assume it is some stabs thing?) In the longer term I think it would be good to share this code between MI and the CLI. However, due to the upcoming release, I preferred a more local fix. gdb/ChangeLog 2020-07-22 Tom Tromey * mi/mi-cmd-stack.c (list_args_or_locals): Use lookup_symbol_search_name. gdb/testsuite/ChangeLog 2020-07-22 Tom Tromey * gdb.ada/mi_prot.exp: New file. * gdb.ada/mi_prot/pkg.adb: New file. * gdb.ada/mi_prot/pkg.ads: New file. * gdb.ada/mi_prot/prot.adb: New file. --- gdb/ChangeLog | 5 +++ gdb/mi/mi-cmd-stack.c | 5 ++- gdb/testsuite/ChangeLog | 7 ++++ gdb/testsuite/gdb.ada/mi_prot.exp | 47 ++++++++++++++++++++++++++ gdb/testsuite/gdb.ada/mi_prot/pkg.adb | 21 ++++++++++++ gdb/testsuite/gdb.ada/mi_prot/pkg.ads | 19 +++++++++++ gdb/testsuite/gdb.ada/mi_prot/prot.adb | 47 ++++++++++++++++++++++++++ 7 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 gdb/testsuite/gdb.ada/mi_prot.exp create mode 100644 gdb/testsuite/gdb.ada/mi_prot/pkg.adb create mode 100644 gdb/testsuite/gdb.ada/mi_prot/pkg.ads create mode 100644 gdb/testsuite/gdb.ada/mi_prot/prot.adb diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1cef37dea6c..6fc88bdfb48 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-07-22 Tom Tromey + + * mi/mi-cmd-stack.c (list_args_or_locals): Use + lookup_symbol_search_name. + 2020-07-22 Andrew Burgess * python/py-registers.c (gdbpy_register_object_data_init): Remove diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c index ef091093620..a8ef46df60c 100644 --- a/gdb/mi/mi-cmd-stack.c +++ b/gdb/mi/mi-cmd-stack.c @@ -634,9 +634,8 @@ list_args_or_locals (const frame_print_options &fp_opts, struct frame_arg arg, entryarg; if (SYMBOL_IS_ARGUMENT (sym)) - sym2 = lookup_symbol (sym->linkage_name (), - block, VAR_DOMAIN, - NULL).symbol; + sym2 = lookup_symbol_search_name (sym->search_name (), + block, VAR_DOMAIN).symbol; else sym2 = sym; gdb_assert (sym2 != NULL); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c83dc40d12e..f43b4c250ac 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2020-07-22 Tom Tromey + + * gdb.ada/mi_prot.exp: New file. + * gdb.ada/mi_prot/pkg.adb: New file. + * gdb.ada/mi_prot/pkg.ads: New file. + * gdb.ada/mi_prot/prot.adb: New file. + 2020-07-22 Tankut Baris Aktemur * gdb.base/jit-reader-simple.exp: Add a scenario for a binary that diff --git a/gdb/testsuite/gdb.ada/mi_prot.exp b/gdb/testsuite/gdb.ada/mi_prot.exp new file mode 100644 index 00000000000..852e3524ea1 --- /dev/null +++ b/gdb/testsuite/gdb.ada/mi_prot.exp @@ -0,0 +1,47 @@ +# 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" + +standard_ada_testfile prot + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable \ + {debug additional_flags=-gnata}] != ""} { + return -1 +} + +load_lib mi-support.exp +set MIFLAGS "-i=mi" + +gdb_exit +if {[mi_gdb_start]} { + continue +} + +if {![mi_run_to_main]} then { + fail "cannot run to main, testcase aborted" + return 0 +} + +mi_delete_breakpoints +mi_gdb_reinitialize_dir $srcdir/$subdir +mi_gdb_load ${binfile} + +set line [gdb_get_line_number "STOP" ${testdir}/prot.adb] +mi_continue_to_line $line "continue to protected method" + +# The bug was that this crashed. +mi_gdb_test "-stack-list-arguments --no-frame-filters 1" \ + "\\^done,stack=.*" diff --git a/gdb/testsuite/gdb.ada/mi_prot/pkg.adb b/gdb/testsuite/gdb.ada/mi_prot/pkg.adb new file mode 100644 index 00000000000..96df4740f21 --- /dev/null +++ b/gdb/testsuite/gdb.ada/mi_prot/pkg.adb @@ -0,0 +1,21 @@ +-- 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 body Pkg is + procedure Do_Nothing (A : System.Address) is + begin + null; + end Do_Nothing; +end Pkg; diff --git a/gdb/testsuite/gdb.ada/mi_prot/pkg.ads b/gdb/testsuite/gdb.ada/mi_prot/pkg.ads new file mode 100644 index 00000000000..55d040c069c --- /dev/null +++ b/gdb/testsuite/gdb.ada/mi_prot/pkg.ads @@ -0,0 +1,19 @@ +-- 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 System; +package Pkg is + procedure Do_Nothing (A : System.Address); +end Pkg; diff --git a/gdb/testsuite/gdb.ada/mi_prot/prot.adb b/gdb/testsuite/gdb.ada/mi_prot/prot.adb new file mode 100644 index 00000000000..a8dca6de5e3 --- /dev/null +++ b/gdb/testsuite/gdb.ada/mi_prot/prot.adb @@ -0,0 +1,47 @@ +-- 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 Pkg; use Pkg; +with System; + +procedure Prot is + + protected type Obj_Type + (Ceiling_Priority: System.Priority := System.Priority'Last) + with Priority => Ceiling_Priority + is + procedure Set (V : Integer); + function Get return Integer; + private + Local : Integer := 0; + end Obj_Type; + + protected body Obj_Type is + procedure Set (V : Integer) is + begin + Local := V; -- STOP + end Set; + + function Get return Integer is + begin + return Local; + end Get; + end Obj_Type; + + Obj : Obj_Type; +begin + Obj.Set (5); + Pkg.Do_Nothing(Obj'Address); +end Prot;