1*11efff7fSkettenis# Copyright 2003, 2004 Free Software Foundation, Inc. 2b725ae77Skettenis 3b725ae77Skettenis# This program is free software; you can redistribute it and/or modify 4b725ae77Skettenis# it under the terms of the GNU General Public License as published by 5b725ae77Skettenis# the Free Software Foundation; either version 2 of the License, or 6b725ae77Skettenis# (at your option) any later version. 7b725ae77Skettenis# 8b725ae77Skettenis# This program is distributed in the hope that it will be useful, 9b725ae77Skettenis# but WITHOUT ANY WARRANTY; without even the implied warranty of 10b725ae77Skettenis# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11b725ae77Skettenis# GNU General Public License for more details. 12b725ae77Skettenis# 13b725ae77Skettenis# You should have received a copy of the GNU General Public License 14b725ae77Skettenis# along with this program; if not, write to the Free Software 15b725ae77Skettenis# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16b725ae77Skettenis 17b725ae77Skettenis# Please email any bugs, comments, and/or additions to this file to: 18b725ae77Skettenis# bug-gdb@gnu.org 19b725ae77Skettenis 20b725ae77Skettenis# This file is part of the gdb testsuite. 21b725ae77Skettenis 22b725ae77Skettenisif $tracelevel { 23b725ae77Skettenis strace $tracelevel 24b725ae77Skettenis} 25b725ae77Skettenis 26b725ae77Skettenis# Test i386 prologue analyzer. 27b725ae77Skettenis 28b725ae77Skettenisset prms_id 0 29b725ae77Skettenisset bug_id 0 30b725ae77Skettenis 31b725ae77Skettenisif ![istarget "i?86-*-*"] then { 32b725ae77Skettenis verbose "Skipping i386 prologue tests." 33b725ae77Skettenis return 34b725ae77Skettenis} 35b725ae77Skettenis 36b725ae77Skettenisset testfile "i386-prologue" 37b725ae77Skettenisset srcfile ${testfile}.c 38b725ae77Skettenisset binfile ${objdir}/${subdir}/${testfile} 39*11efff7fSkettenis 40*11efff7fSkettenis# some targets have leading underscores on assembly symbols. 41*11efff7fSkettenis# TODO: detect this automatically 42*11efff7fSkettenisset additional_flags "" 43*11efff7fSkettenisif [istarget "i?86-*-cygwin*"] then { 44*11efff7fSkettenis set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\"" 45*11efff7fSkettenis} 46*11efff7fSkettenis 47*11efff7fSkettenis# Don't use "debug", so that we don't have line information for the assembly 48*11efff7fSkettenis# fragments. 49*11efff7fSkettenisif { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list $additional_flags]] != "" } { 50b725ae77Skettenis gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." 51b725ae77Skettenis} 52b725ae77Skettenis 53*11efff7fSkettenis 54*11efff7fSkettenis# The code used by the tests here encodes some breakpoints by using 55*11efff7fSkettenis# inline assembler. This will generate a SIGTRAP which will be caught 56*11efff7fSkettenis# by GDB. At that point the instruction pointer will point at the 57*11efff7fSkettenis# next instruction, and execution can continue without any problems. 58*11efff7fSkettenis# Some systems however (QNX Neutrino, Solaris) will adjust the 59*11efff7fSkettenis# instruction pointer to point at the breakpoint instruction instead. 60*11efff7fSkettenis# On these systems we cannot continue unless we skip it. This 61*11efff7fSkettenis# procedure takes care of that. 62*11efff7fSkettenis 63*11efff7fSkettenisproc skip_breakpoint { msg } { 64*11efff7fSkettenis gdb_test "if (*(unsigned char *)\$pc == 0xcc)\nset \$pc = \$pc + 1\nend" \ 65*11efff7fSkettenis "" "skip breakpoint in ${msg}" 66*11efff7fSkettenis} 67*11efff7fSkettenis 68*11efff7fSkettenis 69b725ae77Skettenisgdb_exit 70b725ae77Skettenisgdb_start 71b725ae77Skettenisgdb_reinitialize_dir $srcdir/$subdir 72b725ae77Skettenisgdb_load ${binfile} 73b725ae77Skettenis 74b725ae77Skettenis# 75b725ae77Skettenis# Run to `main' where we begin our tests. 76b725ae77Skettenis# 77b725ae77Skettenis 78b725ae77Skettenisif ![runto_main] then { 79b725ae77Skettenis gdb_suppress_tests 80b725ae77Skettenis} 81b725ae77Skettenis 82*11efff7fSkettenis# Testcase for standard prologue. 83*11efff7fSkettenis 84*11efff7fSkettenisgdb_test "continue" "Program received signal SIGTRAP.*" "continue to standard" 85*11efff7fSkettenis 86*11efff7fSkettenisskip_breakpoint standard 87*11efff7fSkettenis 88*11efff7fSkettenisgdb_test "backtrace 10" \ 89*11efff7fSkettenis "#0\[ \t\]*$hex in standard.*\r\n#1\[ \t\]*$hex in main.*" \ 90*11efff7fSkettenis "backtrace in standard" 91*11efff7fSkettenis 92*11efff7fSkettenisgdb_test "info frame" \ 93*11efff7fSkettenis ".*Saved registers:.*ebp at.*edi at.*eip at.*" \ 94*11efff7fSkettenis "saved registers in standard" 95*11efff7fSkettenis 96b725ae77Skettenis# Testcase from symtab/1253. 97b725ae77Skettenis 98b725ae77Skettenisgdb_test "continue" "Program received signal SIGTRAP.*" "continue to gdb1253" 99b725ae77Skettenis 100*11efff7fSkettenisskip_breakpoint gdb1253 101*11efff7fSkettenis 102b725ae77Skettenisgdb_test "backtrace 10" \ 103b725ae77Skettenis "#0\[ \t\]*$hex in gdb1253.*\r\n#1\[ \t\]*$hex in main.*" \ 104b725ae77Skettenis "backtrace in gdb1253" 105b725ae77Skettenis 106b725ae77Skettenisgdb_test "info frame" \ 107b725ae77Skettenis ".*Saved registers:.*ebp at.*edi at.*eip at.*" \ 108b725ae77Skettenis "saved registers in gdb1253" 109b725ae77Skettenis 110*11efff7fSkettenis# Testcase from backtrace/1718. 111*11efff7fSkettenis 112*11efff7fSkettenisgdb_test "continue" "Program received signal SIGTRAP.*" "continue to gdb1718" 113*11efff7fSkettenis 114*11efff7fSkettenisskip_breakpoint gdb1718 115*11efff7fSkettenis 116*11efff7fSkettenisgdb_test "backtrace 10" \ 117*11efff7fSkettenis "#0\[ \t\]*$hex in gdb1718.*\r\n#1\[ \t\]*$hex in main.*" \ 118*11efff7fSkettenis "backtrace in gdb1718" 119*11efff7fSkettenis 120*11efff7fSkettenissetup_kfail *-*-* gdb/1718 121*11efff7fSkettenisgdb_test "info frame" \ 122*11efff7fSkettenis ".*Saved registers:.*esi at.*ebx at.*eip at.*" \ 123*11efff7fSkettenis "saved registers in gdb1718" 124*11efff7fSkettenis 125b725ae77Skettenis# Testcase from backtrace/1338. 126b725ae77Skettenis 127b725ae77Skettenisgdb_test "continue" "Program received signal SIGTRAP.*" "continue to gdb1338" 128b725ae77Skettenis 129*11efff7fSkettenisskip_breakpoint gdb1338 130*11efff7fSkettenis 131b725ae77Skettenisgdb_test "backtrace 10" \ 132b725ae77Skettenis "#0\[ \t\]*$hex in gdb1338.*\r\n#1\[ \t\]*$hex in main.*" \ 133b725ae77Skettenis "backtrace in gdb1338" 134b725ae77Skettenis 135b725ae77Skettenisgdb_test "info frame" \ 136b725ae77Skettenis ".*Saved registers:.*ebx at.*esi at.*edi at.*eip at.*" \ 137b725ae77Skettenis "saved registers in gdb1338" 138*11efff7fSkettenis 139*11efff7fSkettenis# Testcase jump_at_beginning. 140*11efff7fSkettenisgdb_test_multiple "break jump_at_beginning" \ 141*11efff7fSkettenis "set breakpoint in jump_at_beginning" { 142*11efff7fSkettenis -re "Breakpoint \[0-9\]* at ($hex).*$gdb_prompt $" { 143*11efff7fSkettenis gdb_test "x/i $expect_out(1,string)" \ 144*11efff7fSkettenis ".*<jump_at_beginning.*>:.*jmp.*" \ 145*11efff7fSkettenis "check jump_at_beginning prologue end" 146*11efff7fSkettenis } 147*11efff7fSkettenis default { 148*11efff7fSkettenis fail "set breakpoint in jump_at_beginning" 149*11efff7fSkettenis } 150*11efff7fSkettenis} 151