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

load_lib "trace-support.exp"

if {[skip_shlib_tests]} {
    return 0
}

standard_testfile
set libfile1 "pendshr1"
set libfile2 "pendshr2"
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 [gdb_target_symbol_prefix_flags]

if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != ""
     || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""} {
    untested "Could not compile either $libsrc1 or $libsrc2"
    return -1
}

set exec_opts [list debug shlib=$lib_sl1 shlib_load]
if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } {
    untested "Failed to compile $srcfile"
    return -1
}

clean_restart $executable

gdb_load_shlibs $lib_sl1
gdb_load_shlibs $lib_sl2

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
}

# Verify pending tracepoint is resolved to running to main.

proc pending_tracepoint_resolved { trace_type } {
    with_test_prefix "$trace_type resolved" {
	global srcdir
	global subdir
	global binfile
	global srcfile
	global lib_sl1

	# Start with a fresh gdb.
	gdb_exit
	gdb_start
	gdb_reinitialize_dir $srcdir/$subdir

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

	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point1.*" \
	    "single pending tracepoint info (without symbols)"

	gdb_load ${binfile}

	gdb_test "break main" "Breakpoint.*at.* file .*$srcfile, line.*" \
	    "breakpoint function"

	gdb_run_cmd
	gdb_test "" "Breakpoint 2, main.*"

	# Run to main which should resolve a pending tracepoint
	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc.*" \
	    "single tracepoint info"
    }
}

# Verify pending tracepoint is resolved and works as expected.

proc pending_tracepoint_works { trace_type } {
    with_test_prefix "$trace_type works" {
	global executable
	global srcfile
	global lib_sl1
	global gdb_prompt

	# Restart with a fresh gdb.
	clean_restart $executable

	# Test setting and querying pending tracepoints

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

	gdb_test "info trace" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point1.*" \
	    "single pending tracepoint info"

	# Run to main which should resolve a pending tracepoint
	gdb_test "break main" "Breakpoint.*at.* file .*$srcfile, line.*" \
	    "breakpoint function"
	gdb_run_cmd
	gdb_test "" "Breakpoint 2, main.*"

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

	set test "start trace experiment"
	gdb_test_multiple "tstart" $test {
	    -re "^tstart\r\n$gdb_prompt $" {
		pass $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)"
		    # Skip the rest of the tests.
		    return
		} else {
		    fail $test
		}
	    }

	}

	gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*" \
	    "continue to marker"

	gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"

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

# Verify pending tracepoint is resolved during trace.

proc pending_tracepoint_resolved_during_trace { trace_type } \
{ with_test_prefix "$trace_type resolved_in_trace" \
{
    global executable
    global srcfile
    global gdb_prompt
    global lib_sl1

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

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

    gdb_test "info trace" \
	"Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point2.*" \
	"single pending tracepoint on set_point2"

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

    gdb_test_no_output "tstart" "start trace experiment"

    gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
	"continue to marker 1"

    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 $test
	    }
	}
	-re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" {
	    pass $test
	}
    }

    gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"

    # tracepoint should be resolved.
    gdb_test "info trace" \
	"Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \
	"tracepoint is resolved"

    gdb_test "tfind start" "#0 .*" "tfind test frame 0"
    gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame"
}}

# Verify pending tracepoint is resolved and installed during trace.

proc pending_tracepoint_installed_during_trace { trace_type } \
{ with_test_prefix "$trace_type installed_in_trace" \
{
    global executable
    global srcfile
    global lib_sl1
    global gdb_prompt
    global hex

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

    gdb_test "next" ".*"
    gdb_test "trace main" "Tracepoint \[0-9\] at .*" "set tracepoint on main"

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

    gdb_test_no_output "tstart" "start trace experiment"

    gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*${srcfile}.*" \
	"continue to marker 1"

    # Set a pending tracepoint during a tracing experiment.
    gdb_test_multiple "$trace_type set_point2" "set pending tracepoint on set_point2" {
	-re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
	    gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \
		"set pending tracepoint"
	}
    }

    gdb_test "info trace" \
	"Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \t\]+keep y.*PENDING.*set_point2.*" \
	"single pending tracepoint on set_point2"

    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 $test
	    }
	}
	-re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" {
           pass $test
       }
    }

    gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"

    # tracepoint should be resolved.
    gdb_test "info trace" \
	"Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \
	"tracepoint is resolved"

    gdb_test "tfind start" "#0  $hex in pendfunc2 .*" "tfind test frame 0"
    gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame"
}}


# Verify pending tracepoint will no longer work if we disconnect during tracing.

proc pending_tracepoint_disconnect_during_trace { trace_type } \
{ with_test_prefix "$trace_type disconn" \
{
    global executable
    global srcfile
    global lib_sl1
    global gdb_prompt

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

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

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

    gdb_test_no_output "tstart" "start trace experiment"

    gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
	"continue to marker"

    set test "disconnect with pending tracepoint"
    gdb_test_multiple "disconnect" $test {
       -re "warning: Pending tracepoints will not be resolved while GDB is disconnected.*Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
           pass $test

           set test "disconnected"
           gdb_test_multiple "y" $test {
	       -re "$gdb_prompt $" {
		   pass "$test"
	       }
	   }
       }
    }
}}


# Verify disconnect after pending tracepoint has been resolved.

proc pending_tracepoint_disconnect_after_resolved { trace_type } \
{ with_test_prefix "$trace_type disconn_resolved" \
{
    global executable
    global srcfile
    global lib_sl1
    global gdb_prompt

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

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

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

    gdb_test_no_output "tstart" "start trace experiment"

    gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
	"continue to marker 1"
    gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
	"continue to marker 2"

    # There should be no pending tracepoint, so no warning should be emitted.
    set test "disconnect with resolved tracepoint"
    gdb_test_multiple "disconnect" $test {
	-re "warning: Pending tracepoints will not be resolved while GDB is disconnected.*Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
	    fail $test
	}
	-re "Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
	    pass $test
	}
    }
    set test "disconnected"
    gdb_test_multiple "y" $test {
	-re "$gdb_prompt $" {
	    pass "$test"
	}
    }
}}

# Verify action works properly in resolved tracepoint.

proc pending_tracepoint_with_action_resolved { trace_type } \
{ with_test_prefix "$trace_type action_resolved" \
{
    global executable
    global srcfile
    global lib_sl1
    global gdb_prompt

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

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

    set pcreg "pc"
    if [is_amd64_regs_target] {
	set pcreg "rip"
    } elseif [is_x86_like_target] {
	set pcreg "eip"
    }

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

    gdb_test "info trace" \
	"Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point2.*" \
	"single pending tracepoint on set_point2"

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

    gdb_test_no_output "tstart" "start trace experiment"

    gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
	"continue to marker 1"

    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 $test
            }
	}
	-re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" {
	    pass "continue to marker 2"
	}

    }

    gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"

    # tracepoint should be resolved.
    gdb_test "info trace" \
	"Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \
	"tracepoint is resolved"

    gdb_test "tfind start" "#0 .*" "tfind test frame 0"
    gdb_test "tdump" "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*"
    gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame"
}}

pending_tracepoint_resolved "trace"

pending_tracepoint_works "trace"

pending_tracepoint_resolved_during_trace "trace"

pending_tracepoint_disconnect_during_trace "trace"

pending_tracepoint_disconnect_after_resolved "trace"

pending_tracepoint_with_action_resolved "trace"

pending_tracepoint_installed_during_trace "trace"

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

lappend exec_opts "shlib=$libipa"

if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } {
    untested "Failed to compile $srcfile"
    return -1
}

pending_tracepoint_resolved "ftrace"
pending_tracepoint_works "ftrace"
pending_tracepoint_resolved_during_trace "ftrace"
pending_tracepoint_disconnect_during_trace "ftrace"
pending_tracepoint_disconnect_after_resolved "ftrace"
pending_tracepoint_with_action_resolved "ftrace"
pending_tracepoint_installed_during_trace "ftrace"
