#   Copyright 1998-2020 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_trace_common_supports_arch] {
    unsupported "no trace-common.h support for arch"
    return -1
}
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested "failed to compile"
    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"
    }
}
