# Copyright 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"
load_lib "range-stepping-support.exp"

standard_testfile
set executable $testfile

if [prepare_for_testing $testfile.exp $executable $srcfile \
	{debug nowarnings}] {
    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;
}

# Check that range stepping works well with tracepoints.

proc range_stepping_with_tracepoint { type } {
    with_test_prefix "${type}" {
	gdb_breakpoint [gdb_get_line_number "location 1"]
	gdb_continue_to_breakpoint "location 1"
	delete_breakpoints

	gdb_test "${type} *set_point" ".*"
	gdb_test_no_output "tstart"

	# Step a line with a tracepoint in the middle.  The tracepoint
	# itself shouldn't have any effect on range stepping.  We
	# should see one vCont;r and no vCont;s's.
	exec_cmd_expect_vCont_count "step" 0 1
	gdb_test_no_output "tstop"
	gdb_test "tfind" "Found trace frame .*" "first tfind"
	gdb_test "tfind" \
	    "Target failed to find requested trace frame.*" \
	    "second tfind"

	delete_breakpoints
    }
}

range_stepping_with_tracepoint "trace"

set libipa [get_in_proc_agent]
gdb_load_shlibs $libipa

if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable [list debug nowarnings 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 {
    range_stepping_with_tracepoint "ftrace"
}
