# Copyright 1997, 1998, 1999, 2000, 2001 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.  */

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This test was written by Rich Title. 
# Purpose is to test conditional breakpoints.
# Modeled after "break.exp".

if $tracelevel then {
	strace $tracelevel
	}

global usestubs

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

set testfile "break"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

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

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}


if [target_info exists gdb_stub] {
    gdb_step_for_stub;
}

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

# 
# test conditional break at function
#
gdb_test "break marker1 if 1==1" \
    "Breakpoint.*at.* file .*$srcfile, line.*"

gdb_test "delete 2" ""

#
# test conditional break at line number
#
gdb_test "break 79 if 1==1" \
    "Breakpoint.*at.* file .*$srcfile, line 79\\."

gdb_test "delete 3" ""

# 
# test conditional break at function
#
gdb_test "break marker1 if (1==1)" \
    "Breakpoint.*at.* file .*$srcfile, line.*"

#
# test conditional break at line number
#
gdb_test "break 79 if (1==1)" \
    "Breakpoint.*at.* file .*$srcfile, line 79\\."

gdb_test "break marker2 if (a==43)" \
    "Breakpoint.*at.* file .*$srcfile, line.*"

#
# check to see what breakpoints are set
#

if {$hp_aCC_compiler} {
    set marker1_proto "\\(void\\)"
    set marker2_proto "\\(int\\)"
} else {
    set marker1_proto ""
    set marker2_proto ""
}

set main_line 75
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 marker1$marker1_proto at .*$srcfile:4\[38\].*
\[\t \]+stop only if 1 == 1.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:79.*
\[\t \]+stop only if 1 == 1.*
\[0-9\]+\[\t \]+breakpoint     keep y.* in marker2$marker2_proto at .*$srcfile:4\[49\].*
\[\t \]+stop only if a == 43.*" \
    "breakpoint info"


#
# run until the breakpoint at main is hit.
#


rerun_to_main

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

#
# run until the breakpoint at marker1
#
# If the inferior stops at the first instruction of a source line, GDB
# won't print the actual PC value; the source line is enough to
# exactly specify the PC.  But if the inferior is instead stopped in
# the midst of a source line, GDB will include the PC in the
# breakpoint hit message.  This way, GDB always provides the exact
# stop location, but avoids clutter when possible.
#
# Suppose you have a function written completely on one source line, like:
#    int foo (int x) { return 0; }
# Setting a breakpoint at `foo' actually places the breakpoint after
# foo's prologue.
#
# GCC's STABS writer always emits a line entry attributing the
# prologue instructions to the line containing the function's open
# brace, even if the first user instruction is also on that line.
# This means that, in the case of a one-line function, you will get
# two line entries in the debug info for the same line: one at the
# function's entry point, and another at the first user instruction.
# GDB preserves these duplicated line entries, and prefers the later
# one; thus, when the program stops after the prologue, at the first
# user instruction, GDB's search finds the second line entry, decides
# that the PC is indeed at the beginning of a source line, and doesn't
# print an address in the breakpoint hit message.
# 
# GCC's Dwarf2 writer, on the other hand, squeezes out duplicate line
# entries, so GDB considers the source line to begin at the start of
# the function's prologue.  Thus, if the program stops at the
# breakpoint, GDB will decide that the PC is not at the beginning of a
# source line, and will print an address.
#
# I think the Dwarf2 writer's behavior is arguably correct, but not
# helpful.  If the user sets a breakpoint at that source line, they
# want that breakpoint to fall after the prologue.  Identifying the
# prologue's code with the opening brace is nice, but it shouldn't
# take precedence over real code.
#
# Until the Dwarf2 writer gets fixed, I'm going to XFAIL its behavior.
send_gdb "continue\n"
gdb_expect {
    -re  "Continuing\\..*Breakpoint \[0-9\]+, marker1 \\(\\) at .*$srcfile:4\[38\].*4\[38\]\[\t \]+.*$gdb_prompt $" {
	pass "run until breakpoint at marker1"
    }
    -re  "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker1 \\(\\) at .*$srcfile:4\[38\].*4\[38\]\[\t \]+.*$gdb_prompt $" {
	xfail "run until breakpoint at marker1"
    }
    -re "$gdb_prompt $" {
	fail "run until breakpoint at marker1"
    }
    timeout {
	fail "(timeout) run until breakpoint at marker1"
    }
}

# run until the breakpoint at marker2
# Same issues here as above.
setup_xfail hppa2.0w-*-* 11512CLLbs
send_gdb "continue\n"
gdb_expect {
    -re "Continuing\\..*Breakpoint \[0-9\]+, marker2 \\(a=43\\) at .*$srcfile:4\[49\].*4\[49\]\[\t \]+.*" {
	pass "run until breakpoint at marker2"
    }
    -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker2 \\(a=43\\) at .*$srcfile:4\[49\].*4\[49\]\[\t \]+.*" {
	xfail "run until breakpoint at marker2"
    }
    -re "$gdb_prompt $" {
	fail "run until breakpoint at marker2"
    }
    timeout {
	fail "(timeout) run until breakpoint at marker2"
    }
}
