aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ada-lang.c7
-rw-r--r--gdb/target.c5
-rw-r--r--gdb/target.h4
-rw-r--r--gdb/testsuite/gdb.ada/file-then-restart.exp69
-rw-r--r--gdb/testsuite/gdb.ada/file-then-restart/first.adb25
-rw-r--r--gdb/testsuite/gdb.ada/file-then-restart/second.adb25
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;