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

load_lib trace-support.exp

standard_testfile trace-unavailable.c

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} {debug nopie}] } {
    return -1
}

if ![runto_main] {
    fail "can't run to main to check for trace support"
    return -1
}

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

gdb_exit

load_lib mi-support.exp
set MIFLAGS "-i=mi"

mi_clean_restart $binfile
mi_runto_main

mi_gdb_test "-break-insert marker" \
    "\\^done,bkpt=\{number=\"${decimal}\",type=\"breakpoint\".*\"\}" \
    "insert tracepoint on marker"
mi_gdb_test "-break-insert -a bar" \
    "\\^done,bkpt=\{number=\"${decimal}\",type=\"tracepoint\".*\"\}" \
    "insert tracepoint on bar"

# Define an action.
mi_gdb_test "-break-commands 3 \"collect array\" \"collect j\" \"end\" " \
    {\^done} "set action"

mi_gdb_test "-break-insert -a foo" \
    "\\^done,bkpt=\{number=\"${decimal}\",type=\"tracepoint\".*\"\}" \
    "insert tracepoint on foo"

# Collect 'main' to make sure no registers are collected except PC.
mi_gdb_test "-break-commands 4 \"collect main\" \"end\" " \
    {\^done} "set action on tracepoint 4"

mi_gdb_test "-trace-start" {.*\^done} "trace start"
mi_send_resuming_command "exec-continue" "continuing to marker"
mi_expect_stop \
    "breakpoint-hit" "marker" ".*" ".*" ".*" {"" "disp=\"keep\""} \
    "stop at marker"
mi_gdb_test "-trace-stop" {.*} "trace stop"

# Save trace frames to tfile.
set tracefile [standard_output_file ${testfile}]
mi_gdb_test "-trace-save ${tracefile}.tf" ".*\\^done" \
    "save tfile trace file"
# Save trace frames to ctf.
mi_gdb_test "-trace-save -ctf ${tracefile}.ctf" ".*\\^done" \
    "save ctf trace file"

proc test_trace_unavailable { data_source } {
    global decimal

    with_test_prefix "$data_source" {

	# Test MI commands '-stack-list-locals', '-stack-list-arguments',
	#  and '-stack-list-variables'.
	mi_gdb_test "-trace-find frame-number 0" \
	    ".*\\^done,found=\"1\",tracepoint=\"${decimal}\",traceframe=\"0\",frame=\{.*" \
	    "-trace-find frame-number 0"

	# The "print entry-values" option shouldn't affect the output of
	# '-stack-list-locals'.
	foreach entry_values { no only preferred if-needed both compact default } {
	    mi_gdb_test "-gdb-set print entry-values $entry_values" {\^done} ""

	    with_test_prefix "$entry_values" {
		# Test MI command '-stack-list-locals'.
		mi_gdb_test "-stack-list-locals --simple-values" \
		    ".*\\^done,locals=\\\[\{name=\"array\",type=\"unsigned char \\\[2\\\]\"\},\{name=\"i\",type=\"int\",value=\"<unavailable>\"\}\\\]" \
		    "-stack-list-locals --simple-values"
	    }
	}

	mi_gdb_test "-gdb-set print entry-values no" {\^done} \
	    "-gdb-set print entry-values no"

	# Test MI command '-stack-list-locals'.
	mi_gdb_test "-stack-list-locals --simple-values" \
	    ".*\\^done,locals=\\\[\{name=\"array\",type=\"unsigned char \\\[2\\\]\"\},\{name=\"i\",type=\"int\",value=\"<unavailable>\"\}\\\]" \
	    "-stack-list-locals --simple-values"
	mi_gdb_test "-stack-list-locals --skip-unavailable --simple-values" \
	    ".*\\^done,locals=\\\[\{name=\"array\",type=\"unsigned char \\\[2\\\]\"\}\\\]" \
	    "-stack-list-locals --skip-unavailable --simple-values"

	# Test MI command '-stack-list-arguments'.
	mi_gdb_test "-stack-list-arguments --simple-values" \
	    ".*\\^done,stack-args=\\\[frame=\{level=\"0\",args=\\\[\{name=\"j\",type=\"int\",value=\"4\"\},\{name=\"s\",type=\"char \\\*\",value=\"<unavailable>\"\}\\\]\},.*\}.*" \
	    "-stack-list-arguments --simple-values"
	mi_gdb_test "-stack-list-arguments --skip-unavailable --simple-values" \
	    ".*\\^done,stack-args=\\\[frame=\{level=\"0\",args=\\\[\{name=\"j\",type=\"int\",value=\"4\"\}\\\]\},.*\}.*" \
	    "-stack-list-arguments --skip-unavailable --simple-values"

	# Test MI command '-stack-list-variables'.
	mi_gdb_test "-stack-list-variables --simple-values" \
	    ".*\\^done,variables=\\\[\{name=\"j\",arg=\"1\",type=\"int\",value=\"4\"\},\{name=\"s\",arg=\"1\",type=\"char \\\*\",value=\"<unavailable>\"\},\{name=\"array\",type=\"unsigned char \\\[2\\\]\"\},\{name=\"i\",type=\"int\",value=\"<unavailable>\"\}\\\]" \
	    "-stack-list-variables --simple-values"
	mi_gdb_test "-stack-list-variables --skip-unavailable --simple-values" \
	    ".*\\^done,variables=\\\[\{name=\"j\",arg=\"1\",type=\"int\",value=\"4\"\},\{name=\"array\",type=\"unsigned char \\\[2\\\]\"\}\\\]" \
	    "-stack-list-variables --skip-unavailable --simple-values"

	mi_gdb_test "-trace-find frame-number 1" \
	    ".*\\^done,found=\"1\",tracepoint=\"${decimal}\",traceframe=\"1\",frame=\{.*" \
	    "-trace-find frame-number 1"

	set pcnum -1
	set gpr0num -1
	if [is_amd64_regs_target] {
	    set pcnum 16
	    set gpr0num 0
	} elseif [is_x86_like_target] {
	    set pcnum 8
	    set gpr0num 0
	} elseif [is_aarch64_target] {
	    set pcnum 32
	    set gpr0num 0
	} elseif [istarget "powerpc*-*-*"] {
	    set pcnum 64
	    set gpr0num 0
	} elseif { [istarget "s390*-*-*"] } {
	    # Strictly speaking, this is PSWA, not PC.
	    set pcnum 1
	    set gpr0num 2
	} else {
	    # Other ports support tracepoint should define the number
	    # of its own pc register.
	}

	if { $pcnum != -1 } {
	    global hex
	    # Test that register 0 and PC are displayed, and register
	    # 0 is unavailable.
	    mi_gdb_test "-data-list-register-values x ${gpr0num} ${pcnum}" \
		".*\\^done,register-values=\\\[\{number=\"${gpr0num}\",value=\"<unavailable>\"\},\{number=\"${pcnum}\",value=\"${hex}\"\}\\\]" \
		"-data-list-register-values x"

	    # Test that only available register PC is displayed.
	    mi_gdb_test "-data-list-register-values --skip-unavailable x ${gpr0num} ${pcnum}" \
		".*\\^done,register-values=\\\[\{number=\"${pcnum}\",value=\"${hex}\"\}\\\]" \
		"-data-list-register-values --skip-unavailable x"
	}

	# Don't issue command '-trace-find none' to return from
	# tfind mode (examining trace frames) on purpose, in order
	# to test that GDB is able to clear its tracing-related local state
	# in the next -target-select.
	# mi_gdb_test "-trace-find none" ".*\\^done,found=\"0\".*" "-trace-find none"
    }
}

test_trace_unavailable "live"

# Change target to ctf if GDB supports it.
set msg "-target-select ctf"
send_gdb "-target-select ctf ${tracefile}.ctf\n"
gdb_expect {
    -re ".*\\^connected.*${mi_gdb_prompt}$" {
	# GDB supports ctf, do the test.
	test_trace_unavailable "ctf"
    }
    -re ".*\\^error,msg=\"Undefined target command.*${mi_gdb_prompt}$" {
	# GDB doesn't support ctf, skip the test.
	unsupported "gdb does not support ctf target"
    }
    -re ".*$mi_gdb_prompt$" {
	fail "$msg"
    }
    timeout {
	fail "$msg (timeout)"
    }
}

# Change target to tfile.
mi_gdb_test "-target-select tfile ${tracefile}.tf" ".*\\^connected.*" \
    "-target-select tfile"
test_trace_unavailable "tfile"

mi_gdb_exit
