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


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
