diff options
Diffstat (limited to 'gdb/testsuite')
3 files changed, 118 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li-foo.s b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li-foo.s new file mode 100644 index 0000000..787aacd --- /dev/null +++ b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li-foo.s @@ -0,0 +1,47 @@ +/* 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/>. */ + + +/* Simple asm function that makes use of c.li and c.lui in the + function prologue before the return address and frame pointers are + written the stack. This ensures that GDB's prologue unwinder can + understand these instructions. */ + + .option pic + .text + + .globl foo + .type foo, @function +foo: + addi sp,sp,-32 + sd s1,8(sp) + + c.li s1,-4 + c.lui s1,4 + + sd fp,24(sp) + sd ra,16(sp) + addi fp,sp,32 + + call bar@plt + + ld s1,8(sp) + ld ra,16(sp) + ld fp,24(sp) + addi sp,sp,32 + jr ra + + .size foo, .-foo + .section .note.GNU-stack,"",@progbits diff --git a/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.c b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.c new file mode 100644 index 0000000..d3a0cb3 --- /dev/null +++ b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.c @@ -0,0 +1,29 @@ +/* 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/>. */ + +/* See riscv64-unwind-prologue-with-c_li-asm.s. */ +extern int foo (void); + +int +bar (void) +{ + return 0; +} + +int +main (void) +{ + return foo (); +} diff --git a/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.exp b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.exp new file mode 100644 index 0000000..069effa --- /dev/null +++ b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.exp @@ -0,0 +1,42 @@ +# 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/>. + +# This tests GDB's ability to use the RISC-V prologue scanner in order +# to unwind through a function that uses the compressed 'c.li' +# instruction in its prologue. + +require {istarget "riscv64-*-*"} + +standard_testfile .c -foo.s + +if {[prepare_for_testing "failed to prepare" $testfile \ + "$srcfile $srcfile2" nodebug]} { + return -1 +} + +if {![runto_main]} { + return 0 +} + +gdb_breakpoint "bar" +gdb_continue_to_breakpoint "bar" +gdb_test "bt" \ + [multi_line \ + "#0\[ \t\]*$hex in bar \\\(\\\)" \ + "#1\[ \t\]*$hex in foo \\\(\\\)" \ + "#2\[ \t\]*$hex in main \\\(\\\)"] \ + "Backtrace to the main frame" +gdb_test "finish" "foo \\\(\\\)" "finish bar" +gdb_test "finish" "main \\\(\\\)" "finish foo" |