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

load_lib "java.exp"

standard_testfile .java
if  { [compile_java_from_source $srcdir/$subdir/$srcfile $binfile "-g"] != "" } {
    untested "Couldn't compile ${srcdir}/$subdir/${srcfile}"
    return -1
}

# Start with a fresh gdb.

clean_restart $testfile

set line [gdb_get_line_number "break here" $testfile.java]
if ![runto "$testfile.java:$line"] then {
    perror "couldn't run to jnpe.main"
    continue
} 

# See whether we have the needed unwinder hooks.
set ok 1
gdb_test_multiple "print _Unwind_DebugHook" "check for unwinder hook in java" {
    -re "= .*_Unwind_DebugHook.*\r\n$gdb_prompt $" {
	pass "check for unwinder hook in java"
    }
    -re "No symbol .* in current context.?\r\n$gdb_prompt $" {
	# Pass the test so we don't get bogus fails in the results.
	setup_xfail *-*-*
	fail "check for unwinder hook in java"
	set ok 0
    }
}
if {!$ok} {
    unsupported "jnpe.exp could not find _Unwind_DebugHook"
    return -1
}

gdb_test "handle SIGSEGV nostop noprint" \
  "SIGSEGV.*fault" \
  "disable SIGSEGV for next-over-NPE"

# The line where we stop differs according to gcj; just check that we
# did not already execute the catch point.  This is done in a somewhat
# funny way due to other gcj debuginfo oddities that don't
# meaningfully affect the user's experience.

gdb_test "next" \
  ".*" \
  "next over NPE"

set line [gdb_get_line_number "stop point"]
gdb_breakpoint $line
gdb_test "continue" "Continuing.\[\r\n\]*success\[\r\n\]*Breakpoint .*:$line\[\r\n\]*.*// stop point\[\r\n\]*" \
  "continue to success for next-over-NPE"
