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

load_lib "trace-support.exp"

if {[skip_shlib_tests]} {
    return 0
}

if ![gdb_trace_common_supports_arch] {
    unsupported "no trace-common.h support for arch"
    return -1
}

standard_testfile
set libfile1 "change-loc-1"
set libfile2 "change-loc-2"
set executable $testfile
set libsrc1 $srcdir/$subdir/$libfile1.c
set libsrc2 $srcdir/$subdir/$libfile2.c
set lib_sl1 [standard_output_file $libfile1.sl]
set lib_sl2 [standard_output_file $libfile2.sl]

set lib_opts debug

if [get_compiler_info] {
    return -1
}

# Some targets have leading underscores on assembly symbols.
set additional_flags [list debug shlib=$lib_sl1 shlib_load [gdb_target_symbol_prefix_flags]]

if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != ""
     || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""
     || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $additional_flags] != ""} {
    untested "failed to compile"
    return -1
}

clean_restart $executable

gdb_load_shlib $lib_sl1
gdb_load_shlib $lib_sl2

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

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


# Set tracepoint during tracing experiment.

proc tracepoint_change_loc_1 { trace_type } {
    with_test_prefix "1 $trace_type" {
	global testfile
	global srcfile
	global pcreg
	global gdb_prompt

	clean_restart ${testfile}
	if ![runto_main] {
	    fail "can't run to main"
	    return -1
	}
	gdb_test_no_output "delete break 1"

	# Set a tracepoint we'll never meet.  Just to avoid the
	# complain after type `tstart' later.
	gdb_test "next" ".*"
	gdb_test "trace main" \
	    "Tracepoint \[0-9\] at.* file .*$srcfile, line.*" \
	    "set tracepoint on main"

	gdb_test "break marker" \
	    "Breakpoint.*at.* file .*$srcfile, line.*" \
	    "breakpoint on marker"

	gdb_test_no_output "tstart"

	gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \
	    "continue to marker 1"
	# Set a tracepoint during tracing.
	set test "set tracepoint on set_tracepoint"
	gdb_test_multiple "${trace_type} set_tracepoint" $test {
	    -re "Target returns error code .* too far .*$gdb_prompt $" {
		if [string equal $trace_type "ftrace"] {
		    # The target was unable to install the fast tracepoint
		    # (e.g., jump pad too far from tracepoint).
		    pass "$test (too far)"
		} else {
		    fail $test
		}
	    }
	    -re "\r\n$gdb_prompt $" {
		pass $test
	    }
	}

	gdb_trace_setactions "set action for tracepoint" "" \
	    "collect \$$pcreg" "^$"

	# tracepoint has two locations after shlib change-loc-1 is loaded.
	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*4\.1.* in func4.*4\.2.* in func4.*" \
	    "tracepoint with two locations"

	set test "continue to marker 2"
	gdb_test_multiple "continue" $test {
	    -re "Target returns error code .* too far .*$gdb_prompt $" {
		if [string equal $trace_type "ftrace"] {
		    # Expected if the target was unable to install the
		    # fast tracepoint (e.g., jump pad too far from
		    # tracepoint).
		    pass "$test (too far)"
		    # Skip the rest of the tests.
		    return
		} else {
		    fail "continue to marker 2"
		    fail $test
		}

	    }
	    -re ".*Breakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" {
		pass "continue to marker 2"
	    }
	}

	# tracepoint has three locations after shlib change-loc-2 is
	# loaded.
	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*4\.1.* in func4.*4\.2.* in func4.*4\.3.* in func4 .*" \
	    "tracepoint with three locations"

	gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \
	    "continue to marker 3"

	# shlib is unloaded, there are still three locations, but one
	# is pending.
	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*
(4\.\[1-3].* in func4.*\tinstalled on target.*){2}" \
	    "tracepoint with two locations - installed (unload)"

	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*
4\.\[1-3].* \<PENDING\>\[\t \]+set_tracepoint.*" \
	    "tracepoint with two locations - pending (unload)"

	gdb_test_no_output "tstop"

	gdb_test "tfind" "Found trace frame 0, tracepoint 4.*" \
	    "tfind frame 0"
	gdb_test "tfind" \
	    "Target failed to find requested trace frame\\..*"
    }
}

# Set pending tracepoint.

proc tracepoint_change_loc_2 { trace_type } {
    with_test_prefix "2 $trace_type" {
	global srcdir
	global srcfile
	global subdir
	global pcreg
	global binfile
	global gdb_prompt

	gdb_exit
	gdb_start
	gdb_reinitialize_dir $srcdir/$subdir

	gdb_test_multiple "${trace_type} set_tracepoint" "set pending tracepoint" {
	    -re ".*Make \(|fast \)tracepoint pending.*y or \\\[n\\\]. $" {
		gdb_test "y" "\(Fast t|T\)racepoint.*set_tracepoint.*pending." "set pending tracepoint"
	    }
	}

	gdb_trace_setactions "set action for tracepoint" "" \
	    "collect \$$pcreg" "^$"

	# tracepoint has no location information now.  Make sure nothing
	# else is displayed.
	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*PENDING.*set_tracepoint\r\n\[\t \]+collect \\$$pcreg\r" \
	    "single pending tracepoint info (without symbols)"

	gdb_load ${binfile}
	# tracepoint has one location after executable is loaded.
	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*func4.*" \
	    "tracepoint with one location"

	set main_bp 0
	gdb_test_multiple "break main" "set breakpoint on main" {
	    -re "Breakpoint (\[0-9\]*) at .*, line.*$gdb_prompt $" {
		set main_bp $expect_out(1,string)
	    }
	}
	gdb_run_cmd

	gdb_test "" \
	    ".*Breakpoint.*main.*at.*$srcfile.*" \
	    "run to main"
	gdb_test_no_output "delete break $main_bp"

	# tracepoint has two locations after shlib change-loc-1 is loaded.
	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*1\.1.* in func4.*1\.2.* in func4.*" \
	    "tracepoint with two locations"

	gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
	    "breakpoint on marker"

	# tracepoint with two locations will be downloaded and installed.
	set test "tstart"
	gdb_test_multiple "tstart" $test {
	    -re "^tstart\r\n$gdb_prompt $" {
		pass "tstart"
	    }
	    -re "Target returns error code .* too far .*$gdb_prompt $" {
		if [string equal $trace_type "ftrace"] {
		    # The target was unable to install the fast tracepoint
		    # (e.g., jump pad too far from tracepoint).
		    pass "$test (too far)"
		    # Skip the rest of the tests.
		    return
		} else {
		    fail $test
		}
	    }
	}

	gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \
	    "continue to marker 1"

	gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \
	    "continue to marker 2"

	# tracepoint has three locations after shlib change-loc-2 is loaded.
	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*1\.1.* in func4.*1\.2.* in func4.*1\.3.* in func4 .*" \
	    "tracepoint with three locations"

	gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \
	    "continue to marker 3"

	# shlib is unloaded, there are still three locations, but one is pending.
	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*
(1\.\[1-3].* in func4.*\tinstalled on target.*){2}" \
	    "tracepoint with two locations - installed (unload)"

	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*
1\.\[1-3].* \<PENDING\>\[\t \]+set_tracepoint.*" \
	    "tracepoint with two locations - pending (unload)"

	gdb_test_no_output "tstop"

	gdb_test "tfind" "Found trace frame 0, tracepoint 1.*" "tfind frame 0"
	gdb_test "tfind" "Found trace frame 1, tracepoint 1.*" "tfind frame 1"
	gdb_test "tfind" "Found trace frame 2, tracepoint 1.*" "tfind frame 2"
	gdb_test "tfind" "Target failed to find requested trace frame\\..*"
    }
}

# Test that setting a tracepoint while the trace experiment is ongoing
# doesn't work when we force-disable the InstallInTrace RSP feature.

proc tracepoint_install_in_trace_disabled { trace_type } {
    with_test_prefix "InstallInTrace disabled: $trace_type" {
	global testfile
	global srcfile
	global pcreg
	global gdb_prompt

	clean_restart ${testfile}
	if ![runto_main] {
	    fail "can't run to main"
	    return -1
	}

	# This test only makes sense with the remote target.
	if ![gdb_is_target_remote] {
	    return
	}

	gdb_test_no_output "delete break 1"

	# Set a tracepoint we'll never meet.  Just to avoid the
	# complain after `tstart' later.
	gdb_test "next" ".*"
	gdb_test "trace main" \
	    "Tracepoint \[0-9\] at.* file .*$srcfile, line.*" \
	    "set tracepoint on main"

	gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
	    "breakpoint on marker"

	gdb_test_no_output "tstart"

	# Force-disable the InstallInTrace RSP feature.
	gdb_test_no_output "set remote install-in-trace-packet off"

	# Set a tracepoint while a trace experiment is ongoing.
	gdb_test "${trace_type} set_tracepoint" \
	    "racepoint .* at .* set_tracepoint.*" \
	    "set tracepoint on set_tracepoint"

	gdb_trace_setactions "set action for tracepoint" "" \
	    "collect \$$pcreg" "^$"

	# Make sure the tracepoint is _not_ installed on the target.
	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*installed on target.*\<MULTIPLE\>.*4\.1.* in func4.*not installed on target.*4\.2.* in func4.*not installed on target.*" \
	    "tracepoint is not installed"

	gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \
	    "continue to marker"

	gdb_test_no_output "tstop"

	# Nothing should have been collected.
	gdb_test "tfind" "Target failed to find requested trace frame\\..*"
    }
}

tracepoint_change_loc_1 "trace"
tracepoint_change_loc_2 "trace"
tracepoint_install_in_trace_disabled "trace"

# Re-compile test case with IPA.
set libipa [get_in_proc_agent]
gdb_load_shlib $libipa

if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile executable \
	  [list debug nowarnings shlib=$libipa shlib=$lib_sl1 shlib_load] ] != "" } {
    untested "failed to compile"
    return -1
}

tracepoint_change_loc_1 "ftrace"
tracepoint_change_loc_2 "ftrace"
tracepoint_install_in_trace_disabled "ftrace"
