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

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