#   Copyright (C) 1998 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Michael Snyder (msnyder@cygnus.com)

load_lib "trace-support.exp";

if $tracelevel then {
    strace $tracelevel
}

set prms_id 0
set bug_id 0

gdb_exit
gdb_start
if [istarget "m68k-*-elf"] then {
    load_lib "emc-support.exp";
    set srcfile gdb_c_test.c
    set binfile [board_info target d490_binfile];
    gdb_test "set remotetimeout 6" "" ""
    set timeout 500
    gdb_target_monitor $binfile
    # Give a TSTOP and ignore errors, to make sure any previous trace is off
    gdb_test "tstop" "" ""
    gdb_test "tfind none" "" ""
    send_gdb "compare-sections CS\n"
    gdb_expect {
	-re "MIS-MATCHED.*$gdb_prompt $" {
	    gdb_suppress_entire_file "Symbol file does not match target!
	    all tests in this module will fail.";
	}
	-re ".*$gdb_prompt $" { }
    }
} else {
    set testfile "actions"
    set srcfile ${testfile}.c
    set binfile $objdir/$subdir/$testfile
    if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	    executable {debug additional_flags=-w}] != "" } {
	gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
    }
    gdb_load $binfile
    gdb_test "tstop"       "" ""
    gdb_test "tfind none"  "" ""
    runto_main
}
gdb_reinitialize_dir $srcdir/$subdir

# We generously give ourselves one "pass" if we successfully 
# detect that this test cannot be run on this target!
if { ![gdb_target_supports_trace] } then {
    pass "Current target does not supporst trace"
    return 1;

}

# If testing on a remote host, download the source file.
# remote_download host $srcdir/$subdir/$srcfile


#
# test passcount dynamically (live target)
#

set baseline [gdb_find_recursion_test_baseline $srcfile];

if { $baseline == -1 } then {
    fail "Could not find gdb_recursion_test function"
    return;
}

# define relative source line numbers:
# all subsequent line numbers are relative to this first one (baseline)

set testline2  [expr $baseline +  4]
set testline3  [expr $baseline +  5]
set testline4  [expr $baseline +  6]

#
# test passcount command semantics (live test)
#

## Set three tracepoints with three different passcounts.
## Verify that the experiment stops after the one with the 
## lowest passcount is hit.

gdb_delete_tracepoints
set tdp2 [gdb_gettpnum "$testline2"]
set tdp3 [gdb_gettpnum "$testline3"]
set tdp4 [gdb_gettpnum "$testline4"]
if { $tdp2 <= 0 || $tdp3 <= 0 || $tdp4 <= 0 } then {
    fail "setting tracepoints"
    return;
}

gdb_test "passcount 4 $tdp2" "Setting tracepoint $tdp2's passcount to 4" \
	"4.5: set passcount for tracepoint $tdp2"
gdb_test "passcount 2 $tdp3" "Setting tracepoint $tdp3's passcount to 2" \
	"4.5: set passcount for tracepoint $tdp3"
gdb_test "passcount 3 $tdp4" "Setting tracepoint $tdp4's passcount to 3" \
	"4.5: set passcount for tracepoint $tdp4"

gdb_test "tstart" "" ""

if [istarget "m68k-*-elf"] then {
    gdb_emclaptop_command "85,1,2,3,4,5,6"
    sleep 5
    gdb_emclaptop_command "85,7,8,9,A,B,C"
    sleep 5
    gdb_emclaptop_command "85,D,E,F,10,11,12"
    sleep 5
    # gdb_test "tstop"
    ##
    ## Note! Must NOT give the tstop command, because the passcount
    ##       has already stopped the experiment.  You would not
    ##       think this would be an error, but in EMC's mind it is...
    ##
} else {
    gdb_test "break end" "" ""
    gdb_test "continue" \
	    "Continuing.*Breakpoint $decimal, end.*" \
	    "run trace experiment"
    gdb_test "tstop" "" ""
}

gdb_test "tfind none" "" ""
if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x -1 x" ""] {
    gdb_suppress_entire_file "0: tfind none failed"
}

gdb_test "tfind tracepoint $tdp2" "" ""
if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x 0 x" ""] {
    gdb_suppress_entire_file "1: first tfind failed"
}

gdb_test "tfind tracepoint $tdp3" "" ""
if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x 1 x" ""] {
    gdb_suppress_entire_file "2: second tfind failed"
}

gdb_test "tfind tracepoint $tdp4" "" ""
if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x 2 x" ""] {
    gdb_suppress_entire_file "3: third tfind failed"
}

gdb_test "tfind tracepoint $tdp2" "" ""
if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x 3 x" ""] {
    gdb_suppress_entire_file "4: fourth tfind failed"
}

gdb_test "tfind tracepoint $tdp3" "" ""
if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x 4 x" ""] {
    gdb_suppress_entire_file "5: fifth tfind failed"
}

## We should now be at the last frame, because this frame's passcount
## should have caused collection to stop.  If we do a tfind now, 
## it should fail.

gdb_test "tfind" "failed to find.*" "4.5: dynamic passcount test"

# Finished!
gdb_test "tfind none" "" ""

