| # Copyright 2022-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 explicitly unwinding the PC DWARF register on aarch64 |
| |
| require is_aarch64_target |
| |
| standard_testfile .S |
| |
| if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } { |
| return -1 |
| } |
| |
| if ![runto_main] { |
| return -1 |
| } |
| |
| proc test_reg_vals {} { |
| gdb_test "p \$pc - &main" "= 8" "p \$pc" |
| gdb_test "p/x \$x30" "= 0x1234" "p \$x30" |
| } |
| |
| proc test_unwind_pc { inst } { |
| gdb_test "si" "$inst" "single step" |
| gdb_test "backtrace" \ |
| ".*#1.*in main ().*" \ |
| "backtrace" |
| gdb_test "up" "in main ().*" "parent frame" |
| test_reg_vals |
| } |
| |
| # Ready to enter the function |
| gdb_test "si" "bl test_func" "call site" |
| # Step through the 3 instructions in the function to make sure that |
| # we have the same unwind info throughout. |
| with_test_prefix "1st stepi" { |
| test_unwind_pc "mov x0, x30" |
| } |
| with_test_prefix "2nd stepi" { |
| test_unwind_pc "mov x30, 0x1234" |
| } |
| with_test_prefix "3rd stepi" { |
| test_unwind_pc "ret x0" |
| } |
| # Check again after we returned |
| with_test_prefix "final" { |
| # Check that we've stepped out (si prints out the new function name) |
| gdb_test "si" ".*main *().*" "single step out" |
| gdb_test "backtrace" \ |
| "#0\[\t \]+main ().*" \ |
| "backtrace" |
| test_reg_vals |
| } |