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

# This file was written by Rob Savoye. (rob@cygnus.com)

if { [prepare_for_testing break.exp "break" {break.c break1.c} {debug nowarnings}] } {
    return -1
}
set srcfile break.c
set srcfile1 break1.c
#
# test simple breakpoint setting commands
#

# Test deleting all breakpoints when there are none installed,
# GDB should not prompt for confirmation.
# Note that lib/gdb.exp provides a "delete_breakpoints" proc
# for general use elsewhere.

send_gdb "delete breakpoints\n"
gdb_expect {
     -re "Delete all breakpoints.*$" {
	    send_gdb "y\n"
	    gdb_expect {
		-re "$gdb_prompt $" {
		    fail "Delete all breakpoints when none (unexpected prompt)"
		}
		timeout	{ fail "Delete all breakpoints when none (timeout after unexpected prompt)" }
	    }
	}
     -re ".*$gdb_prompt $"       { pass "Delete all breakpoints when none" }
    timeout	            { fail "Delete all breakpoints when none (timeout)" }
}

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

#
# test break at quoted function
#
gdb_test "break \"marker2\"" \
    "Breakpoint.*at.* file .*$srcfile1, line.*" \
    "breakpoint quoted function"

#
# test break at function in file
#
gdb_test "break $srcfile:factorial" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "breakpoint function in file"

set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]

#
# test break at line number
#
# Note that the default source file is the last one whose source text
# was printed.  For native debugging, before we've executed the
# program, this is the file containing main, but for remote debugging,
# it's wherever the processor was stopped when we connected to the
# board.  So, to be sure, we do a list command.
#
gdb_test "list main" \
    ".*main \\(argc, argv, envp\\).*" \
    "use `list' to establish default source file"
gdb_test "break $bp_location1" \
    "Breakpoint.*at.* file .*$srcfile, line $bp_location1\\." \
    "breakpoint line number"

#
# test duplicate breakpoint
#
gdb_test "break $bp_location1" \
    "Note: breakpoint \[0-9\]+ also set at pc.*Breakpoint \[0-9\]+ at.* file .*$srcfile, line $bp_location1\\." \
    "breakpoint duplicate"

set bp_location2 [gdb_get_line_number "set breakpoint 2 here"]

#
# test break at line number in file
#
gdb_test "break $srcfile:$bp_location2" \
    "Breakpoint.*at.* file .*$srcfile, line $bp_location2\\." \
    "breakpoint line number in file"

set bp_location3 [gdb_get_line_number "set breakpoint 3 here"]
set bp_location4 [gdb_get_line_number "set breakpoint 4 here"]

#
# Test putting a break at the start of a multi-line if conditional.
# Verify the breakpoint was put at the start of the conditional.
#
gdb_test "break multi_line_if_conditional" \
    "Breakpoint.*at.* file .*$srcfile, line $bp_location3\\." \
    "breakpoint at start of multi line if conditional"

gdb_test "break multi_line_while_conditional" \
    "Breakpoint.*at.* file .*$srcfile, line $bp_location4\\." \
    "breakpoint at start of multi line while conditional"

set bp_location6 [gdb_get_line_number "set breakpoint 6 here"]

set main_line $bp_location6

if {$hp_aCC_compiler} {
    set proto "\\(int\\)"
} else {
    set proto ""
}

set bp_location7 [gdb_get_line_number "set breakpoint 7 here"]
set bp_location8 [gdb_get_line_number "set breakpoint 8 here" $srcfile1]
set bp_location9 [gdb_get_line_number "set breakpoint 9 here" $srcfile1]

gdb_test "info break" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$main_line.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in marker2 at .*$srcfile1:($bp_location8|$bp_location9).*
\[0-9\]+\[\t \]+breakpoint     keep y.* in factorial$proto at .*$srcfile:$bp_location7.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$bp_location1.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$bp_location1.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$bp_location2.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in multi_line_if_conditional at .*$srcfile:$bp_location3.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in multi_line_while_conditional at .*$srcfile:$bp_location4" \
    "breakpoint info"

#
# Test info breakpoint with arguments
#

set see1 0
set see2 0
set see3 0
set see4 0
set see5 0
set see6 0

gdb_test_multiple "info break 2 4 6" "info break 2 4 6" {
    -re "1\[\t \]+breakpoint *keep y\[^\r\n\]*:$main_line\[^\r\n\]*" {
	set see1 1
	exp_continue
    }
    -re "2\[\t \]+breakpoint *keep y\[^\r\n\]* in marker2 at \[^\r\n\]*" {
	set see2 1
	exp_continue
    }
    -re "3\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location7\[^\r\n\]*" {
	set see3 1
	exp_continue
    }
    -re "4\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" {
	set see4 1
	exp_continue
    }
    -re "5\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" {
	set see5 1
	exp_continue
    }
    -re "6\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location2\[^\r\n\]*" {
	set see6 1
	exp_continue
    }
    -re ".*$gdb_prompt $" {
	if { !$see1 && $see2 && !$see3 && $see4 && !$see5 && $see6 } then {
	    pass "info break 2 4 6"
	} else {
	    fail "info break 2 4 6"
	}
    }
}

set see1 0
set see2 0
set see3 0
set see4 0
set see5 0
set see6 0

gdb_test_multiple "info break 3-5" "info break 3-5" {
    -re "1\[\t \]+breakpoint *keep y.* in main at .*:$main_line\[^\r\n\]*" {
	set see1 1
	exp_continue
    }
    -re "2\[\t \]+breakpoint *keep y\[^\r\n\]* in marker2 at \[^\r\n\]*" {
	set see2 1
	exp_continue
    }
    -re "3\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location7\[^\r\n\]*" {
	set see3 1
	exp_continue
    }
    -re "4\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" {
	set see4 1
	exp_continue
    }
    -re "5\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" {
	set see5 1
	exp_continue
    }
    -re "6\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location2\[^\r\n\]*" {
	set see6 1
	exp_continue
    }
    -re ".*$gdb_prompt $" {
	if { !$see1 && !$see2 && $see3 && $see4 && $see5 && !$see6 } then {
	    pass "info break 3-5"
	} else {
	    fail "info break 3-5"
	}
    }
}

#
# Test disable/enable with arguments
#

# Test with value history

gdb_test "print 1" "" ""
gdb_test "print 2" "" ""
gdb_test "print 3" "" ""
gdb_test "print 4" "" ""
gdb_test "print 5" "" ""
gdb_test "print 6" "" ""

# $2 is 2 and $$ is 5
gdb_test_no_output "disable \$2 \$\$" "disable using history values"

set see1 0
set see2 0
set see3 0
set see4 0
set see5 0
set see6 0

gdb_test_multiple "info break" "check disable with history values" {
    -re "1\[\t \]+breakpoint *keep y.* in main at .*:$main_line\[^\r\n\]*" {
	set see1 1
	exp_continue
    }
    -re "2\[\t \]+breakpoint *keep n\[^\r\n\]* in marker2 at \[^\r\n\]*" {
	set see2 1
	exp_continue
    }
    -re "3\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location7\[^\r\n\]*" {
	set see3 1
	exp_continue
    }
    -re "4\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" {
	set see4 1
	exp_continue
    }
    -re "5\[\t \]+breakpoint *keep n\[^\r\n\]*$bp_location1\[^\r\n\]*" {
	set see5 1
	exp_continue
    }
    -re "6\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location2\[^\r\n\]*" {
	set see6 1
	exp_continue
    }
    -re ".*$gdb_prompt $" {
	if { $see1 && $see2 && $see3 && $see4 && $see5 && $see6 } then {
	    pass "check disable with history values"
	} else {
	    fail "check disable with history values"
	}
    }
}

gdb_test "enable" "" ""
gdb_test "set \$foo = 3" "" ""
gdb_test "set \$bar = 6" "" ""
gdb_test_no_output "disable \$foo \$bar" "disable with convenience values"

set see1 0
set see2 0
set see3 0
set see4 0
set see5 0
set see6 0

gdb_test_multiple "info break" "check disable with convenience values" {
    -re "1\[\t \]+breakpoint *keep y.* in main at .*:$main_line\[^\r\n\]*" {
	set see1 1
	exp_continue
    }
    -re "2\[\t \]+breakpoint *keep y\[^\r\n\]* in marker2 at \[^\r\n\]*" {
	set see2 1
	exp_continue
    }
    -re "3\[\t \]+breakpoint *keep n\[^\r\n\]*$bp_location7\[^\r\n\]*" {
	set see3 1
	exp_continue
    }
    -re "4\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" {
	set see4 1
	exp_continue
    }
    -re "5\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" {
	set see5 1
	exp_continue
    }
    -re "6\[\t \]+breakpoint *keep n\[^\r\n\]*$bp_location2\[^\r\n\]*" {
	set see6 1
	exp_continue
    }
    -re ".*$gdb_prompt $" {
	if { $see1 && $see2 && $see3 && $see4 && $see5 && $see6 } then {
	    pass "check disable with convenience values"
	} else {
	    fail "check disable with convenience values"
	}
    }
}

# test with bad values

gdb_test "enable" "" ""
gdb_test "disable 10" "No breakpoint number 10." \
    "disable non-existent breakpoint 10"

gdb_test "set \$baz 1.234"
gdb_test "disable \$baz" \
    "Convenience variable must have integer value.*" \
    "disable with non-integer convenience var"
gdb_test "disable \$grbx" \
    "Convenience variable must have integer value.*" \
    "disable with non-existent convenience var"
gdb_test "disable \$10" \
    "History has not yet reached .10." \
    "disable with non-existent history value"
gdb_test "disable \$1foo" \
    "Convenience variable must have integer value.*" \
    "disable with badly formed history value"

# FIXME: The rest of this test doesn't work with anything that can't
# handle arguments.
# Huh? There doesn't *appear* to be anything that passes arguments
# below.

#
# run until the breakpoint at main is hit. For non-stubs-using targets.
#
gdb_run_cmd
gdb_expect {
    -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" {
	pass "run until function breakpoint"
    }
    -re "$gdb_prompt $" {
	fail "run until function breakpoint"
    }
    timeout {
	fail "run until function breakpoint (timeout)"
    }
}

# Test the 'list' commands sets current file for the 'break LINENO' command.
set bp_marker1 [gdb_get_line_number "set breakpoint 16 here" ${srcfile1}]
gdb_test "list marker1" ".*"
gdb_test "break $bp_marker1" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*${srcfile1}, line ${bp_marker1}\\." \
         "break lineno"
gdb_test_no_output {delete $bpnum}

#
# run until the breakpoint at a line number
#
gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location1.*$bp_location1\[\t \]+printf.*factorial.*" \
			"run until breakpoint set at a line number"

#
# Run until the breakpoint set in a function in a file
#
for {set i 6} {$i >= 1} {incr i -1} {
	gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, factorial \\(value=$i\\) at .*$srcfile:$bp_location7.*$bp_location7\[\t \]+.*if .value > 1. \{.*" \
			"run until file:function($i) breakpoint"
}

#
# Run until the breakpoint set at a quoted function
#
gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, (0x\[0-9a-f\]+ in )?marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*" \
		"run until quoted breakpoint"
#
# run until the file:function breakpoint at a line number in a file
#
gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location2.*$bp_location2\[\t \]+argc = \\(argc == 12345\\);.*" \
		"run until file:linenum breakpoint"

# Test break at offset +1
set bp_location10 [gdb_get_line_number "set breakpoint 10 here"]

gdb_test "break +1" \
    "Breakpoint.*at.* file .*$srcfile, line $bp_location10\\." \
    "breakpoint offset +1"

# Check to see if breakpoint is hit when stepped onto

gdb_test "step" \
    ".*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location10.*$bp_location10\[\t \]+return argc;.*breakpoint 10 here.*" \
    "step onto breakpoint"

# Check to see if breakpoint can be set on ending brace of function
set bp_location10a [gdb_get_line_number "set breakpoint 10a here"]

gdb_test "break $bp_location10a" \
    "Breakpoint.*at.* file .*$srcfile, line $bp_location10a\\." \
    "setting breakpoint at }"

gdb_test "continue" \
    ".*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location10a.*$bp_location10a\[\t \]+}.*breakpoint 10a here.*" \
    "continue to breakpoint at }"

#
# delete all breakpoints so we can start over, course this can be a test too
#
delete_breakpoints

#
# test temporary breakpoint at function
#

gdb_test "tbreak main" "Temporary breakpoint.*at.* file .*$srcfile, line.*" "Temporary breakpoint function"

#
# test break at function in file
#

gdb_test "tbreak $srcfile:factorial" "Temporary breakpoint.*at.* file .*$srcfile, line.*" \
	"Temporary breakpoint function in file"

#
# test break at line number
#
gdb_test "tbreak $bp_location1" \
    "Temporary breakpoint.*at.* file .*$srcfile, line $bp_location1.*" \
    "Temporary breakpoint line number #1"

gdb_test "tbreak $bp_location6" "Temporary breakpoint.*at.* file .*$srcfile, line $bp_location6.*" "Temporary breakpoint line number #2"

#
# test break at line number in file
#
gdb_test "tbreak $srcfile:$bp_location2" \
    "Temporary breakpoint.*at.* file .*$srcfile, line $bp_location2.*" \
    "Temporary breakpoint line number in file #1"

set bp_location11 [gdb_get_line_number "set breakpoint 11 here"]
gdb_test  "tbreak $srcfile:$bp_location11" "Temporary breakpoint.*at.* file .*$srcfile, line $bp_location11.*" "Temporary breakpoint line number in file #2"

#
# check to see what breakpoints are set (temporary this time)
#
gdb_test "info break" "Num     Type.*Disp Enb Address.*What.*\[\r\n\]
\[0-9\]+\[\t \]+breakpoint     del.*y.*in main at .*$srcfile:$main_line.*\[\r\n\]
\[0-9\]+\[\t \]+breakpoint     del.*y.*in factorial$proto at .*$srcfile:$bp_location7.*\[\r\n\]
\[0-9\]+\[\t \]+breakpoint     del.*y.*in main at .*$srcfile:$bp_location1.*\[\r\n\]
\[0-9\]+\[\t \]+breakpoint     del.*y.*in main at .*$srcfile:$bp_location6.*\[\r\n\]
\[0-9\]+\[\t \]+breakpoint     del.*y.*in main at .*$srcfile:$bp_location2.*\[\r\n\]
\[0-9\]+\[\t \]+breakpoint     del.*y.*in main at .*$srcfile:$bp_location11.*" \
    "Temporary breakpoint info"


#***********

# Verify that catchpoints for fork, vfork and exec don't trigger
# inappropriately.  (There are no calls to those system functions
# in this test program.)
#
if ![runto_main] then { fail "break tests suppressed" }

gdb_test "catch" \
    "Catch requires an event name." \
    "catch requires an event name"


set name "set catch fork, never expected to trigger"
gdb_test_multiple "catch fork" "$name" {
    -re "Catchpoint \[0-9\]* .fork..*$gdb_prompt $" {
	pass $name
    }
    -re "Catch of fork not yet implemented.*$gdb_prompt $" {
	pass $name
    }
}


# If we are on HP-UX 10.20, we expect an error message to be
# printed if we type "catch vfork" at the gdb gdb_prompt.  This is
# because on HP-UX 10.20, we cannot catch vfork events.

set name "set catch vfork, never expected to trigger"

if [istarget "hppa*-hp-hpux10.20"] then {
    gdb_test "catch vfork" \
	"Catch of vfork events not supported on HP-UX 10.20..*" \
	"$name"
} else {
    gdb_test_multiple "catch vfork" "$name" {
	-re "Catchpoint \[0-9\]* .vfork..*$gdb_prompt $" {
	    pass $name
	}
	-re "Catch of vfork not yet implemented.*$gdb_prompt $" {
	    pass $name
	}
    }
}

set name "set catch exec, never expected to trigger"
gdb_test_multiple "catch exec" "$name" {
    -re "Catchpoint \[0-9\]* .exec..*$gdb_prompt $" {
	pass $name
    }
    -re "Catch of exec not yet implemented.*$gdb_prompt $" {
	pass $name
    }
}

# Verify that GDB responds gracefully when asked to set a breakpoint
# on a nonexistent source line.
#
gdb_test_no_output "set breakpoint pending off"
gdb_test "break 999" \
    "No line 999 in the current file." \
    "break on non-existent source line"

# Run to the desired default location. If not positioned here, the
# tests below don't work.
#
gdb_test "until $bp_location1" "main .* at .*:$bp_location1.*" \
    "until bp_location1"

# Verify that GDB allows one to just say "break", which is treated
# as the "default" breakpoint.  Note that GDB gets cute when printing
# the informational message about other breakpoints at the same
# location.  We'll hit that bird with this stone too.
#
gdb_test "break" "Breakpoint \[0-9\]*.*" \
    "break on default location, 1st time"

gdb_test "break" \
    "Note: breakpoint \[0-9\]* also set at .*Breakpoint \[0-9\]*.*" \
    "break on default location, 2nd time"

gdb_test "break" \
    "Note: breakpoints \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*" \
    "break on default location, 3rd time"

gdb_test "break" \
    "Note: breakpoints \[0-9\]*, \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*" \
    "break on default location, 4th time"

# Verify that a "silent" breakpoint can be set, and that GDB is indeed
# "silent" about its triggering.
#
if ![runto_main] then { fail "break tests suppressed" }

gdb_test_multiple "break $bp_location1" \
    "set to-be-silent break bp_location1" {
	-re "Breakpoint (\[0-9\]*) at .*, line $bp_location1.*$gdb_prompt $" {
	    pass "set to-be-silent break bp_location1"
	}
    }

gdb_test "commands $expect_out(1,string)\nsilent\nend" ">end" "set silent break bp_location1"

gdb_test "info break $expect_out(1,string)" \
    "\[0-9\]*\[ \t\]*breakpoint.*:$bp_location1\r\n\[ \t\]*silent.*" \
    "info silent break bp_location1"

gdb_test "continue" "Continuing." \
    "hit silent break bp_location1"

gdb_test "bt" "#0  main .* at .*:$bp_location1.*" \
    "stopped for silent break bp_location1"

# Verify that GDB can at least parse a breakpoint with the
# "thread" keyword.  (We won't attempt to test here that a
# thread-specific breakpoint really triggers appropriately.
# The gdb.threads subdirectory contains tests for that.)
#
set bp_location12 [gdb_get_line_number "set breakpoint 12 here"]
gdb_test "break $bp_location12 thread 999" "Unknown thread 999.*" \
    "thread-specific breakpoint on non-existent thread disallowed"

gdb_test "break $bp_location12 thread foo" \
    "Junk after thread keyword.*" \
    "thread-specific breakpoint on bogus thread ID disallowed"

# Verify that GDB responds gracefully to a breakpoint command with
# trailing garbage.
#
gdb_test "break $bp_location12 foo" \
    "malformed linespec error: unexpected string, \"foo\".*" \
    "breakpoint with trailing garbage disallowed"

# Verify that GDB responds gracefully to a "clear" command that has
# no matching breakpoint.  (First, get us off the current source line,
# which we know has a breakpoint.)
#
gdb_test "next" "marker1.*" "step over breakpoint"

gdb_test "clear 81" "No breakpoint at 81.*" \
    "clear line has no breakpoint disallowed"

gdb_test "clear" "No breakpoint at this line.*" \
    "clear current line has no breakpoint disallowed"

# Verify that we can set and clear multiple breakpoints.
#
# We don't test that it deletes the correct breakpoints.  We do at
# least test that it deletes more than one breakpoint.
#
gdb_test "break marker3" "Breakpoint.*at.*" "break marker3 #1"
gdb_test "break marker3" "Breakpoint.*at.*" "break marker3 #2"
gdb_test "clear marker3" {Deleted breakpoints [0-9]+ [0-9]+.*}

# Verify that a breakpoint can be set via a convenience variable.
#
gdb_test_no_output "set \$foo=$bp_location11" \
    "set convenience variable \$foo to bp_location11"

gdb_test "break \$foo" \
    "Breakpoint (\[0-9\]*) at .*, line $bp_location11.*" \
    "set breakpoint via convenience variable"

# Verify that GDB responds gracefully to an attempt to set a
# breakpoint via a convenience variable whose type is not integer.
#
gdb_test_no_output "set \$foo=81.5" \
    "set convenience variable \$foo to 81.5"

gdb_test "break \$foo" \
    "Convenience variables used in line specs must have integer values.*" \
    "set breakpoint via non-integer convenience variable disallowed"

# Verify that we can set and trigger a breakpoint in a user-called function.
#
gdb_test "break marker2" \
    "Breakpoint (\[0-9\]*) at .*, line ($bp_location8|$bp_location9).*" \
    "set breakpoint on to-be-called function"

gdb_test "print marker2(99)" \
    "The program being debugged stopped while in a function called from GDB.\r\nEvaluation of the expression containing the function\r\n.marker2$proto. will be abandoned.\r\nWhen the function is done executing, GDB will silently stop.*" \
    "hit breakpoint on called function"

# As long as we're stopped (breakpointed) in a called function,
# verify that we can successfully backtrace & such from here.
#
# In this and the following test, the _sr4export check apparently is needed
# for hppa*-*-hpux.
#
gdb_test_multiple "bt" "backtrace while in called function" {
    -re "#0\[ \t\]*($hex in )?marker2.*:($bp_location8|$bp_location9)\r\n#1.*_sr4export.*$gdb_prompt $" {
	pass "backtrace while in called function"
    }
    -re "#0\[ \t\]*($hex in )?marker2.*:($bp_location8|$bp_location9)\r\n#1.*function called from gdb.*$gdb_prompt $" {
	pass "backtrace while in called function"
    }
}

# Return from the called function.  For remote targets, it's important to do
# this before runto_main, which otherwise may silently stop on the dummy
# breakpoint inserted by GDB at the program's entry point.
#
gdb_test_multiple "finish" "finish from called function" {
    -re "Run till exit from .*marker2.* at .*($bp_location8|$bp_location9)\r\n.* in _sr4export.*$gdb_prompt $" {
	pass "finish from called function"
    }
    -re "Run till exit from .*marker2.* at .*($bp_location8|$bp_location9)\r\n.*function called from gdb.*$gdb_prompt $" {
	pass "finish from called function"
    }
    -re "Run till exit from .*marker2.* at .*($bp_location8|$bp_location9)\r\n.*Value returned.*$gdb_prompt $" {
	pass "finish from called function"
    }
}

# Verify that GDB responds gracefully to a "finish" command with
# arguments.
#
if ![runto_main] then { fail "break tests suppressed" }

send_gdb "finish 123\n"
gdb_expect {
  -re "The \"finish\" command does not take any arguments.\r\n$gdb_prompt $"\
          {pass "finish with arguments disallowed"}
  -re "$gdb_prompt $"\
          {fail "finish with arguments disallowed"}
  timeout {fail "(timeout) finish with arguments disallowed"}
}

# Verify that GDB responds gracefully to a request to "finish" from
# the outermost frame.  On a stub that never exits, this will just
# run to the stubs routine, so we don't get this error...  Thus the 
# second condition.
#

gdb_test_multiple "finish" "finish from outermost frame disallowed" {
    -re "\"finish\" not meaningful in the outermost frame.\r\n$gdb_prompt $" {
	pass "finish from outermost frame disallowed"
    }
    -re "Run till exit from.*\r\n$gdb_prompt $" {
	pass "finish from outermost frame disallowed"
    }
}

# Verify that we can explicitly ask GDB to stop on all shared library
# events, and that it does so.
#
if [istarget "hppa*-*-hpux*"] then {
    if ![runto_main] then { fail "break tests suppressed" }

    gdb_test_no_output "set stop-on-solib-events 1" \
	"set stop-on-solib-events"

    gdb_test "run" \
	"Stopped due to shared library event.*" \
	"triggered stop-on-solib-events" \
	"Start it from the beginning.*y or n. $" \
	"y" 

    gdb_test_no_output "set stop-on-solib-events 0" \
	"reset stop-on-solib-events"
}

# Hardware breakpoints are unsupported on HP-UX.  Verify that GDB
# gracefully responds to requests to create them.
#
if [istarget "hppa*-*-hpux*"] then {
    if ![runto_main] then { fail "break tests suppressed" }

    gdb_test "hbreak" \
	"No hardware breakpoint support in the target.*" \
	"hw breaks disallowed"

    gdb_test "thbreak" \
	"No hardware breakpoint support in the target.*" \
	"temporary hw breaks disallowed"
}

#********


#
# Test "next" over recursive function call.
#

proc test_next_with_recursion {} { 
    global gdb_prompt
    global decimal
    global binfile

    gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y"
    delete_breakpoints

    gdb_test "break factorial" "Breakpoint $decimal at .*" "break at factorial"

    # Run until we call factorial with 6

    gdb_run_cmd
    gdb_expect {
	-re "Break.* factorial .value=6. .*$gdb_prompt $" {}
	-re ".*$gdb_prompt $" {
	    fail "run to factorial(6)";
	    gdb_suppress_tests;
	}
	timeout { fail "run to factorial(6) (timeout)" ; gdb_suppress_tests }
    }

    # Continue until we call factorial recursively with 5.

    if [gdb_test "continue" \
	"Continuing.*Break.* factorial .value=5. .*" \
	"continue to factorial(5)"] then { gdb_suppress_tests }

    # Do a backtrace just to confirm how many levels deep we are.

    if [gdb_test "backtrace" \
	"#0\[ \t\]+ factorial .value=5..*" \
	"backtrace from factorial(5)"] then { gdb_suppress_tests }

    # Now a "next" should position us at the recursive call, which
    # we will be performing with 4.

    if [gdb_test "next" \
	".* factorial .value - 1.;.*" \
	"next to recursive call"] then { gdb_suppress_tests }

    # Disable the breakpoint at the entry to factorial by deleting them all.
    # The "next" should run until we return to the next line from this
    # recursive call to factorial with 4.
    # Buggy versions of gdb will stop instead at the innermost frame on
    # the line where we are trying to "next" to.

    delete_breakpoints

    if [istarget "mips*tx39-*"] {
	set timeout 60
    }
    # We used to set timeout here for all other targets as well.  This
    # is almost certainly wrong.  The proper timeout depends on the
    # target system in use, and how we communicate with it, so there
    # is no single value appropriate for all targets.  The timeout
    # should be established by the Dejagnu config file(s) for the
    # board, and respected by the test suite.
    #
    # For example, if I'm running GDB over an SSH tunnel talking to a
    # portmaster in California talking to an ancient 68k board running
    # a crummy ROM monitor (a situation I can only wish were
    # hypothetical), then I need a large timeout.  But that's not the
    # kind of knowledge that belongs in this file.

    gdb_test next "\[0-9\]*\[\t \]+return \\(value\\);.*" \
	    "next over recursive call"

    # OK, we should be back in the same stack frame we started from.
    # Do a backtrace just to confirm.

    set result [gdb_test "backtrace" \
	    "#0\[ \t\]+ factorial .value=120.*\r\n#1\[ \t\]+ \[0-9a-fx\]+ in factorial .value=6..*" \
	    "backtrace from factorial(5.1)"]
    if { $result != 0 } { gdb_suppress_tests }

    if [target_info exists gdb,noresults] { gdb_suppress_tests }
  gdb_continue_to_end "recursive next test"
   gdb_stop_suppressing_tests;
}

test_next_with_recursion


#********

# build a new file with optimization enabled so that we can try breakpoints
# on targets with optimized prologues

if { [prepare_for_testing break.exp "breako2" {break.c break1.c} {debug nowarnings optimize=-O2}] } {
    return -1
}

#
# test break at function
#
gdb_test "break main" \
    "Breakpoint.*at.* file .*, line.*" \
    "breakpoint function, optimized file"

#
# test break at function
#
gdb_test "break marker4" \
    "Breakpoint.*at.* file .*$srcfile1, line.*" \
    "breakpoint small function, optimized file"

#
# run until the breakpoint at main is hit. For non-stubs-using targets.
#
gdb_run_cmd
gdb_expect {
    -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" {
	pass "run until function breakpoint, optimized file"
    }
    -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$gdb_prompt $" {
	pass "run until function breakpoint, optimized file (code motion)"
    }
    -re "$gdb_prompt $" {
	fail "run until function breakpoint, optimized file"
    }
    timeout {
	fail "run until function breakpoint, optimized file (timeout)"
    }
}

#
# run until the breakpoint at a small function
#

#
# Add a second pass pattern.  The behavior differs here between stabs
# and dwarf for one-line functions.  Stabs preserves two line symbols
# (one before the prologue and one after) with the same line number, 
# but dwarf regards these as duplicates and discards one of them.
# Therefore the address after the prologue (where the breakpoint is)
# has no exactly matching line symbol, and GDB reports the breakpoint
# as if it were in the middle of a line rather than at the beginning.

set bp_location13 [gdb_get_line_number "set breakpoint 13 here" $srcfile1]
set bp_location14 [gdb_get_line_number "set breakpoint 14 here" $srcfile1]

gdb_test_multiple "continue" \
    "run until breakpoint set at small function, optimized file" {
	-re "Breakpoint $decimal, marker4 \\(d=(d@entry=)?177601976\\) at .*$srcfile1:$bp_location13\[\r\n\]+$bp_location13\[\t \]+void marker4.*" {
	    pass "run until breakpoint set at small function, optimized file"
	}
	-re "Breakpoint $decimal, $hex in marker4 \\(d=(d@entry=)?177601976\\) at .*$srcfile1:$bp_location13\[\r\n\]+$bp_location13\[\t \]+void marker4.*" {
	    pass "run until breakpoint set at small function, optimized file"
	}
	-re "Breakpoint $decimal, marker4 \\(d=(d@entry=)?177601976\\) at .*$srcfile1:$bp_location14\[\r\n\]+$bp_location14\[\t \]+void marker4.*" {
	    # marker4() is defined at line 46 when compiled with -DPROTOTYPES
	    pass "run until breakpoint set at small function, optimized file (line bp_location14)"
	}
	-re "Breakpoint $decimal, factorial \\(.*\\) .*\{\r\n$gdb_prompt" {
	    # GCC 4.3 emits bad line number information - see gcc/36748.
	    if { [test_compiler_info "gcc-4-3-*"] } {
		setup_xfail *-*-*
	    }
	    fail "run until breakpoint set at small function, optimized file"
	}
    }

clean_restart breako2

#
# test that 'rbreak' on a symbol that may be from a shared library doesn't
# cause a "Junk at end of arguments." error.
#
# On x86 GNU/Linux, this test will choke on e.g. __libc_start_main@plt.
#
# Note that this test won't necessarily choke on all targets even if
# all the rbreak issue is present.  rbreak needs to match and set a
# breakpoint on a symbol causes 'break' to choke.
#

gdb_test_no_output "set breakpoint pending on" "rbreak junk pending setup"

# We expect at least one breakpoint to be set when we "rbreak main".
gdb_test "rbreak main" \
    ".*Breakpoint.*at.* file .*$srcfile, line.*" \
    "rbreak junk set breakpoint"

# Run to a breakpoint.  Fail if we see "Junk at end of arguments".
gdb_run_cmd
gdb_expect {
    -re "Junk at end of arguments" {
	fail "rbreak junk"
    }
    -re ".*Breakpoint \[0-9\]+,.*$gdb_prompt $" {
	pass "rbreak junk"
    }
    timeout {
	fail "rbreak junk (timeout)"
    }
}


# Reset the default arguments for VxWorks
if [istarget "*-*-vxworks*"] {
    set timeout 10
    verbose "Timeout is now $timeout seconds" 2
    gdb_test_no_output "set args main"
}
