[RFC,4/4,gdb/testsuite] Add test-case gdb.base/gdb-sigterm-3.exp

Message ID 20231129203326.11952-4-tdevries@suse.de
State New
Headers
Series [RFC,1/4,gdb/tdep] Add dummy amd64_software_single_step |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 fail Testing failed
linaro-tcwg-bot/tcwg_gdb_check--master-arm fail Testing failed

Commit Message

Tom de Vries Nov. 29, 2023, 8:33 p.m. UTC
  Reproduce PR gdb/31061 (originally reported on arm, a software single-step
architecture) on amd64, a hardware single-step architecture, using the new
maintenance command "maint set prefer-software-single-stepping on".

The test-case is based on gdb.base/gdb-sigterm.exp, so leave the 2013-2023
copyright years in place.

Tested on x86_64-linux.
---
 gdb/testsuite/gdb.base/gdb-sigterm-3.c   |  52 +++++++++++
 gdb/testsuite/gdb.base/gdb-sigterm-3.exp | 105 +++++++++++++++++++++++
 2 files changed, 157 insertions(+)
 create mode 100644 gdb/testsuite/gdb.base/gdb-sigterm-3.c
 create mode 100644 gdb/testsuite/gdb.base/gdb-sigterm-3.exp
  

Patch

diff --git a/gdb/testsuite/gdb.base/gdb-sigterm-3.c b/gdb/testsuite/gdb.base/gdb-sigterm-3.c
new file mode 100644
index 00000000000..3e359f009ee
--- /dev/null
+++ b/gdb/testsuite/gdb.base/gdb-sigterm-3.c
@@ -0,0 +1,52 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2013-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/>.  */
+
+#include <unistd.h>
+
+#if defined(__s390__) || defined(__s390x__)
+#define NOP asm("nopr 0")
+#elif defined(__or1k__)
+#define NOP asm("l.nop")
+#else
+#define NOP asm("nop")
+#endif
+
+#define NOP10 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP
+
+int
+main (void)
+{
+  /* Allow for as much timeout as DejaGnu wants, plus a bit of
+     slack.  */
+  unsigned int seconds = TIMEOUT + 20;
+
+  alarm (seconds);
+
+  for (;;) /* loop-line */
+    {
+      NOP10;
+      NOP10;
+      NOP10;
+      NOP10;
+      NOP10;
+      NOP10;
+      NOP10;
+      NOP10;
+      NOP10;
+      NOP10;
+    }
+}
diff --git a/gdb/testsuite/gdb.base/gdb-sigterm-3.exp b/gdb/testsuite/gdb.base/gdb-sigterm-3.exp
new file mode 100644
index 00000000000..44ce20b4f26
--- /dev/null
+++ b/gdb/testsuite/gdb.base/gdb-sigterm-3.exp
@@ -0,0 +1,105 @@ 
+# This testcase is part of GDB, the GNU debugger.
+#
+# Copyright 2013-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/>.
+
+# Test relies on checking gdb debug output. Do not run if gdb debug is
+# enabled as any debug will be redirected to the log.
+require !gdb_debug_enabled
+
+standard_testfile
+
+# The test program exits after a while, in case GDB crashes.  Make it
+# wait at least as long as we may wait before declaring a time out
+# failure.
+set options { "additional_flags=-DTIMEOUT=$timeout" debug }
+if { [build_executable ${testfile}.exp ${testfile} $srcfile $options] == -1 } {
+    return -1
+}
+
+# Return 0 on success, non-zero otherwise.
+
+proc do_test { pass } {
+    global testfile gdb_prompt binfile pf_prefix
+
+    if ![runto_main] {
+	return -1
+    }
+
+    gdb_breakpoint "${testfile}.c:[gdb_get_line_number "loop-line" ${testfile}.c]" \
+		   temporary
+
+    gdb_test "continue" "Temporary breakpoint .* NOP10;.*"
+
+    gdb_test_no_output "set range-stepping off"
+    gdb_test_no_output "set debug infrun 1"
+
+    set abort 1
+    gdb_test_multiple "stepi-loop" "run a bit" {
+	-re {\[infrun\] process_event_stop_test: stepi/nexti} {
+	    pass $gdb_test_name
+	    set abort 0
+	}
+    }
+    if $abort {
+	verbose -log "$pf_prefix $test: did not run"
+	return $abort
+    }
+
+    set gdb_pid [exp_pid -i [board_info host fileid]]
+    remote_exec host "kill -TERM ${gdb_pid}"
+
+    set test "expect eof"
+    set abort 1
+    set stepping 0
+    # If GDB mishandles the SIGTERM and doesn't exit, this should FAIL
+    # with timeout.  We don't expect a GDB prompt, so we see one,
+    # we'll FAIL too.
+    gdb_test_multiple "" "expect eof" {
+	eof {
+	    pass "$gdb_test_name (got eof)"
+	    set abort 0
+	}
+	-re {\[infrun\] process_event_stop_test: stepping inside range} {
+	    incr stepping
+	    exp_continue
+	}
+    }
+    verbose -log "$pf_prefix $test: stepped $stepping times"
+    return $abort
+}
+
+# Testcase was FAILing approx. on 10th pass with unpatched GDB.
+# 50 runs should be approx. a safe number to be sure it is fixed now.
+set passes 50
+
+for {set pass 0} {$pass < $passes} {incr pass} {
+    with_test_prefix "pass=$pass" {
+	clean_restart ${testfile}
+	send_gdb "define stepi-loop\n"
+	send_gdb "while 1\n"
+	send_gdb "stepi\n"
+	send_gdb "end\n"
+	send_gdb "end\n"
+	gdb_test "" ""
+	gdb_test_no_output "maint set prefer-software-single-stepping on"
+
+	if { [do_test $pass] != 0 } {
+	    break
+	}
+    }
+}
+
+gdb_assert {$pass == $passes} "$passes SIGTERM passes"