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