# 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
}

standard_testfile
set executable $testfile

set libipa [get_in_proc_agent]

set lib_opts debug

if [get_compiler_info] {
    return -1
}

set additional_flags [list quiet debug shlib=$libipa shlib_load \
			  "additional_flags=-lust -lurcu-bp" ]

if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $additional_flags] != ""} {
    untested "UST library or headers are not installed"
    return -1
}

# Test that the socket file is removed when GDB quits, detaches or
# resumes the inferior until it exits.

proc strace_remove_socket { action } {
    with_test_prefix "remove_socket_after_${action}" {

    global executable
    global gdb_prompt
    global libipa

    # Restart with a fresh gdb.
    clean_restart $executable
    gdb_load_shlib $libipa
    if ![runto_main] {
	fail "can't run to main"
	return -1
    }

    # List the markers in program.
    gdb_test "info static-tracepoint-markers" \
	".*ust/bar\[\t \]+n\[\t \]+.*ust/bar2\[\t \]+n\[\t \]+.*"

    set pid ""
    set test "collect pid"
    gdb_test_multiple "info inferiors" $test {
	-re "process (\[-0-9a-fx\]+) \[^\n\]*\n.*${gdb_prompt} $" {
	    set pid $expect_out(1,string)
	    pass $test
	}
	-re ".*${gdb_prompt} $" {
	    fail $test
	}
    }

    set test "socket file exists"
    set socket_file "/tmp/gdb_ust${pid}"
    set status [remote_exec target "sh -c { \[ -S $socket_file \] }"]

    if { [lindex $status 0] == 0 } {
	pass $test
    } else {
	fail $test
    }

    send_gdb "${action}\n"
    gdb_expect {
	-re "A debugging session is active.\r\n.*\r\nQuit anyway\\? \\(y or n\\) $" {
	    send_gdb "y\n"
	}
	-re "Detaching .*, process .*$" {
	}
	-re "Continuing.*$" {
	}
    }

    set exists 1

    for {set i 1} {$i <= 5} {incr i} {
	set status [remote_exec target "sh -c { \[ -S $socket_file \] }"]
	if { [lindex $status 0] != 0 } {
	    set exists 0
	    break
	}
	sleep 1
    }

    if { ![is_remote target] && ![string equal $action "detach"] } {
	setup_kfail gdb/14161 *-*-*
    }

    set test "socket file removed"

    if { $exists } {
	fail $test
	# Since $socket_file is a socket file instead of a regular file, we
	# can't use 'remote_file target delete $socket_file' here.
	remote_exec target "sh -c \"rm -r $socket_file\""
    } else {
	pass $test
    }

    if { [string equal $action "quit"] && [is_remote host] } {
	global gdb_spawn_id
	# unset gdb_spawn_id here to avoid sending command 'quit' to GDB
	# later in default_gdb_exit.
	unset gdb_spawn_id
    }
}}

proc strace_info_marker { } {
    with_test_prefix "info_marker" {
	global executable
	global gdb_prompt
	global libipa

	# Restart with a fresh gdb.
	clean_restart $executable
	gdb_load_shlib $libipa
	if ![runto_main] {
	    fail "can't run to main"
	    return -1
	}

	# List the markers in program.  They should be disabled.
	gdb_test "info static-tracepoint-markers" \
	    ".*ust/bar\[\t \]+n\[\t \]+.*ust/bar2\[\t \]+n\[\t \]+.*"

	# List all the thread.  It is expected to get three threads without
	# any errors.
	gdb_test_multiple "info threads 3 2 1" "info threads" {
	    -re "3\[ \t\]+Thread .*2\[ \t\]+Thread .*1\[ \t\]+Thread .*${gdb_prompt} $" {
		pass "info threads"
	    }
	}

	# GDB detaches inferior so that the socket file can be removed.
	gdb_test_multiple "detach" "detach" {
	    -re "Detaching .*, process .*${gdb_prompt} $" {
		pass "detach"
	    }
	}
    }
}

proc strace_probe_marker { } {
    with_test_prefix "probe_marker" {
	global executable
	global expect_out
	global gdb_prompt
	global hex
	global libipa

	# Restart with a fresh gdb.
	clean_restart $executable
	gdb_load_shlib $libipa
	if ![runto_main] {
	    fail "can't run to main"
	    return -1
	}

	gdb_test "strace -m ust/bar" \
	    "Static tracepoint \[0-9\]+ at ${hex}: file.*"
	gdb_test "strace -m ust/bar2" \
	    "Static tracepoint \[0-9\]+ at ${hex}: file.*"
	# Two trace markers should be enabled.
	gdb_test "info static-tracepoint-markers" \
	    "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+y\[\t \]+$hex.*"

	gdb_breakpoint "end" qualified

	gdb_test_no_output "tstart"
	gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
	    "continue to end"
	gdb_test_no_output "tstop"

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

proc strace_trace_on_same_addr { type } {
    with_test_prefix "trace_same_addr $type" {
	global executable
	global expect_out
	global gdb_prompt
	global hex
	global libipa

	# Restart with a fresh gdb.
	clean_restart $executable
	gdb_load_shlib $libipa
	if ![runto_main] {
	    fail "can't run to main"
	    return -1
	}

	set marker_bar_addr ""
	set marker_bar2_addr ""

	# List the markers in program.  They should be disabled.
	gdb_test_multiple "info static-tracepoint-markers" "info static-tracepoint-markers 1" {
	    -re ".*ust/bar\[\t \]+n.*${gdb_prompt} $" {
		set ignore ""

		regexp "ust/bar\[\t \]+n\[\t \]+($hex) .*ust/bar2\[\t \]+n\[\t \]+($hex) " \
		    "$expect_out(0,string)" ignore marker_bar_addr marker_bar2_addr

		pass "info static-tracepoint-markers 1"
	    }
	    -re ".*${gdb_prompt} $" {
		fail "info static-tracepoint-markers 1"
	    }
	}

	gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*"
	gdb_test "strace -m ust/bar2" "Static tracepoint \[0-9\]+ at ${hex}: file.*"
	# Two trace markers should be enabled.
	gdb_test "info static-tracepoint-markers" \
	    "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+y\[\t \]+$hex.*" \
	    "info static-tracepoint-markers 2"

	# Set breapoints or tracepoints.
	set test "${type} on marker bar"
	gdb_test_multiple "${type} *${marker_bar_addr}" $test {
	    -re "\(Fast trace|Trace|Break\)point \[0-9\]+ at ${hex}: file.*\r\n$gdb_prompt $" {
		pass $test
	    }
	    -re ".*\r\n$gdb_prompt $" {
		if [string equal $type "ftrace"] {
		    # The instruction may be not long enough to set a fast
		    # tracepoint.  Skip the rest of this test.
		    return -1
		} else {
		    fail $test
		}
	    }
	}
	set test "${type} on marker bar2"
	gdb_test_multiple "${type} *${marker_bar2_addr}" $test {
	    -re "\(Fast trace|Trace|Break\)point \[0-9\]+ at ${hex}: file.*" {
		pass $test
	    }
	    -re ".*\r\n$gdb_prompt $" {
		if [string equal $type "ftrace"] {
		    # The instruction may be not long enough to set a fast
		    # tracepoint.  Skip the rest of this test.
		    return -1
		} else {
		    fail $test
		}
	    }
	}

	gdb_breakpoint "end" qualified

	if [string equal $type "break"] {
	    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
		"continue to bar"
	    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
		"continue to bar2"
	    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
		"continue to end"
	} else {

	    gdb_test_no_output "tstart"
	    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
		"continue to end"
	    gdb_test_no_output "tstop"

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

proc strace_trace_on_diff_addr { } {
    with_test_prefix "trace_diff_addr" {

	global executable
	global expect_out
	global gdb_prompt
	global hex
	global libipa

	# Restart with a fresh gdb.
	clean_restart $executable
	gdb_load_shlib $libipa
	if ![runto_main] {
	    fail "can't run to main"
	    return -1
	}

	set marker_bar_addr ""
	set marker_bar2_addr ""

	# List the markers in program.  They should be disabled.
	gdb_test_multiple "info static-tracepoint-markers" "info static-tracepoint-markers 1" {
	    -re ".*ust/bar\[\t \]+n.*${gdb_prompt} $" {
		set ignore ""

		regexp "ust/bar\[\t \]+n\[\t \]+($hex) .*ust/bar2\[\t \]+n\[\t \]+($hex) " \
		    "$expect_out(0,string)" ignore marker_bar_addr marker_bar2_addr

		pass "info static-tracepoint-markers 1"
	    }
	    -re ".*${gdb_prompt} $" {
		fail "info static-tracepoint-markers 1"
	    }
	}

	gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*"

	gdb_test "info static-tracepoint-markers" \
	    "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+n\[\t \]+$hex.*" \
	    "info static-tracepoint-markers 2"


	# Set common tracepoint.
	gdb_test "trace *${marker_bar2_addr}" \
	    "Tracepoint \[0-9\]+ at ${hex}: file.*"

	gdb_breakpoint "end" qualified

	gdb_test_no_output "tstart"
	gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
	    "continue to end"
	gdb_test_no_output "tstop"

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

# Run it on x86/x86_64 linux.
if { [istarget "x86_64-*-linux*"] || [istarget "i\[34567\]86-*-linux*"] } {
    strace_info_marker
    strace_remove_socket "quit"
    strace_remove_socket "detach"
    strace_remove_socket "continue"
}

clean_restart $executable
gdb_load_shlib $libipa
if ![runto_main] {
    fail "can't run to main to check for trace support"
    return -1
}
if { ![gdb_target_supports_trace] } then {
    # At this point, the socket file has been created.  We must make sure it is
    # removed when we return here.  GDB detaches inferior so that the socket
    # file can be removed.  Note that GDB simply kill inferior doesn't remove
    # the socket file.
    gdb_test "detach" "Detaching .*, process .*"
    unsupported "current target does not support trace"
    return -1
}

# Double-check that marker ID ("-m") is not mistaken for an explicit location
# flag.
gdb_test "strace -m gdbfoobarbaz" \
    "No known static tracepoint marker named gdbfoobarbaz"

strace_probe_marker

strace_trace_on_same_addr "trace"
strace_trace_on_same_addr "ftrace"
strace_trace_on_same_addr "break"
strace_trace_on_diff_addr
