# Copyright 2009-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/>.

# This file is part of the gdb testsuite.

# Test i386 displaced stepping.


if {(![istarget "x86_64-*-*"] && ![istarget "i?86-*-*"]) || ![is_ilp32_target] } then {
    verbose "Skipping x86 displaced stepping tests."
    return
}

set testfile "i386-disp-step"
set srcfile ${testfile}.S
set binfile ${objdir}/${subdir}/${testfile}

set additional_flags "-Wa,-g"

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } {
    untested i386-disp-step.exp
    return -1
}

# Get things started.

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

gdb_test "set displaced-stepping on" ""
gdb_test "show displaced-stepping" ".* displaced stepping .* is on.*"

if ![runto_main] then {
    fail "Can't run to main"
    return 0
}

##########################################

# Test call/ret.

gdb_test "break test_call" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_call"
gdb_test "break test_call_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_call_end"

gdb_test "break test_ret" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_ret"
gdb_test "break test_ret_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_ret_end"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_call ().*" \
    "continue to test_call"
gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_call_end ().*" \
    "continue to test_call_end"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_ret ().*" \
    "continue to test_ret"
gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_ret_end ().*" \
    "continue to test_ret_end"

##########################################

# Absolute jump with leading prefixes.
# These don't occur in normal code, but gdb should still DTRT.

gdb_test "break test_prefixed_abs_jump" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_prefixed_abs_jump"
gdb_test "break test_prefixed_abs_jump_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_prefixed_abs_jump_end"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_prefixed_abs_jump ().*" \
    "continue to test_prefixed_abs_jump"
gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_prefixed_abs_jump_end ().*" \
    "continue to test_prefixed_abs_jump_end"

##########################################

# Test syscall.

gdb_test "break test_syscall" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_syscall"
gdb_test "break test_syscall_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_syscall_end"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_syscall ().*" \
    "continue to test_syscall"
gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_syscall_end ().*" \
    "continue to test_syscall_end"

##########################################

# Test prefixed syscall.
# These don't occur in normal code, but gdb should still DTRT.

gdb_test "break test_prefixed_syscall" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_prefixed_syscall"
gdb_test "break test_prefixed_syscall_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_prefixed_syscall_end"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_prefixed_syscall ().*" \
    "continue to test_prefixed_syscall"
gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_prefixed_syscall_end ().*" \
    "continue to test_prefixed_syscall_end"

##########################################

# int3 (with prefixes)
# These don't occur in normal code, but gdb should still DTRT.

gdb_test "break test_int3" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_int3"
gdb_test "break test_int3_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_int3_end"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_int3 ().*" \
    "continue to test_int3"

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_int3_end ().*" \
    "continue to test_int3_end"

##########################################

# Done, run program to exit.

gdb_continue_to_end "i386-disp-step"
