# Copyright 2011-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"

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] {
    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] {
	    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 -q 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] {
	    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"
