#   Copyright (C) 1997, 1998, 2007, 2008, 2009 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/>.  */

if $tracelevel then {
	strace $tracelevel
	}

set prms_id 0
set bug_id 0

if { [skip_hp_tests] } then { continue }

if { ![istarget "hppa*-*-hpux11.*"] } {
    verbose "HPUX h/w watch test ignored for non-hppa or pre-HP/UX-10.30 targets."
    return 0
}

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

# build the first test case
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested hwwatchbus.exp
     return -1
}

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

# Start with a fresh gdb

gdb_exit
remote_exec build "rm -f ${binfile}.bak"
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}


# We ought to be able to set a hardware watchpoint, step, and
# get a SIGBUS or SIGSEGV signal reported.
#
if ![runto_main] then {
  fail "can't run to main"
  return 0
}

send_gdb "watch bogus_p\n"
gdb_expect {
  -re "Hardware watchpoint \[0-9\]*: bogus_p.*$gdb_prompt $"\
          {pass "set h/w watchpoint"}
  -re "$gdb_prompt $"\
          {fail "set h/w watchpoint"}
  timeout {fail "(timeout) set h/w watchpoint"}
}

send_gdb "step\n"
gdb_expect {
  -re "Program received signal (SIGBUS|SIGSEGV), (Bus error|Segmentation fault).* in main .*${srcfile}:8.*$gdb_prompt $"\
          {pass "see real signal when h/w watchpoint set"}
  -re "$gdb_prompt $"\
          {fail "see real signal when h/w watchpoint set"}
  timeout {fail "(timeout) see real signal when h/w watchpoint set"}
}

remote_exec build "mv ${binfile} ${binfile}.bak"
return 0
