diff options
author | Thiago Jung Bauermann <thiago.bauermann@linaro.org> | 2024-05-03 00:19:21 -0300 |
---|---|---|
committer | Thiago Jung Bauermann <thiago.bauermann@linaro.org> | 2024-05-03 00:26:23 -0300 |
commit | 746ec5d4d062459a70819b1d39250f3f76cbfbf2 (patch) | |
tree | 9f404ef758d9ff5c13ebbe5a9f31e55f0e0c5591 | |
parent | 76638bc9e510f2cfa8a890fc0dd2097a0bf61c55 (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.c | 62 | ||||
-rw-r--r-- | gdb/testsuite/gdb.arch/aarch64-mops-atomic-inst.exp | 85 |
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" |