# Copyright (C) 2003-2004, 2006-2012 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.

# Test i386 prologue analyzer.


if {(![istarget "x86_64-*-*"] && ![istarget "i?86-*-*"]) || ![is_ilp32_target] } 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.
set additional_flags [gdb_target_symbol_prefix_flags]

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