diff options
-rw-r--r-- | gdb/ada-lang.c | 7 | ||||
-rw-r--r-- | gdb/target.c | 5 | ||||
-rw-r--r-- | gdb/target.h | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/file-then-restart.exp | 69 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/file-then-restart/first.adb | 25 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/file-then-restart/second.adb | 25 |
6 files changed, 132 insertions, 3 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index cc64e09..f6a623d 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -814,6 +814,13 @@ ada_main_name () if (main_program_name_addr == 0) error (_("Invalid address for Ada main program name.")); + /* Force trust_readonly, because we always want to fetch this + string from the executable, not from inferior memory. If the + user changes the exec-file and invokes "start", we want to + pick the "main" from the new executable, not one that may + come from the still-live inferior. */ + scoped_restore save_trust_readonly + = make_scoped_restore (&trust_readonly, true); main_program_name = target_read_string (main_program_name_addr, 1024); return main_program_name.get (); } diff --git a/gdb/target.c b/gdb/target.c index 05db7e7..68d7fe2 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -116,10 +116,9 @@ static struct target_ops *the_debug_target; static struct cmd_list_element *targetlist = NULL; -/* True if we should trust readonly sections from the - executable when reading memory. */ +/* See target.h. */ -static bool trust_readonly = false; +bool trust_readonly = false; /* Nonzero if we should show true memory content including memory breakpoint inserted by gdb. */ diff --git a/gdb/target.h b/gdb/target.h index 12851f2..aa07075 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -2477,6 +2477,10 @@ extern int remote_timeout; extern scoped_restore_tmpl<int> make_scoped_restore_show_memory_breakpoints (int show); +/* True if we should trust readonly sections from the + executable when reading memory. */ +extern bool trust_readonly; + extern bool may_write_registers; extern bool may_write_memory; extern bool may_insert_breakpoints; diff --git a/gdb/testsuite/gdb.ada/file-then-restart.exp b/gdb/testsuite/gdb.ada/file-then-restart.exp new file mode 100644 index 0000000..e2c76b6 --- /dev/null +++ b/gdb/testsuite/gdb.ada/file-then-restart.exp @@ -0,0 +1,69 @@ +# Copyright 2023 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" + +require allow_ada_tests + +# This testcase verifies the behavior of the `start' command, which +# does not work when we use the gdb stub... +require !use_gdb_stub + +standard_ada_testfile first + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} { + return -1 +} + +# Build the second test program +set srcfile2 ${srcdir}/${subdir}/${testdir}/second.adb +set binfile2 [standard_output_file second] + +if {[gdb_compile_ada "${srcfile2}" "${binfile2}" executable {debug}] != ""} { + return -1 +} + +foreach_with_prefix scenario {kill no-kill} { + clean_restart $binfile + + # Start the program, we should land in the program main procedure + if {[gdb_start_cmd] < 0} { + fail start + return -1 + } + + gdb_test "" \ + "first \\(\\) at .*first.adb.*" \ + "start first" + + gdb_test_no_output "set confirm off" + + if {$scenario == "kill"} { + gdb_test "kill" "Inferior $decimal .*killed.*" + } + + gdb_test "file $binfile2" "Reading symbols from .*" \ + "switch to second executable" + + # Start the program a second time, GDB should land in procedure + # Second this time. + if {[gdb_start_cmd] < 0} { + fail "start second" + } else { + gdb_test "" \ + "second \\(\\) at .*second.adb.*" \ + "start second" + } +} diff --git a/gdb/testsuite/gdb.ada/file-then-restart/first.adb b/gdb/testsuite/gdb.ada/file-then-restart/first.adb new file mode 100644 index 0000000..9be0835 --- /dev/null +++ b/gdb/testsuite/gdb.ada/file-then-restart/first.adb @@ -0,0 +1,25 @@ +-- Copyright 2005-2023 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/>. + +procedure First is + + procedure Break_Me is + begin + null; + end Break_Me; + +begin + Break_Me; +end First; diff --git a/gdb/testsuite/gdb.ada/file-then-restart/second.adb b/gdb/testsuite/gdb.ada/file-then-restart/second.adb new file mode 100644 index 0000000..7270cf7 --- /dev/null +++ b/gdb/testsuite/gdb.ada/file-then-restart/second.adb @@ -0,0 +1,25 @@ +-- Copyright 2005-2023 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/>. + +procedure Second is + + procedure Break_Me is + begin + null; + end Break_Me; + +begin + Break_Me; +end Second; |