#   Copyright 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 {
    set srcfile gdb_c_test.c
    set binfile [board_info target d490_binfile];
} else {
    set testfile "actions"
    set srcfile ${testfile}.c
    set binfile $objdir/$subdir/$testfile
    if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	    executable {debug nowarnings}] != "" } {
	gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
    }
}
gdb_reinitialize_dir $srcdir/$subdir

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

gdb_file_cmd $binfile

# define relative source line numbers:
# all subsequent line numbers are relative to this first one (baseline)
set baseline  [gdb_find_recursion_test_baseline $srcfile];
if { $baseline == -1 } then {
    fail "Could not find gdb_recursion_test function"
    return;
}

set testline1 [expr $baseline + 1]
set testline2 [expr $baseline + 3]

#
# test "help tracepoints"
#

set helpcnt 0;
send_gdb "help tracepoints\n"
gdb_expect {
    -re "Tracing of program execution without stopping the program." {
	incr helpcnt;
	exp_continue
    }
    -re "actions -- Specify the actions to be taken at a tracepoint" {
	incr helpcnt;
	exp_continue
    }
    -re "collect -- Specify one or more data items to be collected" {
	incr helpcnt;
	exp_continue
    }
    -re "delete tracepoints -- Delete specified tracepoints" {
	incr helpcnt;
	exp_continue
    }
    -re "end -- Ends a list of.*actions" {
	incr helpcnt;
	exp_continue
    }
    -re "info tracepoints -- Status of tracepoints" {
	incr helpcnt;
	exp_continue
    }
    -re "passcount -- Set the passcount for a tracepoint" {
	incr helpcnt;
	exp_continue
    }
    -re "save-tracepoints -- Save current tracepoint definitions" {
	incr helpcnt;
	exp_continue
    }
    -re "tdump -- Print everything collected at the current tracepoint" {
	incr helpcnt;
	exp_continue
    }
    -re "tfind -- Select a trace frame" {
	incr helpcnt;
	exp_continue
    }
    -re "tfind end -- Synonym for 'none'" {
	incr helpcnt;
	exp_continue
    }
    -re "tfind line -- Select a trace frame by line number" {
	incr helpcnt;
	exp_continue
    }
    -re "tfind none -- De-select any trace frame and resume 'live' debugging" {
	incr helpcnt;
	exp_continue
    }
    -re "tfind outside -- Select a trace frame whose PC is outside" {
	incr helpcnt;
	exp_continue
    }
    -re "tfind pc -- Select a trace frame by PC" {
	incr helpcnt;
	exp_continue
    }
    -re "tfind range -- Select a trace frame whose PC is in the given" {
	incr helpcnt;
	exp_continue
    }
    -re "tfind start -- Select the first trace frame in the trace buffer" {
	incr helpcnt;
	exp_continue
    }
    -re "tfind tracepoint -- Select a trace frame by tracepoint number" {
	incr helpcnt;
	exp_continue
    }
    -re "trace -- Set a tracepoint at a specified line or function or addr" {
	incr helpcnt;
	exp_continue
    }
    -re "tstart -- Start trace data collection" {
	incr helpcnt;
	exp_continue
    }
    -re "tstatus -- Display the status of the current trace data collection" {
	incr helpcnt;
	exp_continue
    }
    -re "tstop -- Stop trace data collection" {
	incr helpcnt;
	exp_continue
    }
    -re "while-stepping -- Specify single-stepping behavior at a tracepoint" {
	incr helpcnt;
	exp_continue
    }
    -re ".*$gdb_prompt $" {
	if { $helpcnt == 21 } {
	    pass "1.0: help tracepoints"
	} else {
	    warning "$helpcnt";
	    fail "1.0: help tracepoints"
	}
    }
}

#
# test trace command:
#

# 1.1 trace source line
gdb_delete_tracepoints
gdb_test "trace $srcfile:$testline2" \
	"Tracepoint $decimal at $hex: file.*$srcfile, line $testline2." \
	"1.1a: set tracepoint at sourceline"
gdb_test "info trace" "in gdb_recursion_test.*$srcfile:$testline2" \
	"1.1b: trace sourcefile:line"

# 1.2 trace invalid source line
gdb_delete_tracepoints
gdb_test "trace $srcfile:99999" "No line 99999 in file \".*$srcfile\"." \
	"1.2a: trace invalid line in sourcefile"
gdb_test "info trace" "No tracepoints.*" \
	"1.2b: reject invalid line in srcfile"

# 1.3 trace line in invalid source file
gdb_delete_tracepoints
gdb_test "trace NoSuChFiLe.c:1" "No source file named NoSuChFiLe.c." \
	"1.3a: trace invalid source file"
gdb_test "info trace" "No tracepoints.*" \
	"1.3b: reject invalid srcfile"

# 1.4 trace function by name
gdb_delete_tracepoints
gdb_test "trace gdb_recursion_test" \
	"Tracepoint $decimal at $hex: file.*$srcfile, line $testline1." \
	"1.4a: trace function by name"
gdb_test "info trace" "in gdb_recursion_test.*$srcfile:$testline1" \
	"1.4b: trace function by name"

# 1.5 trace non-existant function
gdb_delete_tracepoints
gdb_test "trace NoSuChFuNc" "Function \"NoSuChFuNc\" not defined." \
	"1.5a: trace invalid function"
gdb_test "info trace" "No tracepoints.*" \
	"1.5b: reject invalid srcfile"

# 1.6 trace at a specific address
#     Collect the address of "gdb_asm_test", and use that.
send_gdb "print gdb_asm_test\n"
gdb_expect {
    -re "\[$\]\[0-9\].*0x(\[0-9a-fA-F\]+).*$gdb_prompt $" {
	set asm_test_addr $expect_out(1,string)
    }
    timeout { }
}

gdb_delete_tracepoints
gdb_test "trace \*0x$asm_test_addr" \
	"Tracepoint $decimal at .*$asm_test_addr.*" \
	"1.6a: trace at specific address"
gdb_test "info trace" "$asm_test_addr.*gdb_asm_test.*" \
	"1.6b: verify trace at specific address"

# 1.7 trace at function's exact address
#     Collect the address of the function for comparison
send_gdb "print gdb_recursion_test\n"
gdb_expect {
    -re "\[$\]\[0-9\].*0x(\[0-9a-fA-F\]+).*$gdb_prompt $" {
	set c_test_addr $expect_out(1,string)
    }
    timeout { }
}

gdb_delete_tracepoints
gdb_test "trace \*gdb_recursion_test" \
	"Tracepoint $decimal at .*$c_test_addr.*" \
	"1.7a: trace at function label (before prologue)"
gdb_test "info trace" "$c_test_addr.*in gdb_recursion_test.*:$baseline" \
	"1.7b: verify trace at specific address"

# 1.8 trace at invalid address
# no address is invalid

# 1.9 trace no arguments
gdb_test "trace" "trace command requires an argument" \
	"1.9: trace <no arguments>"

# 1.10 set large number of tracepoints
# deferred to limits test module

# 1.11 tracepoint conditions
# conditions on tracepoints not implemented

# 1.12 set tracepoint in prologue
# [see tfind.exp]

# 1.13 trace on recursion
# interesting only in "live" session: see backtrace.exp for live test.

# 1.14 help trace
gdb_test "help trace" "Set a tracepoint at .*" "1.14: help trace"


