# Copyright 2007-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 mi-support.exp
set MIFLAGS "-i=mi"

#
# test running programs
#

if {[skip_shlib_tests]} {
    return 0
}

standard_testfile mi-pending.c

set libfile1 "mi-pendshr"
set libfile2 "mi-pendshr2"
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
set exec_opts [list debug shlib=$lib_sl1 shlib_load]

if [get_compiler_info] {
    return -1
}

if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != ""
     || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""} {
    untested "failed to compile shared library"
    return -1
}

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

# Start with a fresh gdb.
gdb_exit
mi_gdb_start
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}
mi_load_shlibs $lib_sl1
mi_load_shlibs $lib_sl2

# Set pending breakpoint via MI.
mi_gdb_test "-break-insert -f pendfunc1" \
    ".*\\^done,bkpt=\{number=\"1\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"<PENDING>\",pending=\"pendfunc1\",times=\"0\",original-location=\"pendfunc1\"\}"\
    "MI pending breakpoint on pendfunc1"

# Set pending breakpoint with a condition via MI.
mi_gdb_test "-break-insert -f -c x==4 ${libfile1}.c:pendfunc2" \
    ".*\\^done,bkpt=\{number=\"2\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"<PENDING>\",pending=\"${libfile1}.c:pendfunc2\",cond=\"x==4\",times=\"0\",original-location=\"${libfile1}.c:pendfunc2\"\}"\
    "MI pending breakpoint on ${libfile1}.c:pendfunc2 if x==4"

# Set breakpoint so that we can stop when the thread is created
mi_gdb_test "-break-insert -f thread_func" \
    ".*\\^done,bkpt=\{number=\"3\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"${hex}\",func=\"thread_func\".*\}"\
    "MI pending breakpoint on thread_func"

mi_run_cmd

mi_expect_stop "breakpoint-hit" "pendfunc1" ".*" ".*" ".*" \
    { "" "disp=\"keep\"" } \
    "Run till MI pending breakpoint on pendfunc1"

mi_send_resuming_command "exec-continue" "continuing execution to skip conditional bp"

# We should not stop on the conditional breakpoint yet, but we stop on the original bp. 
mi_expect_stop "breakpoint-hit" "pendfunc1" ".*" ".*" ".*" \
    { "" "disp=\"keep\"" } \
    "Run till MI pending breakpoint on pendfunc1 a second time"

mi_send_resuming_command "exec-continue" "continuing execution to conditional bp"

# Now we should stop on the conditional breakpoint.
mi_expect_stop "breakpoint-hit" "pendfunc2" "\{name=\"x\",value=\"4\"\}" ".*" ".*" \
    { "" "disp=\"keep\"" } \
    "Run till MI pending breakpoint on pendfunc2 with x==4"

mi_send_resuming_command "exec-continue" "continuing execution to thread creation"

# Stop on thread creation so we can set a pending breakpoint with a thread cond.
mi_expect_stop "breakpoint-hit" "thread_func" ".*" ".*" ".*" \
    { "" "disp=\"keep\"" } \
    "Run till MI pending breakpoint on thread_func"

# Delete thread creation breakpoint to enable more than 1 thread to be created.
mi_gdb_test "-break-delete 3" "\\^done" "delete breakpoint 3"

# Set pending breakpoint with a thread via MI.
mi_gdb_test "-break-insert -p 2 -f pendfunc3" \
    ".*\\^done,bkpt=\{number=\"4\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"<PENDING>\",pending=\"pendfunc3\",thread=\"2\",thread=\"2\",times=\"0\",original-location=\"pendfunc3\"\}"\
    "MI pending breakpoint on pendfunc3"

mi_send_resuming_command "exec-continue" "continuing execution to thread condition"

# Check if we stopped in thread 2 like we should.
set testname "run till MI pending breakpoint on pendfunc3 on thread 2"
gdb_expect {
    -re "\\*stopped,reason=\"breakpoint-hit\",disp=\"keep\",bkptno=\"4\",frame=\{addr=\"$hex\",func=\"pendfunc3\".*thread-id=\"2\".*" {
	pass $testname
	return 0
    }
    timeout {
	fail "$testname (timeout)"
	return -1
    }
}
