#   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}] != "" } {
	untested tracecmd.exp
	return -1
    }
}
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;
test_class_help "tracepoints" {
    "Tracing of program execution without stopping the program\.[\r\n\]+" 
} "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"


