# 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 actions.c
set executable $testfile
set expfile tstatus.exp

if [prepare_for_testing $expfile $executable $srcfile \
	[list debug]] {
    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 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 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
}

proc run_trace_experiment {} {
    global gdb_prompt

#    gdb_test_no_output "set debug remote 1" ""

    gdb_test "continue" \
	".*Breakpoint \[0-9\]+, begin .*" \
	"advance to trace begin"

    gdb_test_no_output "tstart my tracing note" "start trace experiment"

    gdb_test "continue" \
	".*Breakpoint \[0-9\]+, end .*" \
	"advance through tracing"

    # Now play with tstatus a bit.
    # Since note support is optional, we need to match both with and without
    # cases.

    gdb_test_multiple "tstatus" "check on trace status" {
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Trace notes: my tracing note\.\[\r\n\]+Not looking at any trace frame\..*\r\n$gdb_prompt $" {
	    pass "tstatus reports trace note"
	}
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Not looking at any trace frame.*\r\n$gdb_prompt $" {
	    pass "tstatus does not report any trace note"
	}
    }

    gdb_test "set trace-notes different note" "" "change tracing note"

    gdb_test_multiple "tstatus" "check on trace status with diff note" {
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Trace notes: different note\.\[\r\n\]+Not looking at any trace frame\..*\r\n$gdb_prompt $" {
	    pass "tstatus reports different trace note"
	}
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Not looking at any trace frame.*\r\n$gdb_prompt $" {
	    pass "tstatus does not report any different trace note"
	}
    }

    gdb_test "set trace-user me me me" "" "change tracing user"

    gdb_test_multiple "tstatus" "check on trace status with diff note" {
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Trace user is me me me\.\[\r\n\]+Trace notes: different note\.\[\r\n\]+Not looking at any trace frame\..*\r\n$gdb_prompt $" {
	    pass "tstatus reports trace user"
	}
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Not looking at any trace frame.*\r\n$gdb_prompt $" {
	    pass "tstatus does not report trace user"
	}
    }

    gdb_test_no_output "tstop because I can" "trace stopped with note"

    gdb_test_multiple "tstatus" "check on trace status after stop" {
	-re "Trace stopped by a tstop command (because I can)\..*Trace will stop if GDB disconnects\.\[\r\n\]+Trace user is me me me\.\[\r\n\]+Trace notes: different note\.\[\r\n\]+Not looking at any trace frame\..*\r\n$gdb_prompt $" {
	    pass "tstatus reports trace stop reason"
	}
	-re "Trace stopped by a tstop command\..*\r\n$gdb_prompt $" {
	    pass "tstatus does not report trace stop reason"
	}
    }

    # Tracepoint hit count is optional, so pass it either way.

    gdb_test_multiple "info trace" "show tracepoint state" {
	-re "actions\.c:\[0-9\]+\[\r\n\]+\[\t ]+tracepoint already hit 1 time\[\r\n\]+\[\t ]+collect parm.*\r\n$gdb_prompt $" {
	    pass "info trace reports tracepoint hit count"
	}
	-re "actions\.c:\[0-9\]+\[\r\n\]+\[\t ]+collect parm.*\r\n$gdb_prompt $" {
	    pass "info trace does not report tracepoint hit count"
	}
    }
}

proc test_tracepoints {} {
    global gdb_prompt

    gdb_test "break begin" ".*" ""

    gdb_test "break end" ".*" ""

    gdb_test "trace gdb_c_test" "Tracepoint .*" \
	"tracepoint at gdb_c_test"

    gdb_trace_setactions "collect at set_point: define actions" \
	"" \
	"collect parm" "^$"
    set fastgood 0

    gdb_test_multiple "ftrace gdb_recursion_test" "set fast tracepoint" {
	-re "May not have a fast tracepoint at .*\r\n$gdb_prompt $" {
	    pass "4-byte fast tracepoint could not be set"
	}
	-re "Fast tracepoint .*\r\n$gdb_prompt $" {
	    pass "4-byte fast tracepoint is set"
	    set fastgood 1
	}
    }

    if { $fastgood } {

	gdb_trace_setactions "collect at four_byter: define actions" \
	    "" \
	    "collect globvar, anarg" "^$"
    }

    run_trace_experiment

}

gdb_reinitialize_dir $srcdir/$subdir

if { [gdb_test "info sharedlibrary" ".*${libipa}.*" "IPA loaded"] != 0 } {
    untested "Could not find IPA lib loaded"
    return 1
}

test_tracepoints
