# Copyright 2009-2013 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 amd64 displaced stepping.


if { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
    verbose "Skipping x86_64 displaced stepping tests."
    return
}

set newline "\[\r\n\]*"

standard_testfile .S

set additional_flags "-Wa,-g"

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } {
    untested amd64-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"

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

# Test abs-jmp/rep-ret.

gdb_test "break test_abs_jmp" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_abs_jmp"
gdb_test "break test_abs_jmp_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_abs_jmp_end"

gdb_test "break test_rep_ret" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_rep_ret"
gdb_test "break test_rep_ret_end" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "break test_rep_ret_end"

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

gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_rep_ret ().*" \
    "continue to test_rep_ret"
gdb_test "continue" \
    "Continuing.*Breakpoint.*, test_rep_ret_end ().*" \
    "continue to test_rep_ret_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"

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

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

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

# Test rip-relative.
# GDB picks a spare register to hold the rip-relative address.
# Exercise all the possibilities (rax-rdi, sans rsp).

# The order must much the order in srcfile.
set rip_regs { "rax" "rbx" "rcx" "rdx" "rbp" "rsi" "rdi" }

# Assign val to all specified regs.

proc set_regs { regs val } {
    global gdb_prompt

    foreach reg ${regs} {
	# Use send_gdb/gdb_expect so that these aren't logged as pass/fail.
	send_gdb "set \$${reg} = ${val}\n"
	gdb_expect 10 {
	    -re "$gdb_prompt $" { 
		verbose "Setting ${reg} to ${val}." 2
	    }
	    timeout {
		warning "Couldn't set ${reg} to ${val}."
	    }
	}
    }
}

# Verify all REGS equal VAL, except REG which equals REG_VAL.

proc verify_regs { test_name regs val except_reg except_reg_val } {
    global newline

    foreach reg ${regs} {
	set expected ${val}
	if { "${reg}" == "${except_reg}" } {
	    set expected ${except_reg_val}
	}
	# The cast to (int) is because RBP is printed as a pointer.
	gdb_test "p (int) \$${reg}" " = ${expected}${newline}" "${test_name} ${reg} expected value"
    }
}

proc rip_test { reg } {
    global srcfile rip_regs

    set test_start_label "test_rip_${reg}"
    set test_end_label "test_rip_${reg}_end"

    gdb_test "break ${test_start_label}" \
	"Breakpoint.*at.* file .*$srcfile, line.*" \
	"break ${test_start_label}"
    gdb_test "break ${test_end_label}" \
	"Breakpoint.*at.* file .*$srcfile, line.*" \
	"break ${test_end_label}"

    gdb_test "continue" \
	"Continuing.*Breakpoint.*, ${test_start_label} ().*" \
	"continue to ${test_start_label}"

    set_regs ${rip_regs} 0

    gdb_test "continue" \
	"Continuing.*Breakpoint.*, ${test_end_label} ().*" \
	"continue to ${test_end_label}"

    verify_regs "test rip w/${reg}" ${rip_regs} 0 ${reg} 42
}

foreach reg ${rip_regs} {
    rip_test $reg
}

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

# Done, run program to exit.

gdb_continue_to_end "amd64-disp-step"
