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

# Based on break.exp by Rob Savoye. (rob@cygnus.com)
# Hardware breakpoint support by Maciej W. Rozycki and Daniel Jacobowitz.
# Only one hardware breakpoint is set at a time as targets may limit
# the number available.


if { [prepare_for_testing hbreak2.exp "hbreak2" {break.c break1.c} {debug nowarnings}] } {
    return -1
}
set srcfile break.c
set srcfile1 break1.c

if ![runto_main] then { fail "break tests suppressed" }
delete_breakpoints

#
# Test whether the target supports hardware breakpoints at all.
#
gdb_test_multiple "hbreak main" "hardware breakpoint support" {
    -re "No hardware breakpoint support in the target.*$gdb_prompt $" {
	unsupported "hardware breakpoints"
	return
    }
    -re "Hardware breakpoints used exceeds limit.*$gdb_prompt $" {
	unsupported "hardware breakpoints"
	return
    }
    -re "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*$gdb_prompt $" {
	pass "hardware breakpoint support"
    }
}
gdb_run_cmd
gdb_test_multiple "" "hardware breakpoint insertion" {
    -re "Warning:\[\r\n\]+Cannot insert hardware breakpoint \[0-9\]+\.\[\r\n\]+Could not insert hardware breakpoints:\[\r\n\]+You may have requested too many hardware breakpoints/watchpoints\.\[\r\n\]+.*$gdb_prompt $" {
	unsupported "hardware breakpoint insertion"
	return
    }
    -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:.*\[\r\n\]+.*\[\t \]+if .argc.* \{.*$gdb_prompt $" {
	pass "hardware breakpoint insertion"
    }
}
delete_breakpoints

#
# Test simple hardware breakpoint setting commands.
#

#
# Test break at function.
#
gdb_test "hbreak main" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \
    "hardware breakpoint function"
delete_breakpoints

#
# Test break at quoted function.
#
gdb_test "hbreak \"marker2\"" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile1, line.*" \
    "hardware breakpoint quoted function"
delete_breakpoints

#
# Test break at function in file.
#
gdb_test "hbreak $srcfile:factorial" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \
    "hardware breakpoint function in file"
delete_breakpoints

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 "hbreak $bp_location1" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location1\\." \
    "hardware breakpoint line number"
delete_breakpoints

set bp_location2 [gdb_get_line_number "set breakpoint 2 here"]

#
# Test break at line number in file.
#
gdb_test "hbreak $srcfile:$bp_location2" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location2\\." \
    "hardware breakpoint line number in file"
delete_breakpoints

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 "hbreak multi_line_if_conditional" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location3\\." \
    "hardware breakpoint at start of multi line if conditional"
delete_breakpoints

gdb_test "hbreak multi_line_while_conditional" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location4\\." \
    "hardware 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 \]+hw breakpoint  keep y.* in multi_line_while_conditional at .*$srcfile:$bp_location4" \
    "hardware breakpoint info"
delete_breakpoints

#
# Run until the breakpoint at main is hit.  For non-stubs-using targets.
#
gdb_test "hbreak main" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \
    "hardware breakpoint function (2)"
gdb_run_cmd
gdb_test "" \
    "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*" \
    "run until function breakpoint"
delete_breakpoints

#
# Run until the breakpoint at a line number.
#
gdb_test "hbreak $bp_location1" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location1\\." \
    "hardware breakpoint line number (2)"
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"
delete_breakpoints

#
# Run until the breakpoint set in a function in a file.
#
gdb_test "hbreak $srcfile:factorial" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \
    "hardware breakpoint function in file (2)"
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"
}
delete_breakpoints

#
# Run until the breakpoint set at a quoted function.
#
gdb_test "hbreak \"marker2\"" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile1, line.*" \
    "hardware breakpoint quoted function (2)"
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"
delete_breakpoints
#
# Run until the file:function breakpoint at a line number in a file.
#
gdb_test "hbreak $srcfile:$bp_location2" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location2\\." \
    "hardware breakpoint line number in file (2)"
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"
delete_breakpoints

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

gdb_test "hbreak +1" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location10\\." \
    "hardware 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 hardware breakpoint"
delete_breakpoints

# 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 "hbreak $bp_location10a" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location10a\\." \
    "setting hardware breakpoint at }"

gdb_test "continue" \
    ".*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location10a.*$bp_location10a\[\t \]+}.*breakpoint 10a here.*" \
    "continue to hardware 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 "thbreak main" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \
    "temporary hardware breakpoint function"
delete_breakpoints

#
# Test break at function in file.
#

gdb_test "thbreak $srcfile:factorial" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \
    "temporary hardware breakpoint function in file"
delete_breakpoints

#
# Test break at line number.
#
gdb_test "thbreak $bp_location1" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location1.*" \
    "temporary hardware breakpoint line number #1"
delete_breakpoints

gdb_test "thbreak $bp_location6" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location6.*" \
    "temporary hardware breakpoint line number #2"
delete_breakpoints

#
# Test break at line number in file.
#
gdb_test "thbreak $srcfile:$bp_location2" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location2.*" \
    "temporary hardware breakpoint line number in file #1"
delete_breakpoints

set bp_location11 [gdb_get_line_number "set breakpoint 11 here"]
gdb_test "thbreak $srcfile:$bp_location11" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_location11.*" \
    "temporary hardware 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 \]+hw breakpoint  del.*y.*in main at .*$srcfile:$bp_location11.*" \
    "temporary hardware breakpoint info"


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

if ![runto_main] then { fail "break tests suppressed" }

# 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 "hbreak 999" \
    "No line 999 in the current file." \
    "hardware 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 "hbreak", which is treated
# as the "default" breakpoint.
#
gdb_test "hbreak" "Hardware assisted breakpoint \[0-9\]*.*" \
    "hardware break on default location"

# 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 "hbreak $bp_location1" \
    "set to-be-silent hardware break bp_location1" {
	-re "Hardware assisted breakpoint (\[0-9\]*) at .*, line $bp_location1.*$gdb_prompt $" {
	    pass "set to-be-silent hardware 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\]*hw breakpoint.*:$bp_location1\r\n\[ \t\]*silent.*" \
    "info silent hardware break bp_location1"

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

gdb_test "bt" "#0  main .* at .*:$bp_location1.*" \
    "stopped for silent hardware 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 "hbreak $bp_location12 thread 999" "Unknown thread 999.*" \
    "thread-specific hardware breakpoint on non-existent thread disallowed"

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

# Verify that GDB responds gracefully to a breakpoint command with
# trailing garbage.
#
gdb_test "hbreak $bp_location12 foo" \
    "malformed linespec error: unexpected string, \"foo\".*" \
    "hardware 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 hardware 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"
delete_breakpoints

# 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 "hbreak \$foo" \
    "Hardware assisted breakpoint (\[0-9\]*) at .*, line $bp_location11.*" \
    "set hardware breakpoint via convenience variable"
delete_breakpoints

# 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 "hbreak \$foo" \
    "Convenience variables used in line specs must have integer values.*" \
    "set hardware breakpoint via non-integer convenience variable disallowed"

# Verify that we can set and trigger a breakpoint in a user-called function.
#
gdb_test "hbreak marker2" \
    "Hardware assisted breakpoint (\[0-9\]*) at .*, line ($bp_location8|$bp_location9).*" \
    "set hardware 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 hardware 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"
    }
}

#********


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

proc test_next_with_recursion {} {
    global gdb_prompt
    global decimal
    global binfile

    delete_breakpoints

    # Can't set a hardware breakpoint without a live target, so do it now
    # before it's killed below.
    gdb_test "hbreak factorial" \
	"Hardware assisted breakpoint $decimal at .*" \
	"hardware break at factorial"

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

    # Run until we call factorial with 6

    gdb_run_cmd
    if [gdb_test "" \
	"Break.* factorial .value=6. .*" \
	"run to factorial(6)"] then { 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 hbreak2.exp "hbreak2o2" {break.c break1.c} {debug nowarnings optimize=-O2}] } {
    return -1
}

if ![runto_main] then { fail "break tests suppressed" }
delete_breakpoints

#
# Test break at function.
#
gdb_test "hbreak main" \
    "Hardware assisted breakpoint.*at.* file .*, line.*" \
    "hardware breakpoint function, optimized file"

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

#
# Test break at function.
#
gdb_test "hbreak marker4" \
    "Hardware assisted breakpoint.*at.* file .*$srcfile1, line.*" \
    "hardware breakpoint small function, optimized file"

#
# 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 hardware 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 hardware 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 hardware 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 hardware 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 hardware breakpoint set at small function, optimized file"
	}
}
