#   Copyright 1998-2013 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"


gdb_exit
gdb_start
standard_testfile actions.c
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.
\[\t \]+not installed on target." \
	"1.1b: trace sourcefile:line"

# 1.2 trace invalid source line
gdb_delete_tracepoints
gdb_test_no_output "set breakpoint pending off"
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.
\[\t \]+not installed on target." \
	"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.
gdb_test_multiple "print gdb_asm_test" "" {
    -re "\[$\]\[0-9\].*0x(\[0-9a-fA-F\]+).*$gdb_prompt $" {
	set asm_test_addr $expect_out(1,string)
    }
}

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
gdb_test_multiple "print gdb_recursion_test" "" {
    -re "\[$\]\[0-9\].*0x(\[0-9a-fA-F\]+).*$gdb_prompt $" {
	set c_test_addr $expect_out(1,string)
    }
}

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.
\[\t \]+not installed on target." \
	"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 there's no 1.10.

# 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.
\[\t \]+trace only if q1 > 0.
\[\t \]+not installed on target." \
	"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

# Acceptance vs rejection of a location are target-specific, so allow both.
gdb_test_multiple "ftrace gdb_recursion_test" "Set a fast tracepoint" {
    -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"
    }
}
