# Copyright 2006-2016 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 . # Test ARM/Thumb prologue analyzer. if {![is_aarch32_target]} then { verbose "Skipping ARM prologue tests." return } set testfile "thumb-prologue" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} # Don't use "debug", so that we don't have line information for the assembly # fragments. if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {"additional_flags=-mthumb"}] != "" } { untested "ARM prologue tests" return -1 } gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} # # Run to `main' where we begin our tests. # if ![runto_main] then { untested "ARM prologue tests" return -1 } # Testcase for TPCS prologue. gdb_breakpoint "* *(int *)tpcs_offset + (int) &tpcs_frame_1" gdb_test "continue" "Breakpoint .*, $hex in tpcs_frame_1 \\(\\)" \ "continue to TPCS" gdb_test "backtrace 10" \ "#0\[ \t\]*$hex in tpcs_frame_1 .*\r\n#1\[ \t\]*$hex in tpcs_frame .*\r\n#2\[ \t\]*$hex in main.*" \ "backtrace in TPCS" gdb_test "info frame" \ ".*Saved registers:.*r7 at.*r10 at.*r11 at.*lr at.*" \ "saved registers in TPCS" # Testcase for "switching" the stack to the same stack in the prologue. gdb_breakpoint "switch_stack_to_same" gdb_test "continue" "Breakpoint .*, $hex in switch_stack_to_same \\(\\)" \ "continue to switch_stack_to_same" gdb_test "stepi 2" "in write_sp \\(\\)" "stepi over mov sp, sp" gdb_test "backtrace 10" \ "#0\[ \t\]*$hex in write_sp .*\r\n#1\[ \t\]*$hex in switch_stack_to_same .*\r\n#2\[ \t\]*$hex in main.*" \ "backtrace in write_sp" # Testcase for switching to another stack in the prologue. gdb_breakpoint "switch_stack_to_other" gdb_test "continue" "Breakpoint .*, $hex in switch_stack_to_other \\(\\)" \ "continue to switch_stack_to_other" gdb_test "stepi 2" "in write_sp \\(\\)" "stepi over mov sp, 128" gdb_test "backtrace 10" \ "#0\[ \t\]*$hex in write_sp .*\r\n#1\[ \t\]*$hex in switch_stack_to_other .*\r\n#2\[ \t\]*$hex in main.*" \ "backtrace in write_sp"