# Copyright 2012-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 { [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"
}
