aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.ada
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2023-08-21 09:55:14 -0600
committerTom Tromey <tromey@adacore.com>2023-09-05 09:54:53 -0600
commit358be6e72d464349e5146095bdb04b96be5734c1 (patch)
treebe414ce7ecbcc1f7e738d5db274503babe1c2dd3 /gdb/testsuite/gdb.ada
parent655e4e52ef44c1670a3b6f979b85534279c9f6c1 (diff)
downloadbinutils-358be6e72d464349e5146095bdb04b96be5734c1.zip
binutils-358be6e72d464349e5146095bdb04b96be5734c1.tar.gz
binutils-358be6e72d464349e5146095bdb04b96be5734c1.tar.bz2
Read Ada main name from executable, not inferior
An upstream bug report points out this bug: if the user switches from one Ada executable to another without "kill"ing the inferior, then the "start" command will fail. What happens here is that the Ada "main" name is found in a constant string in the executable. But, if the inferior is running, then the process_stratum target reads from the inferior memory. This patch fixes the problem by changing the main name code to set trust-readonly-sections, causing the target stack to read from the executable instead. I looked briefly at changing GNAT to emit DW_AT_main_subprogram instead, but this looks to be pretty involved. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25811
Diffstat (limited to 'gdb/testsuite/gdb.ada')
-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
3 files changed, 119 insertions, 0 deletions
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;