#   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 report.exp
    return -1
}
gdb_load $binfile
gdb_test "tstop"       ".*" ""
gdb_test "tfind none"  ".*" ""
runto_main
gdb_reinitialize_dir $srcdir/$subdir

if { ![gdb_target_supports_trace] } then {
    unsupported "Current target does not support trace"
    return 1

}

set cr "\[\r\n\]+"

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

#
# test general reporting of trace experiment results
#

set testline1 0
set testline2 0
set testline3 0
set testline4 0
set testline5 0
set testline6 0

set arg1 1
set arg2 2
set arg3 3
set arg4 4
set arg5 5
set arg6 6

set gdb_recursion_test_baseline [gdb_find_recursion_test_baseline $srcfile]
if { $gdb_recursion_test_baseline == -1 } {
    fail "Could not find gdb_recursion_test function"
    return
}

set return_me 0

gdb_test_multiple "list $gdb_recursion_test_baseline, +12" "" {
    -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 1 " {
	set testline1 $expect_out(1,string)
	exp_continue
    }
    -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 2 " {
	set testline2 $expect_out(1,string)
	exp_continue
    }
    -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 3 " {
	set testline3 $expect_out(1,string)
	exp_continue
    }
    -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 4 " {
	set testline4 $expect_out(1,string)
	exp_continue
    }
    -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 5 " {
	set testline5 $expect_out(1,string)
	exp_continue
    }
    -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 6 " {
	set testline6 $expect_out(1,string)
	exp_continue
    }
    -re ".*$gdb_prompt $" {
	if { ($testline1 == 0) || ($testline2 == 0) || ($testline3 == 0) || ($testline4 == 0) || ($testline5 == 0) || ($testline6 == 0) } {
	    untested report.exp
	    set return_me 1
all tests in this module will fail."
	}
    }
    default {
	    untested report.exp
	    set return_me 1
all tests in this module will fail."
    } 
}

if { $return_me == 1 } then {
    return -1
}

#
# Setup trace experiment.  This will involve:
#   1) a tracepoint where nothing is collected
#   2) a tracepoint where only regs are collected
#   3) a tracepoint where only args are collected
#   4) a tracepoint where only locals are collected
#   5) a tracepoint where some amount of stack memory is collected.
#   6) a tracepoint where some expressions are collected.
#

gdb_delete_tracepoints
set tdp1 [gdb_gettpnum $testline1]
set tdp2 [gdb_gettpnum $testline2]
set tdp3 [gdb_gettpnum $testline3]
set tdp4 [gdb_gettpnum $testline4]
set tdp5 [gdb_gettpnum $testline5]
set tdp6 [gdb_gettpnum $testline6]

if {    $tdp1 <= 0 || $tdp2 <= 0 || $tdp3 <= 0 || \
	$tdp4 <= 0 || $tdp5 <= 0 || $tdp6 <= 0 } then {
    fail "setting tracepoints failed"
    return
}

gdb_trace_setactions "9.x: setup TP to collect regs" \
	"$tdp2" \
	"collect \$regs" "^$"


gdb_trace_setactions "9.x: setup TP to collect args" \
	"$tdp3" \
	"collect \$args" "^$"

gdb_trace_setactions "9.x: setup TP to collect locals" \
	"$tdp4" \
	"collect \$locs" "^$"

if [is_amd64_regs_target] {
    set fpreg "rbp"
    set spreg "rsp"
    set pcreg "rip"
} elseif [is_x86_like_target] {
    set fpreg "ebp"
    set spreg "esp"
    set pcreg "eip"
} else {
    set fpreg "fp"
    set spreg "sp"
    set pcreg "pc"
}

gdb_trace_setactions "9.x: setup TP to collect stack memory" \
	"$tdp5" \
	"collect \$$fpreg, \*\(void \*\*\) \$$spreg @ 64" "^$"

gdb_trace_setactions "9.x: setup TP to collect expressions" \
	"$tdp6" \
	"collect gdb_char_test, gdb_short_test, gdb_long_test" "^$"

gdb_test "tstart" ".*" ""

gdb_test "break end" ".*" ""
gdb_test "continue" \
    "Continuing.*Breakpoint $decimal, end.*" \
    "run trace experiment"

gdb_test "tstop" ".*" ""

gdb_tfind_test "9.1: init: make sure not debugging any trace frame" \
    "none" "-1"

# 9.3 help tdump

gdb_test "help tdump" "Print everything collected at the current.*" \
	"9.3: help tdump"

# Check the collected trace data from different sources, such as live
# inferior and tfile.

proc use_collected_data { data_source } {
    with_test_prefix "${data_source}" {
	global tdp1 tdp2 tdp3 tdp4 tdp5 tdp6
	global testline1 testline2 testline3 testline4 testline5 testline6
	global pcreg fpreg spreg
	global srcfile srcdir subdir
	global arg1 arg3
	global decimal hex gdb_prompt
	#
	# 9.1 test the tdump command
	#

	set timeout 60

	gdb_tfind_test "9.1: find frame for TP $tdp1" "tracepoint $tdp1" \
	    "\$tracepoint" "$tdp1"

	# Nothing was collected at tdp1, so this tdump should be empty.
	gdb_test "tdump" \
	    "Data collected at tracepoint $tdp1, trace frame $decimal:" \
	    "9.1: tdump, nothing collected"

	gdb_tfind_test "9.1: find frame for TP $tdp2" "tracepoint $tdp2" \
	    "\$tracepoint" "$tdp2"

	# regs were collected at tdp2.
	# How to match for the output of "info registers" on an unknown architecture?
	# For now, assume that most architectures have a register called "pc".

	gdb_test "tdump" \
	    "\[\r\n\]$pcreg .*" \
	    "9.1: tdump, regs collected"

	gdb_tfind_test "9.1: find frame for TP $tdp3" "tracepoint $tdp3" \
	    "\$tracepoint" "$tdp3"

	# args were collected at tdp3
	gdb_test "tdump" \
	    "depth = 3.*q1 = 2.*q2 = 2.*q3 = 3.*q4 = 4.*q5 = 5.*q6 = 6" \
	    "9.1: tdump, args collected"

	gdb_tfind_test "9.1: find frame for TP $tdp4" "tracepoint $tdp4" \
	    "\$tracepoint" "$tdp4"

	# locals were collected at tdp4
	gdb_test "tdump" \
	    "q = 1" \
	    "9.1: tdump, locals collected"

	gdb_tfind_test "9.1: find frame for TP $tdp5" "tracepoint $tdp5" \
	    "\$tracepoint" "$tdp5"

	# stack was collected at tdp5, plus the frame pointer
	gdb_test "tdump" \
	    ".$fpreg = .*$spreg @ 64 = .*" \
	    "9.1: tdump, memrange collected"

	gdb_tfind_test "9.1: find frame for TP $tdp6" "tracepoint $tdp6" \
	    "\$tracepoint" "$tdp6"

	# globals were collected at tdp6
	gdb_test "tdump" \
	    "gdb_char_test = 1.*gdb_short_test = 2.*gdb_long_test = 3" \
	    "9.1: tdump, global variables collected"

	# 9.2 test tdump with arguments
	#     [no go, tdump doesn't have any arguments]

	set linecount1 0
	set linecount2 0
	set linecount3 0
	set linecount4 0
	set linecount5 0
	set linecount6 0

	gdb_tfind_test "11.x, 12.1: find start frame" "start" "0"

	#
	# 11.x test built-in trace variables $trace_frame, $trace_line etc.
	#

	gdb_test "printf \"x %d x\\n\", \$trace_frame" "x 0 x" \
	    "11.1: test \$trace_frame"

	gdb_test "printf \"x %d x\\n\", \$tracepoint" "x $tdp1 x" \
	    "11.2: test \$tracepoint"

	gdb_test "printf \"x %d x\\n\", \$trace_line" "x $testline1 x" \
	    "11.3: test \$trace_line"

	gdb_test_multiple "print \$trace_file" "11.4: test \$trace_file" {
	    -re "\\$\[0-9\]+ = \"$srcfile\"\[\r\n\]+$gdb_prompt $" {
		pass "11.4: test \$trace_file"
	    }
	    -re "\\$\[0-9\]+ = \"$srcdir/$subdir/$srcfile\"\[\r\n\]+$gdb_prompt $" {
		pass "11.4: test \$trace_file"
	    }
	}

	#gdb_test "print \$trace_file" "\"$srcdir/$subdir/$srcfile\"" \
	    #	"11.4: test \$trace_file"

	#
	# 12.x test report generation using arbitrary GDB commands, loops etc.
	#

	gdb_test_multiple "while \$trace_frame != -1\n  output \$trace_file\n  printf \", line \%d \(tracepoint #\%d\)\\n\", \$trace_line, \$tracepoint\n  tfind\n  end" "12.1: trace report #1" {
	    -re ">  end\r\n" {
		exp_continue
	    }
	    -re "^Found trace frame \[0-9\]+, tracepoint \[0-9\]+\r\n" {
		exp_continue
	    }
	    -re "^\[^\r\n\]* line $testline1 .tracepoint .$tdp1\\)\r\n" {
		set linecount1 [expr $linecount1 + 1]
		exp_continue
	    }
	    -re "^\[^\r\n\]* line $testline2 .tracepoint .$tdp2\\)\r\n" {
		set linecount2 [expr $linecount2 + 1]
		exp_continue
	    }
	    -re "^\[^\r\n\]* line $testline3 .tracepoint .$tdp3\\)\r\n" {
		set linecount3 [expr $linecount3 + 1]
		exp_continue
	    }
	    -re "^\[^\r\n\]* line $testline4 .tracepoint .$tdp4\\)\r\n" {
		set linecount4 [expr $linecount4 + 1]
		exp_continue
	    }
	    -re "^\[^\r\n\]* line $testline5 .tracepoint .$tdp5\\)\r\n" {
		set linecount5 [expr $linecount5 + 1]
		exp_continue
	    }
	    -re "^\[^\r\n\]* line $testline6 .tracepoint .$tdp6\\)\r\n" {
		set linecount6 [expr $linecount6 + 1]
		exp_continue
	    }
	    -re "^No trace frame found\r\n$gdb_prompt $" {
		if { ($linecount1 < 4) || ($linecount2 < 4) || ($linecount3 < 4) || ($linecount4 < 4) || ($linecount5 < 4) || ($linecount6 < 4) } {
		    fail "12.1: trace report #1"
		} else {
		    pass "12.1: trace report #1"
		}
	    }
	}

	gdb_tfind_test "12.2: tfind end, selects no frame" "end" "-1"
	gdb_tfind_test "12.2: find first TDP #2 frame" "tracepoint $tdp2" \
	    "\$tracepoint" "$tdp2"

	set linecount2 0

	gdb_test_multiple "while \$trace_frame != -1\n printf \"tracepoint #\%d, FP 0x\%08x, SP 0x\%08x, PC 0x%08x\\n\", \$tracepoint, \$fp, \$sp, \$pc\n tfind tracepoint\n end" "12.2: trace report #2" {
	    -re "tracepoint #$tdp2, FP $hex, SP $hex, PC $hex" {
		set linecount2 [expr $linecount2 + 1]
		exp_continue
	    }
	    -re ".*$gdb_prompt $" {
		if { ($linecount2 < 4) } {
		    fail "12.2: trace report #2"
		} else {
		    pass "12.2: trace report #2"
		}
	    }
	}

	gdb_tfind_test "12.3: tfind end, selects no frame" "end" "-1"
	gdb_tfind_test "12.3: find first TDP #3 frame" "tracepoint $tdp3" \
	    "\$tracepoint" "$tdp3"

	set linecount3 0

	gdb_test_multiple "while \$trace_frame != -1\n printf \"TDP #\%d, frame \%d: depth = \%d, q1 = \%d\\n\", \$tracepoint, \$trace_frame, depth, q1\n tfind tracepoint\n end" "12.3: trace report #3" {
	    -re "TDP #$tdp3, frame $decimal: depth = $decimal, q1 = $decimal" {
		set linecount3 [expr $linecount3 + 1]
		exp_continue
	    }
	    -re ".*$gdb_prompt $" {
		if { ($linecount3 < 4) } {
		    fail "12.3: trace report #3"
		} else {
		    pass "12.3: trace report #3"
		}
	    }
	}

	gdb_tfind_test "12.4: tfind end, selects no frame" "end" "-1"
	gdb_tfind_test "12.4: find first TDP #6 frame" "tracepoint $tdp6" \
	    "\$tracepoint" "$tdp6"

	set linecount6 0

	gdb_test_multiple "while \$trace_frame != -1\n printf \"TDP #\%d, frame %d: char_test = \%d, long_test = \%d\\n\", \$tracepoint, \$trace_frame, gdb_char_test, gdb_long_test\n tfind tracepoint\n end" "12.4: trace report #4" {
	    -re "TDP #$tdp6, frame $decimal: char_test = $arg1, long_test = $arg3" {
		set linecount6 [expr $linecount6 + 1]
		exp_continue
	    }
	    -re ".*$gdb_prompt $" {
		if { ($linecount6 < 4) } {
		    fail "12.4: trace report #4"
		} else {
		    pass "12.4: trace report #4"
		}
	    }
	}
    }
}

use_collected_data "live"

# Finished!
gdb_tfind_test "finished: make sure not debugging any trace frame" \
    "none" "-1"

# Save trace frames to tfile.
set tracefile [standard_output_file ${testfile}]
gdb_test "tsave ${tracefile}.tf" \
    "Trace data saved to file '${tracefile}.tf'.*" \
    "save tfile trace file"

# Save trace frames to ctf.
gdb_test "tsave -ctf ${tracefile}.ctf" \
    "Trace data saved to directory '${tracefile}.ctf'.*" \
    "save ctf trace file"

# Change target to tfile.
set test "change to tfile target"
gdb_test_multiple "target tfile ${tracefile}.tf" "$test" {
    -re "A program is being debugged already.  Kill it. .y or n. " {
	send_gdb "y\n"
	exp_continue
    }
    -re "$gdb_prompt $" {
	pass "$test"
    }
}
# Test the collected trace frames from tfile.
use_collected_data "tfile"

# Try to read ctf data if GDB supports.
gdb_test_multiple "target ctf ${tracefile}.ctf" "" {
    -re "Undefined target command: \"ctf ${tracefile}.ctf\"\.  Try \"help target\"\.\r\n$gdb_prompt $" {
    }
    -re ".*\r\n$gdb_prompt $" {
	use_collected_data "ctf"
    }
}
