#   Copyright 2010-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/>.

# Test of trace file support.

# Note that unlike most of the tracing tests, this can be run on
# targets lacking tracepoint support; the program tfile.c has the
# ability to generate synthetic trace files directly, and the tfile
# target is available to all GDB configs.

load_lib "trace-support.exp";

gdb_exit
gdb_start
standard_testfile
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested ${testfile}.exp
    return -1
}
gdb_reinitialize_dir $srcdir/$subdir

# Make sure we are starting fresh.
remote_file host delete basic.tf
remote_file host delete error.tf
remote_file target delete basic.tf
remote_file target delete error.tf

remote_exec target "$binfile"
# Copy tracefile from target to host through build.
remote_download host [remote_upload target basic.tf] basic.tf
remote_download host [remote_upload target error.tf] error.tf

gdb_load $binfile

# Program has presumably exited, now target a trace file it created.

gdb_test "target tfile basic.tf" "Created tracepoint.*" "target tfile"

gdb_test "info trace" ".*tracepoint.*in write_basic_trace_file.*" \
    "info tracepoints on trace file"

gdb_test "tfind 0" \
    "Found trace frame 0, tracepoint \[0-9\]+.
\#0  write_basic_trace_file ().*" \
    "tfind 0 on trace file"

# Note that there is no tracepoint collecting these globals, we
# just happen to know they are covered by the trace frame.

gdb_test "print testglob" " = 31415" "print testglob on trace file"

gdb_test "print testglob2" " = 271828" "print testglob2 on trace file"

# This global is not covered by the trace frame, but since it's const,
# we should be able to read it from the executable.

gdb_test "print constglob" " = 10000" "print constglob on trace file"

# Similarly, disassembly should find the read-only pieces in the executable.
gdb_test "disassemble main" \
    "Dump of assembler code for function main:.*   $hex <\\+0\\>:.*End of assembler dump\."

# This global is also not covered by the trace frame, and since it's
# non-const, we should _not_ read it from the executable, as that
# would show the variable's initial value, not the current at time the
# trace frame was created.

gdb_test "print nonconstglob" \
    " = <unavailable>" "print nonconstglob on trace file"

gdb_test "tfind" "Target failed to find requested trace frame." \
    "tfind does not find a second frame in trace file"

gdb_test "tstatus" \
    "Using a trace file.*
Trace stopped by a tstop command.*
Collected 1 trace frame.*
Trace buffer has 256 bytes of 4096 bytes free \\(93% full\\).*
Looking at trace frame 0, tracepoint .*" \
    "tstatus on trace file"

gdb_test "tfind end" "No longer looking at any trace frame" "leave tfind mode"

gdb_test "backtrace" "No stack\." \
    "no stack if no traceframe selected"

gdb_test "info registers" "The program has no registers now\." \
    "no registers if no traceframe selected"

# Now start afresh, using only a trace file.

gdb_exit
gdb_start

gdb_load $binfile

gdb_test "target tfile error.tf" "Created tracepoint.*" "target tfile"

gdb_test "tstatus" \
    "Using a trace file.*
Trace stopped by an error \\(made-up error, tracepoint 1\\).*
Collected 0 trace frame.*
Trace buffer has 256 bytes of 4096 bytes free \\(93% full\\).*
Not looking at any trace frame.*" \
    "tstatus on error trace file"

# Make sure we can reopen without error.
gdb_test \
    "interpreter-exec mi \"-target-select tfile basic.tf\"" \
    "\\^connected.*"

gdb_test "interpreter-exec mi \"-trace-status\"" \
    "\\^done,supported=\"file\",trace-file=\".*basic.tf\",running=\"0\",stop-reason=\"request\",frames=\"${decimal}\",frames-created=\"${decimal}\",buffer-size=\"${decimal}\",buffer-free=\"${decimal}\",disconnected=\".*\",circular=\".*\",user-name=\"\",notes=\"\",start-time=\".*\",stop-time=\".*\"" \
    "-trace-status"

# Test completion works well.

gdb_test "target tfile basic\t" "Assuming tracepoint.*" \
    "complete-command 'target tfile'"
