# Copyright 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 { [gdb_compile_pthreads "$srcdir/$subdir/$srcfile" $binfile \
	  executable [list debug $additional_flags] ] != "" } {
    untested "Couldn't compile test program"
    return -1
}

clean_restart ${testfile}

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
}

proc step_over_tracepoint { trace_type } \
{with_test_prefix "step over $trace_type" \
{
    global executable
    global hex

    # Start with a fresh gdb.
    clean_restart ${executable}
    # Make sure inferior is running in all-stop mode.
    gdb_test_no_output "set non-stop 0"
    if ![runto_main] {
	fail "Can't run to main"
	return -1
    }

    gdb_test "break set_point1" "Breakpoint \[0-9\] at $hex: file.*"
    gdb_test "continue" "Continuing\\.\[ \r\n\]+.*Breakpoint.*" "continue to set_point1"

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

    gdb_test "stepi" ".*"
    gdb_test_no_output "tstop"
}}

# Set breakpoint and tracepoint at the same address.

proc break_trace_same_addr { trace_type option } \
{with_test_prefix "$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_point1" "Breakpoint \[0-9\] at $hex: file.*"
    gdb_test "${trace_type} set_point1" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"

    gdb_test_no_output "tstart"

    gdb_test "continue" "Continuing\\.\[ \r\n\]+.*Breakpoint.*" "continue to set_point1 1"
    gdb_test "continue" "Continuing\\.\[ \r\n\]+.*Breakpoint.*" "continue to set_point1 2"

    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\\..*"
}}

foreach break_always_inserted { "on" "off" } {
    break_trace_same_addr "trace" ${break_always_inserted}
}

step_over_tracepoint "trace"

set libipa [get_in_proc_agent]
gdb_load_shlibs $libipa

# Compile test case again with IPA.
if { [gdb_compile_pthreads "$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 "ftrace" ${break_always_inserted}
    }

    step_over_tracepoint "ftrace"
}
