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

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}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

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
