# Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010
# 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/>.

# 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.


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 "*-*-cygwin*"] || [istarget "*-*-mingw*"] } 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]] != "" } {
    untested i386-prologue.exp
    return -1
}


# 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 (when %ecx is used)

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

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

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

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

skip_breakpoint stack_align_ecx

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

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


# Testcase from breakpoints/2080 (when %edx is used)

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

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

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

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

skip_breakpoint stack_align_edx

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

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


# Testcase from breakpoints/2080 (when %eax is used)

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

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

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

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

skip_breakpoint stack_align_eax

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

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


# 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"
    }
}
