# Copyright 2011 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";

set testfile "trace-break"
set executable $testfile
set srcfile $testfile.c
set binfile $objdir/$subdir/$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 } {
    global executable
    global pf_prefix
    global hex

    set old_pf_prefix $pf_prefix
    set pf_prefix "$pf_prefix 1 $trace_type $option:"

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	set pf_prefix $old_pf_prefix
	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 pf_prefix $old_pf_prefix
}

# Set multiple tracepoints at the same address.

proc break_trace_same_addr_2 { trace_type1 trace_type2 option } {
    global executable
    global pf_prefix
    global hex

    set old_pf_prefix $pf_prefix
    set pf_prefix "$pf_prefix 2 $trace_type1 $trace_type2 $option:"

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	set pf_prefix $old_pf_prefix
	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 pf_prefix $old_pf_prefix
}

# 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 } {
    global executable
    global pf_prefix
    global hex

    set old_pf_prefix $pf_prefix
    set pf_prefix "$pf_prefix 3 $trace_type $option:"

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	set pf_prefix $old_pf_prefix
	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 pf_prefix $old_pf_prefix
}

# 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 } {
    global executable
    global pf_prefix
    global hex

    set old_pf_prefix $pf_prefix
    set pf_prefix "$pf_prefix 4 $trace_type $option:"

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	set pf_prefix $old_pf_prefix
	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 pf_prefix $old_pf_prefix
}

# 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 } {
    global executable
    global pf_prefix
    global hex
    global fpreg
    global spreg
    global pcreg

    set old_pf_prefix $pf_prefix
    set pf_prefix "$pf_prefix 5 $trace1 $trace2 ${trace3}@${trace3_at_first_loc}:"

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	set pf_prefix $old_pf_prefix
	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 pf_prefix $old_pf_prefix
}

# 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 } {
    global executable
    global pf_prefix
    global hex
    global gdb_prompt
    global spreg
    global pcreg

    set old_pf_prefix $pf_prefix
    set pf_prefix "$pf_prefix 6 $trace1 $enable1 $trace2 $enable2:"

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	set pf_prefix $old_pf_prefix
	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"
    }

    set pf_prefix $old_pf_prefix
}


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 $objdir/../gdbserver/libinproctrace.so
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" ".*libinproctrace\.so.*" "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"
	}
    }
}
