# Copyright (C) 2003, 2004, 2006 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

# This file is part of the gdb testsuite.

if $tracelevel {
    strace $tracelevel
}

# Test i386 prologue analyzer.

set prms_id 0
set bug_id 0

if ![istarget "i?86-*-*"] then {
    verbose "Skipping i386 prologue tests."
    return
}

set testfile "i386-prologue"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

# some targets have leading underscores on assembly symbols.
# TODO: detect this automatically
set additional_flags ""
if [istarget "i?86-*-cygwin*"] then {
  set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\""
}   

# Don't use "debug", so that we don't have line information for the assembly
# fragments.
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list $additional_flags]] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}


# The code used by the tests here encodes some breakpoints by using
# inline assembler.  This will generate a SIGTRAP which will be caught
# by GDB.  At that point the instruction pointer will point at the
# next instruction, and execution can continue without any problems.
# Some systems however (QNX Neutrino, Solaris) will adjust the
# instruction pointer to point at the breakpoint instruction instead.
# On these systems we cannot continue unless we skip it.  This
# procedure takes care of that.

proc skip_breakpoint { msg } {
    gdb_test "if (*(unsigned char *)\$pc == 0xcc)\nset \$pc = \$pc + 1\nend" \
	    "" "skip breakpoint in ${msg}"
}


gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

#
# Run to `main' where we begin our tests.
#

if ![runto_main] then {
    gdb_suppress_tests
}

# Testcase for standard prologue.

gdb_test "continue" "Program received signal SIGTRAP.*" "continue to standard"

skip_breakpoint standard

gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in standard.*\r\n#1\[ \t\]*$hex in main.*" \
	"backtrace in standard"

gdb_test "info frame" \
	".*Saved registers:.*ebp at.*edi at.*eip at.*" \
	"saved registers in standard"


# Testcase from breakpoints/2080.

gdb_test "break *(stack_align + 7)" \
	"Breakpoint \[0-9\]* at $hex"

gdb_test "continue" \
	"Breakpoint \[0-9\]*.*stack_align.*" \
	"continue to stack_align + 7"

setup_kfail *-*-* gdb/2080
gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in stack_align.*\r\n#1\[ \t\]*$hex in main.*" \
	"first backtrace in stack_align"

gdb_test "continue" \
	"Program received signal SIGTRAP.*" \
	"continue in stack_align"

skip_breakpoint stack_align

setup_kfail *-*-* gdb/2080
gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in stack_align.*\r\n#1\[ \t\]*$hex in main.*" \
	"second backtrace in stack_align"

setup_kfail *-*-* gdb/2080
gdb_test "info frame" \
	".*Saved registers:.*ecx at.*ebp at.*edi at.*eip at.*" \
	"saved registers in stack_align"


# Testcase from symtab/1253.

gdb_test "continue" "Program received signal SIGTRAP.*" "continue to gdb1253"

skip_breakpoint gdb1253

gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in gdb1253.*\r\n#1\[ \t\]*$hex in main.*" \
	"backtrace in gdb1253"

gdb_test "info frame" \
	".*Saved registers:.*ebp at.*edi at.*eip at.*" \
	"saved registers in gdb1253"


# Testcase from backtrace/1718.

gdb_test "continue" "Program received signal SIGTRAP.*" "continue to gdb1718"

skip_breakpoint gdb1718

gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in gdb1718.*\r\n#1\[ \t\]*$hex in main.*" \
	"backtrace in gdb1718"

setup_kfail *-*-* gdb/1718
gdb_test "info frame" \
	".*Saved registers:.*esi at.*ebx at.*eip at.*" \
	"saved registers in gdb1718"


# Testcase from backtrace/1338.

gdb_test "continue" "Program received signal SIGTRAP.*" "continue to gdb1338"

skip_breakpoint gdb1338

gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in gdb1338.*\r\n#1\[ \t\]*$hex in main.*" \
	"backtrace in gdb1338"

gdb_test "info frame" \
	".*Saved registers:.*ebx at.*esi at.*edi at.*eip at.*" \
	"saved registers in gdb1338"

# Testcase jump_at_beginning.
gdb_test_multiple "break jump_at_beginning" \
	"set breakpoint in jump_at_beginning" {
    -re "Breakpoint \[0-9\]* at ($hex).*$gdb_prompt $" {
	gdb_test "x/i $expect_out(1,string)" \
		".*<jump_at_beginning.*>:.*jmp.*" \
		"check jump_at_beginning prologue end"
    }
    default {
        fail "set breakpoint in jump_at_beginning"
    }
}
