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

load_lib "trace-support.exp"

standard_testfile
set executable $testfile
set expfile $testfile.exp

# Some targets have leading underscores on assembly symbols.
set additional_flags [gdb_target_symbol_prefix_flags]

if [prepare_for_testing $expfile $executable $srcfile \
	[list debug $additional_flags]] {
    untested "failed to prepare for trace tests"
    return -1
}

if ![runto_main] {
    fail "Can't run to main to check for trace support"
    return -1
}

if ![gdb_target_supports_trace] {
    unsupported "target does not support trace"
    return -1
}

set fpreg "fp"
set spreg "sp"
set pcreg "pc"

if [is_amd64_regs_target] {
    set fpreg "rbp"
    set spreg "rsp"
    set pcreg "rip"
} elseif [is_x86_like_target] {
    set fpreg "ebp"
    set spreg "esp"
    set pcreg "eip"
}

# Set breakpoint and tracepoint at the same address.

proc break_trace_same_addr_1 { trace_type option } \
{ with_test_prefix "1 $trace_type $option" \
{
    global executable
    global hex

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	return -1
    }

    gdb_test_no_output "set breakpoint always-inserted ${option}"

    gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"

    gdb_test "break set_point" "Breakpoint \[0-9\] at $hex: file.*"
    gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"

    gdb_test_no_output "tstart"

    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to set_point"

    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
    gdb_test_no_output "tstop"

    gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0"
    gdb_test "tfind" "Target failed to find requested trace frame\\..*"
}}

# Set multiple tracepoints at the same address.

proc break_trace_same_addr_2 { trace_type1 trace_type2 option } \
{ with_test_prefix "2 $trace_type1 $trace_type2 $option" \
{
    global executable
    global hex

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	return -1
    }

    gdb_test_no_output "set breakpoint always-inserted ${option}"

    gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"

    gdb_test "${trace_type1} set_point" \
	"\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
	"${trace_type1} set_point (1)"

    gdb_test "${trace_type2} set_point" \
	"\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
	"${trace_type2} set_point (2)"

    gdb_test_no_output "tstart"
    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"

    gdb_test_no_output "tstop"

    gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0"
    gdb_test "tfind" "Found trace frame 1, tracepoint .*" "tfind frame 1"
    gdb_test "tfind" "Target failed to find requested trace frame\\..*"
}}

# Set breakpoint and tracepoint at the same address.  Delete breakpoint, and verify
# that tracepoint still works.

proc break_trace_same_addr_3 { trace_type option } \
{ with_test_prefix "3 $trace_type $option" \
{
    global executable
    global hex

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	return -1
    }

    gdb_test_no_output "set breakpoint always-inserted ${option}"
    gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
    gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"

    gdb_test "break set_point" "Breakpoint \[0-9\] at $hex: file.*"
    gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"

    gdb_test_no_output "tstart"

    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"
    gdb_test "delete break 4"

    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
    gdb_test_no_output "tstop"

    gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0"
    gdb_test "tfind" "Target failed to find requested trace frame\\..*"
}}

# Set breakpoint and tracepoint at the same address.  Delete tracepoint, and verify
# that breakpoint still works.

proc break_trace_same_addr_4 { trace_type option } \
{ with_test_prefix "4 $trace_type $option" \
{
    global executable
    global hex


    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	return -1
    }

    gdb_test_no_output "set breakpoint always-inserted ${option}"
    gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
    gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"

    gdb_test "break set_point" "Breakpoint \[0-9\] at $hex: file.*"
    gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"

    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"
    # Delete tracepoint set on set_point.
    gdb_test "delete trace 5"

    gdb_test "tstart" "No tracepoints defined, not starting trace.*"

    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to set_point"
    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
    gdb_test "tstop" "Trace is not running.*"

    gdb_test "tfind" "Target failed to find requested trace frame\\..*"
}}

# Set two tracepoints TRACE1 and TRACE2 at two locations, and start tracing.
# Then, set tracepoint TRACE3 at either of these two locations.
# TRACE3_AT_FIRST_LOC is a boolean variable to decide insert TRACE3 at which
# of two locations.  Verify  these tracepoints work as expected.

proc break_trace_same_addr_5 { trace1 trace2 trace3 trace3_at_first_loc } \
{ with_test_prefix "5 $trace1 $trace2 ${trace3}@${trace3_at_first_loc}" \
{
    global executable
    global hex
    global fpreg
    global spreg
    global pcreg

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	return -1
    }

    gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
    gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"

    gdb_test "${trace1} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
	"${trace1} set_point 1"
    gdb_trace_setactions "set action for tracepoint 1" "" \
	"collect \$$pcreg" "^$"
    gdb_test "${trace2} after_set_point" \
	"\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
	"${trace2} after_set_point 1"

    gdb_trace_setactions "set action for tracepoint 2" "" \
	"collect \$$spreg" "^$"

    gdb_test_no_output "tstart"

    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"

    if [string equal $trace3_at_first_loc "1"] {
	gdb_test "${trace3} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
	    "${trace3} set_point 2"
    } else {
	gdb_test "${trace3} after_set_point" \
	    "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
	    "${trace2} after_set_point 2"
    }
    gdb_trace_setactions "set action for tracepoint 3" "" \
	"collect \$$fpreg" "^$"

    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
    gdb_test_no_output "tstop"

    gdb_test "tfind tracepoint 4" "Found trace frame \[0-9\], tracepoint .*" \
	"tfind test frame of tracepoint 4"
    gdb_test "tdump" \
	"Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*" \
	"tdump 1"
    gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
	"reset to frame 0 (1)"
    gdb_test "tfind tracepoint 5" "Found trace frame \[0-9\], tracepoint .*" \
	"tfind test frame of tracepoint 5"
    gdb_test "tdump" \
	"Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${spreg} = .*" \
	"tdump 2"
    gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
	"reset to frame 0 (2)"
    gdb_test "tfind tracepoint 6" "Found trace frame \[0-9\], tracepoint .*" \
	"tfind test frame of tracepoint 6"
    gdb_test "tdump" \
	"Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${fpreg} = .*" \
	"tdump 3"
}}

# Set two tracepoints at the same address, and enable/disable them.  Verify
# tracepoints work as expect.

proc break_trace_same_addr_6 { trace1 enable1 trace2 enable2 } \
{ with_test_prefix "6 $trace1 $enable1 $trace2 $enable2" \
{
    global executable
    global hex
    global gdb_prompt
    global spreg
    global pcreg

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	return -1
    }

    gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
    gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"

    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"

    gdb_test "${trace1} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
	"${trace1} set_point 1"
    gdb_trace_setactions "set action for tracepoint 1" "" \
	"collect \$$pcreg" "^$"
    gdb_test "${trace2} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
    	"${trace2} set_point 2"
    gdb_trace_setactions "set action for tracepoint 2" "" \
	"collect \$$spreg" "^$"

    gdb_test_no_output "$enable1 4"
    gdb_test_no_output "$enable2 5"

    gdb_test_no_output "tstart"
    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
    gdb_test_no_output "tstop"


    if [string equal $enable1 "enable"] {
	gdb_test "tfind tracepoint 4" "Found trace frame \[0-9\], tracepoint .*" \
	    "tfind test frame of tracepoint 4"
	gdb_test "tdump" \
	    "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*" \
	    "tdump 1"
	gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
	    "reset to frame 0 (1)"
    } else {
	gdb_test "tfind tracepoint 4" "Target failed to find requested trace frame.*" \
	    "tfind test frame of tracepoint 4"
    }

    if [string equal $enable2 "enable"] {
	gdb_test "tfind tracepoint 5" "Found trace frame \[0-9\], tracepoint .*" \
	    "tfind test frame of tracepoint 5"
	gdb_test "tdump" \
	    "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${spreg} = .*" \
	    "tdump 2"
	gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
	    "reset to frame 0 (2)"
    } else {
	gdb_test "tfind tracepoint 5" "Target failed to find requested trace frame.*" \
	    "tfind test frame of tracepoint 5"
    }
}}


foreach break_always_inserted { "on" "off" } {
    break_trace_same_addr_1 "trace" ${break_always_inserted}
    break_trace_same_addr_2 "trace" "trace" ${break_always_inserted}
    break_trace_same_addr_3 "trace" ${break_always_inserted}
    break_trace_same_addr_4 "trace" ${break_always_inserted}
}

foreach at_first_loc { "1" "0" } {
    break_trace_same_addr_5 "trace" "trace" "trace" ${at_first_loc}
}

break_trace_same_addr_6 "trace" "enable" "trace" "disable"
break_trace_same_addr_6 "trace" "disable" "trace" "enable"

set libipa [get_in_proc_agent]
gdb_load_shlibs $libipa

# Can't use prepare_for_testing, because that splits compiling into
# building objects and then linking, and we'd fail with "linker input
# file unused because linking not done" when building the object.

if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable [list debug $additional_flags shlib=$libipa] ] != "" } {
    untested "failed to compile ftrace tests"
    return -1
}
clean_restart ${executable}

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

gdb_reinitialize_dir $srcdir/$subdir
if { [gdb_test "info sharedlibrary" ".*${libipa}.*" "IPA loaded"] != 0 } {
    untested "Could not find IPA lib loaded"
} else {
    foreach break_always_inserted { "on" "off" } {
	break_trace_same_addr_1 "ftrace" ${break_always_inserted}
	break_trace_same_addr_2 "trace" "ftrace" ${break_always_inserted}
	break_trace_same_addr_2 "ftrace" "trace" ${break_always_inserted}
	break_trace_same_addr_2 "ftrace" "ftrace" ${break_always_inserted}
	break_trace_same_addr_3 "ftrace" ${break_always_inserted}
	break_trace_same_addr_4 "ftrace" ${break_always_inserted}
    }

    foreach trace1 { "trace" "ftrace" } {
	foreach trace2 { "trace" "ftrace" } {
	    foreach trace3 { "trace" "ftrace" } {

		if { [string equal $trace1 "trace"]
		     && [string equal $trace2 "trace"]
		     && [string equal $trace3 "trace"] } {
		    continue
		}

		foreach at_first_loc { "1" "0" } {
		    break_trace_same_addr_5 $trace1 $trace2 $trace3 $at_first_loc
		}
	    }
	}
    }

    foreach trace1 { "trace" "ftrace" } {
	foreach trace2 { "trace" "ftrace" } {
	    if { [string equal $trace1 "trace"]
		 && [string equal $trace2 "trace"] } {
		    continue
		}
	    break_trace_same_addr_6 $trace1 "enable" $trace2 "disable"
	    break_trace_same_addr_6 $trace1 "disable" $trace2 "enable"
	}
    }
}
