# Copyright 2004, 2007, 2008, 2009, 2010 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/>.

# Author: Paul N. Hilfinger (Hilfinger@gnat.com)

# Test that GDB cleans up properly after errors that result when a 
# breakpoint is reset. 

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

# IDT/SIM apparently doesn't have enough file descriptors to allow the
# problem checked by this test to occur.
if [istarget "mips-idt-*"] {
    return 0;
}

set testfile "chng-syms"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DVARIABLE=var1}] != "" } {
    untested chng-syms.exp
    return -1
}

set oldtimeout $timeout
set timeout 10
verbose "Timeout is now 10 seconds" 2

proc expect_to_stop_here { ident } {
    global gdb_prompt
    global decimal

    # the "at foo.c:36" output we get with -g.
    # the "in func" output we get without -g.
    gdb_expect {
	-re "Breakpoint \[0-9\]*, stop_here .*$gdb_prompt $" { 
	    return 1
	}
	-re "$gdb_prompt $" { 
	    fail "running to stop_here $ident"
	    return 0
	}
	timeout { 
	    fail "running to stop_here $ident (timeout)"
	    return 0
	}
    }
    return 1
}

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

gdb_test "break stop_here if (var1 == 42)" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "setting conditional breakpoint on function"
gdb_run_cmd

expect_to_stop_here "first time"
    
gdb_continue_to_end "breakpoint first time through"

# Now we recompile the executable, but without a variable named "var1", first
# waiting to insure that even on fast machines, the file modification times
# are distinct. This will force GDB to reload the file on the 
# next "run" command, causing an error when GDB tries to tries to reset 
# the breakpoint.

sleep 2
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DVARIABLE=var2}] != "" } {

# Complication: Since GDB generally holds an open file descriptor on the 
# executable at this point, there are some systems in which the 
# re-compilation will fail. In such cases, we'll consider the test 
# (vacuously) passed providing that re-running it succeeds as before.

    gdb_run_cmd
    expect_to_stop_here "after re-compile fails"
    gdb_continue_to_end "after re-compile fails"

} else {

    gdb_run_cmd
    gdb_expect {
	-re ".*Program exited normally.*$gdb_prompt $" {
	    pass "running with invalidated bpt condition after executable changes" 
	}
	-re ".*Breakpoint .*,( 0x.* in)? (\[^ \]*)exit .*$gdb_prompt $" {
	    pass "running with invalidated bpt condition after executable changes" 
	}
	-re "$gdb_prompt $" { 
	    fail "running with invalidated bpt condition after executable changes" 
	}
	timeout {
	    fail "(timeout) running with invalidated bpt condition after executable changes" 
	}
    }

}

set timeout $oldtimeout
verbose "Timeout is now $timeout seconds" 2
return 0
