summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Jung Bauermann <thiago.bauermann@linaro.org>2024-05-03 00:19:21 -0300
committerThiago Jung Bauermann <thiago.bauermann@linaro.org>2024-05-03 00:26:23 -0300
commit746ec5d4d062459a70819b1d39250f3f76cbfbf2 (patch)
tree9f404ef758d9ff5c13ebbe5a9f31e55f0e0c5591
parent76638bc9e510f2cfa8a890fc0dd2097a0bf61c55 (diff)
Add gdb.arch/aarch64-mops-atomic-inst.exp
The testcase verifies the stepping instruction by instruction, and was verified to trigger FAILs if the corresponding code in GDB is removed: Running /home/bauermann/src/binutils-gdb/gdb/testsuite/gdb.arch/aarch64-mops-atomic-inst.exp ... PASS: gdb.arch/aarch64-mops-atomic-inst.exp: continue to breakpoint: memset breakpoint PASS: gdb.arch/aarch64-mops-atomic-inst.exp: step through the memset sequence FAIL: gdb.arch/aarch64-mops-atomic-inst.exp: stepped through the memset sequence PASS: gdb.arch/aarch64-mops-atomic-inst.exp: continue to breakpoint: memcpy breakpoint PASS: gdb.arch/aarch64-mops-atomic-inst.exp: step through the memcpy sequence FAIL: gdb.arch/aarch64-mops-atomic-inst.exp: stepped through the memcpy sequence PASS: gdb.arch/aarch64-mops-atomic-inst.exp: continue to breakpoint: memmove breakpoint PASS: gdb.arch/aarch64-mops-atomic-inst.exp: step through the memmove sequence FAIL: gdb.arch/aarch64-mops-atomic-inst.exp: stepped through the memmove sequence === gdb Summary === # of expected passes 6 # of unexpected failures 3
-rw-r--r--gdb/testsuite/gdb.arch/aarch64-mops-atomic-inst.c62
-rw-r--r--gdb/testsuite/gdb.arch/aarch64-mops-atomic-inst.exp85
2 files changed, 147 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.arch/aarch64-mops-atomic-inst.c b/gdb/testsuite/gdb.arch/aarch64-mops-atomic-inst.c
new file mode 100644
index 00000000000..211cfb21c37
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/aarch64-mops-atomic-inst.c
@@ -0,0 +1,62 @@
+/* This file is part of GDB, the GNU debugger.
+
+ Copyright 2024 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/>. */
+
+#define TEST_STRING "Just a test string."
+#define BUF_SIZE sizeof(TEST_STRING)
+
+int main(void)
+{
+ const char source[BUF_SIZE] = TEST_STRING;
+ char dest[BUF_SIZE];
+ char *p = dest;
+ const char *q;
+ const long zero = 0;
+ long size = BUF_SIZE;
+
+ /* Break memset. */
+ /* memset implemented in MOPS instructions. */
+ __asm__ volatile ("setp [%0]!, %1!, %2\n\t"
+ "setm [%0]!, %1!, %2\n\t"
+ "sete [%0]!, %1!, %2\n\t"
+ : "+&r"(p), "+&r"(size)
+ : "r"(zero)
+ : "memory");
+
+ p = dest;
+ q = source;
+ /* Break memcpy. */
+ /* memcpy implemented in MOPS instructions. */
+ __asm__ volatile ("cpyfp [%0]!, [%1]!, %2!\n\t"
+ "cpyfm [%0]!, [%1]!, %2!\n\t"
+ "cpyfe [%0]!, [%1]!, %2!\n\t"
+ : "+&r" (p), "+&r" (q), "+&r" (size)
+ :
+ : "memory");
+
+ p = dest;
+ q = source;
+ /* Break memmove. */
+ /* memmove implemented in MOPS instructions. */
+ __asm__ volatile ("cpyp [%0]!, [%1]!, %2!\n\t"
+ "cpym [%0]!, [%1]!, %2!\n\t"
+ "cpye [%0]!, [%1]!, %2!\n\t"
+ : "+&r" (p), "+&r" (q), "+&r" (size)
+ :
+ : "memory");
+
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.arch/aarch64-mops-atomic-inst.exp b/gdb/testsuite/gdb.arch/aarch64-mops-atomic-inst.exp
new file mode 100644
index 00000000000..e31683314fa
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/aarch64-mops-atomic-inst.exp
@@ -0,0 +1,85 @@
+# Copyright 2024 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/>.
+#
+# This file is part of the GDB testsuite.
+
+# Test single stepping through MOPS (memory operations) atomic sequences.
+
+require allow_aarch64_mops_tests
+
+standard_testfile
+if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \
+ [list debug additional_flags=-march=armv9.3-a]] } {
+ return -1
+}
+
+proc is_at_instruction { instruction } {
+ global gdb_prompt hex
+
+ set test "pc points to $instruction"
+ gdb_test_multiple {x/i $pc} $test {
+ -re -wrap "=> $hex \[^\r\n\]+:\t$instruction\t\[^\r\n\]+" {
+ return 1
+ }
+ -re "\r\n$gdb_prompt $" {
+ return 0
+ }
+ }
+
+ return 0
+}
+
+proc arrive_at_instruction { instruction } {
+ set count 0
+
+ while { [is_at_instruction $instruction] != 1 } {
+ gdb_test -nopass "nexti" ".*__asm__ volatile.*" \
+ "nexti #$count to reach $instruction"
+ incr count
+ }
+}
+
+runto_main
+
+gdb_breakpoint ${srcfile}:[gdb_get_line_number "Break memset"]
+gdb_breakpoint ${srcfile}:[gdb_get_line_number "Break memcpy"]
+gdb_breakpoint ${srcfile}:[gdb_get_line_number "Break memmove"]
+
+gdb_continue_to_breakpoint "memset breakpoint"
+
+arrive_at_instruction setp
+
+# The nexti output isn't useful to detect whether we skipped the sequence.
+gdb_test "nexti" "\[^\r\n\]+" "step through the memset sequence"
+gdb_assert { [is_at_instruction setm] == 0 && [is_at_instruction sete] == 0 } \
+ "stepped through the memset sequence"
+
+gdb_continue_to_breakpoint "memcpy breakpoint"
+
+arrive_at_instruction cpyfp
+
+# The nexti output isn't useful to detect whether we skipped the sequence.
+gdb_test "nexti" "\[^\r\n\]+" "step through the memcpy sequence"
+gdb_assert { [is_at_instruction cpyfm] == 0 && [is_at_instruction cpyfe] == 0 } \
+ "stepped through the memcpy sequence"
+
+gdb_continue_to_breakpoint "memmove breakpoint"
+
+arrive_at_instruction cpyp
+
+# The nexti output isn't useful to detect whether we skipped the sequence.
+gdb_test "nexti" "\[^\r\n\]+" "step through the memmove sequence"
+gdb_assert { [is_at_instruction cpym] == 0 && [is_at_instruction cpye] == 0 } \
+ "stepped through the memmove sequence"