# Copyright 2009 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 $tracelevel {
    strace $tracelevel
}

set prms_id 0
set bug_id 0

if ![istarget "i?86-*-linux*"] 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"
