#   Copyright 1998, 2007, 2008, 2009, 2010 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/>.

# 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
set testfile "actions"
set srcfile ${testfile}.c
set binfile $objdir/$subdir/tracecmd
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 "set breakpoint pending off" ""
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" "No default breakpoint address now." \
	"1.9: trace <no arguments>"

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

# 1.11 tracepoint conditions
gdb_delete_tracepoints
gdb_test "trace gdb_recursion_test if q1 > 0" \
	"Tracepoint $decimal at $hex: file.*$srcfile, line $testline1." \
	"1.11a: conditional tracepoint"
gdb_test "info trace" "in gdb_recursion_test.*$srcfile:$testline1.*trace only if q1 > 0" \
	"1.11b: verify conditional tracepoint"

# 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"

# 1.15 ftrace

gdb_delete_tracepoints

send_gdb "ftrace gdb_recursion_test\n"
# Acceptance vs rejection of a location are target-specific, so allow both.
gdb_expect {
    -re "Fast tracepoint $decimal at $hex: file.*$srcfile, line $testline1.*$gdb_prompt $"
    { pass "Set a fast tracepoint" }
    -re ".*May not have a fast tracepoint at $hex.*$gdb_prompt $"
    { pass "Declined to set a fast tracepoint" }
    timeout { fail "Timeout while setting fast tracepoint" }
}
