# Copyright 2012-2016 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 pending.c
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 pendshr1.sl]
set lib_sl2  [standard_output_file pendshr2.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
}

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

# Test when GDB connects to a disconnected stub, existing tracepoints in
# remote stub can be uploaded to GDB, and GDB emits MI notification if
# new tracepoints are created.

proc test_reconnect { } {
    with_test_prefix "reconnect" {

	global gdbserver_reconnect_p
	global gdb_prompt
	global executable
	global lib_sl1 lib_sl2

	set gdbserver_reconnect_p 1
	if { [info proc gdb_reconnect] == "" } {
	    return 0
	}

	clean_restart $executable
	gdb_load_shlib $lib_sl1
	gdb_load_shlib $lib_sl2
	if ![runto_main] then {
	    fail "Can't run to main"
	    return 0
	}
	# Create tracepoints on marker and main, and leave them in the
	# remote stub.
	gdb_test "trace marker" "Tracepoint.*at.* file .*" \
	    "tracepoint on marker"
	gdb_test "trace main" "Tracepoint.*at.* file .*" \
	    "tracepoint on main"
	gdb_test_no_output "tstart" "start trace experiment"

	set test "disconnect"
	gdb_test_multiple "disconnect" $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"
		    }
		}
	    }
	}

	gdb_exit

	if [mi_gdb_start] {
	    return
	}

	global srcdir
	global subdir
	global binfile

	mi_gdb_reinitialize_dir $srcdir/$subdir
	mi_gdb_load ${binfile}

	global gdbserver_protocol
	global gdbserver_gdbport

	# Create tracepoints on marker and pendfunc2.
	mi_gdb_test "-break-insert -a -f pendfunc2" \
	    {.*\^done,bkpt=.*addr=\"<PENDING>\".*} \
	    "insert tracepoint on pendfunc2"
	mi_gdb_test "-break-insert -a marker" {.*\^done,bkpt=.*\".*} \
	    "insert tracepoint on marker"

	# Connect to the remote stub again, and make sure GDB merges the
	# tracepoints of both sides correctly.
	send_gdb "47-target-select $gdbserver_protocol $gdbserver_gdbport\n"

	global mi_gdb_prompt
	set test "tracepoint created"
	gdb_expect {
	    -re "=breakpoint-created,bkpt=\{number=\"1\",type=\"tracepoint\"" {
		# Tracepoint 1 in GDB, which has already existed before
		# connecting, should have been merged with a tracepoint on
		# the target, so we shouldn't see a =breakpoint-created
		# notification for it.
		fail "$test: 1"
		exp_continue
	    }
	    -re "=breakpoint-created,bkpt=\{number=\"2\",type=\"tracepoint\"" {
		# Similar to above.
		fail "$test: 2"
		exp_continue
	    }
	    -re "=breakpoint-created,bkpt=\{number=\"3\",type=\"tracepoint\",disp=\"keep\",enabled=\"y\",\[^\n\]+,func=\"main\"\[^\n\]+,installed=\"y\"" {
		# A tracepoint on main was defined in the stub, not in GDB,
		# so we should see a =breakpoint-created notification.
		pass $test
	    }
	}
	# Tracepoint on marker is defined.  After the sync, we know that
	# the tracepoint is in remote stub.  Mark it 'installed'.
	set test "tracepoint on marker is installed"
	gdb_expect {
	    -re "=breakpoint-modified,bkpt=\{number=\"2\".*,func=\"marker\".*installed=\"y\".*${mi_gdb_prompt}$" {
		pass "$test"
	    }
	}
	# Check that tracepoint 1 is still pending.
	mi_gdb_test "-break-info 1" \
	    {.*\^done,BreakpointTable=.*addr=\"<PENDING>\".*} \
	    "break-info 1"

	set gdbserver_reconnect_p 0
    }
}

# Test 'breakpoint-modified' notification is emited when pending tracepoints are
# resolved.

proc test_pending_resolved { } {
    with_test_prefix "pending resolved" {
	global decimal hex
	global executable
	global srcdir
	global subdir
	global binfile
	global lib_sl1 lib_sl2
	global mi_gdb_prompt

	gdb_exit
	if [mi_gdb_start] {
	    continue
	}

	mi_gdb_reinitialize_dir $srcdir/$subdir
	mi_gdb_load ${binfile}
	mi_load_shlibs $lib_sl1 $lib_sl2

	# Create a pending tracepoint on pendfunc2
	mi_gdb_test "-break-insert -a -f pendfunc2" \
	    {.*\^done,bkpt=.*addr=\"<PENDING>\".*} \
	    "insert breakpoint on pendfunc2"
	# Insert breakpoint on marker
	mi_gdb_test "-break-insert marker" {.*\^done,bkpt=.*} \
	    "insert breakpoint on marker"

	mi_run_cmd
	mi_expect_stop "breakpoint-hit" "marker" ""\
	    ".*" ".*" {"" "disp=\"keep\""} \
	    "continue to marker breakpoint"
	mi_gdb_test "-trace-start" {\^done} "trace start"

	mi_send_resuming_command "exec-continue" "continuing execution to marker 1"

	# It is expected to get two "=breakpoint-modified" notifications.
	# Pending tracepoint is resolved.
	set test "tracepoint on pendfunc2 resolved"
	gdb_expect {
	    -re "=breakpoint-modified,bkpt=\{number=\"1\",type=\"tracepoint\".*.*times=\"0\".*installed=\"n\"" {
		pass "$test"
	    }
	}
	# Resolved tracepoint is installed.
	set test "tracepoint on pendfunc2 installed"
	gdb_expect {
	    -re "=breakpoint-modified,bkpt=\{number=\"1\",type=\"tracepoint\".*.*times=\"0\".*installed=\"y\"" {
		pass "$test"
	    }
	}

	mi_expect_stop "breakpoint-hit" "marker" ".*" ".*" ".*" \
	    {"" "disp=\"keep\""} "continue to marker"


	mi_gdb_test "-trace-stop" {\^done,.*} "trace stop"
	mi_gdb_test "-trace-find frame-number 0" \
	    "-trace-find frame-number 0\r\n\\^done,found=\"1\",tracepoint=\"${decimal}\",traceframe=\"0\",frame=\{.*" \
	    "-trace-find frame-number 0"
	mi_gdb_test "-trace-find none" {\^done,found="0"} "back to live inferior"

	mi_send_resuming_command "exec-continue" "continuing to exit"
	set test "tracepoint on pendfunc2 becomes pending again"
	gdb_expect {
	    -re ".*=breakpoint-modified,bkpt=\{number=\"1\",type=\"tracepoint\".*addr=\"<PENDING>\",.*times=\"0\"" {
		pass "$test"
	    }
	    -re ".*${mi_gdb_prompt}$" {
		fail $test
	    }
	    timeout {
		fail "$test (timeout)"
	    }
	}

	mi_expect_stop "exited-normally" "" "" "" "" "" ""
    }
}

# Test target supports tracepoints or not.

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] {
    unsupported "Current target does not support trace"
    return -1
}

gdb_exit

test_reconnect

test_pending_resolved

return 0
