#   Copyright 2003, 2004, 2005
#   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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# This file was created by Jeff Johnston. (jjohnstn@redhat.com)

if $tracelevel then {
    strace $tracelevel
}

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

# are we on a target board?
if ![isnative] then {
    return 0
}

set testfile "pending"
set libfile "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
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if [target_info exists gdb_stub] {
    gdb_step_for_stub;
}
#
# Test setting, querying, and modifying pending breakpoints
#

gdb_test_multiple "break pendfunc1" "set pending breakpoint" {
     -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" {
	    gdb_test "y" "Breakpoint.*pendfunc1.*pending." "set pending breakpoint"
     }
}

gdb_test "info break" \
    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendfunc1.*" \
"single pending breakpoint info"

#
# Test breaking at existing function
#

set mainline [gdb_get_line_number "break main here"]

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

gdb_test "info break" \
    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendfunc1.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline" \
"pending plus real breakpoint info"


# 
# Test not setting a pending breakpoint 
#
gdb_test_multiple "break pendfunc2" "Don't set pending breakpoint" {
     -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" {
	    gdb_test "n" "" "Don't set pending breakpoint"
     }
}

#
# Add condition to pending breakpoint 
#

gdb_test "condition 1 k == 1" ""

gdb_test "info break" \
    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendfunc1.*
\[\t \]+stop only if k == 1.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline" \
"pending plus condition"

#
# Disable pending breakpoint
#

gdb_test "disable 1" ""

gdb_test "info break" \
    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+breakpoint     keep n.*PENDING.*pendfunc1.*
\[\t \]+stop only if k == 1.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline" \
"pending disabled"

#
# Add commands to pending breakpoint
#
gdb_test "commands 1\nprint k\nend" "" \
        "Set commands for pending breakpoint"

gdb_test "info break" \
    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+breakpoint     keep n.*PENDING.*pendfunc1.*
\[\t \]+stop only if k == 1.*
\[\t \]+print k.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline" \
"pending disabled plus commands"

#
# Try a pending break for a line in a source file with a condition
#

gdb_test_multiple "break pendshr.c:26 if x > 3" "Set pending breakpoint 2" {
     -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" {
	    gdb_test "y" "Breakpoint.*pendshr.c:26.*pending." \
		"Set pending breakpoint 2"
     }
}

gdb_test "info break" \
    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+breakpoint     keep n.*PENDING.*pendfunc1.*
\[\t \]+stop only if k == 1.*
\[\t \]+print k.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline.*
\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendshr.c:26 if x > 3.*" \
"multiple pending breakpoints"


#
# Try a pending break for a line in a source file with ignore count:
#

gdb_test_multiple "break pendshr.c:27" "Set pending breakpoint 3" {
     -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" {
	    gdb_test "y" "Breakpoint.*pendshr.c:27.*pending." \
		"Set pending breakpoint 3"
     }
}

gdb_test {ignore $bpnum 2} "Will ignore next 2 crossings of breakpoint .*" \
    "set ignore count on pending breakpoint 3"

gdb_test "info break" \
    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+breakpoint     keep n.*PENDING.*pendfunc1.*
\[\t \]+stop only if k == 1.*
\[\t \]+print k.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline.*
\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendshr.c:26 if x > 3.*
\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendshr.c:27.*ignore next 2 hits.*" \
"multiple pending breakpoints 2"

#
# Run to main which should resolve a pending breakpoint
#

gdb_test "run" \
"Breakpoint.*at.*
Pending breakpoint \"pendshr.c:26 if x > 3\" resolved.*
Breakpoint.*, main.*$mainline.*" \
"running to main"

#
# Re-enable the first pending breakpoint which should resolve
#

gdb_test "enable 1" \
"Breakpoint.*at.*
Pending breakpoint \"pendfunc1.* resolved.*" \
"re-enabling pending breakpoint that can resolve instantly"

#
# Continue to verify conditionals and commands for breakpoints are honored
#

gdb_test "continue" \
".*Breakpoint.*pendfunc1.*at.*pendshr.c:26.*4;" \
"continue to resolved breakpoint 2"

gdb_test "continue" \
".*Breakpoint.*pendfunc1.*at.*pendshr.c:26.*
\[$\]1 = 1." \
"continue to resolved breakpoint 1"

#
# Disable the other two breakpoints, and continue to the one with
# the ignore count.  Make sure you hit it the third time, x should
# be 3 then.
#

gdb_test "disable 7" "" "Disable other breakpoints"
gdb_test "disable 5" "" "Disable other breakpoints"

gdb_test "continue" \
	{.*Breakpoint.*pendfunc1.*\(x=3\) at.*pendshr.c:27.*printf.*;} \
"continue to resolved breakpoint 3"

delete_breakpoints

gdb_breakpoint "main"

#
# Set non-existent pending breakpoint
#
gdb_test_multiple "break imaginary" "set imaginary pending breakpoint" {
     -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" {
	    gdb_test "y" "Breakpoint.*imaginary.*pending." \
		"set imaginary pending breakpoint"
     }
}

#
# rerun program and make sure that any pending breakpoint remains and no
# error messages are issued for the missing function
#

rerun_to_main

gdb_test "info break" \
    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline.*
\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*imaginary.*" \
"verify pending breakpoint after restart"
