# 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 { ![is_x86_like_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"
    }
}
