# Copyright 2007, 2008 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"

if $tracelevel then {
    strace $tracelevel
}

#
# test running programs
#
set prms_id 0
set bug_id 0

if {[skip_shlib_tests]} {
    return 0
}

set testfile "mi-pending"
set libfile "mi-pendshr"
set srcfile $testfile.c
set libsrc  $srcdir/$subdir/$libfile.c
set binfile $objdir/$subdir/$testfile
set lib_sl  $objdir/$subdir/$libfile.sl

set lib_opts  debug
set exec_opts [list debug shlib=$lib_sl]

if [get_compiler_info ${binfile}] {
    return -1
}

if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != ""
     || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} {
    untested "Could not compile either $libsrc or $srcdir/$subdir/$srcfile."
    return -1
}

# Start with a fresh gdb.

gdb_exit
mi_gdb_start
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}
gdb_load_shlibs $lib_sl

if [target_info exists gdb_stub] {
    gdb_step_for_stub;
}

# 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\"\}"\
    "MI pending breakpoint on pendfunc1"

mi_run_cmd

# Make sure we hit breakpoint.
mi_gdb_test "" \
    ".*\\*stopped,reason=\"breakpoint-hit\",bkptno=\"1\".*func=\"pendfunc1\".*" \
    "Run till MI pending breakpoint on pendfunc1"