From 8464be768129e057bc92e27de51317b99717da8f Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Sat, 4 Sep 2010 15:30:09 +0000 Subject: [PATCH] * breakpoint.c (can_use_hardware_watchpoint): Handle the first value specially. testsuite/ * gdb.base/watchpoint.exp: Call test_inaccessible_watchpoint before disabling hardware watchpoints. (test_inaccessible_watchpoint): Check that hardware watchpoints are used. Test for watchpoints on a constant address. --- gdb/ChangeLog | 5 +++++ gdb/breakpoint.c | 10 ++++++---- gdb/testsuite/ChangeLog | 7 +++++++ gdb/testsuite/gdb.base/watchpoint.exp | 27 ++++++++++++++++++++++++--- 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c6be2cd0a47..f569efad71c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2010-09-04 Daniel Jacobowitz + + * breakpoint.c (can_use_hardware_watchpoint): Handle the first + value specially. + 2010-09-04 Jan Kratochvil Code cleanup - split print_stop_reason. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 10aee953ca1..1d3f7fc2dc7 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -8327,10 +8327,12 @@ can_use_hardware_watchpoint (struct value *v) { if (VALUE_LVAL (v) == lval_memory) { - if (value_lazy (v)) - /* A lazy memory lvalue is one that GDB never needed to fetch; - we either just used its address (e.g., `a' in `a.b') or - we never needed it at all (e.g., `a' in `a,b'). */ + if (v != head && value_lazy (v)) + /* A lazy memory lvalue in the chain is one that GDB never + needed to fetch; we either just used its address (e.g., + `a' in `a.b') or we never needed it at all (e.g., `a' + in `a,b'). This doesn't apply to HEAD; if that is + lazy then it was not readable, but watch it anyway. */ ; else { diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index eea8703d8d5..50c1f402ebe 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-09-04 Daniel Jacobowitz + + * gdb.base/watchpoint.exp: Call test_inaccessible_watchpoint + before disabling hardware watchpoints. + (test_inaccessible_watchpoint): Check that hardware watchpoints + are used. Test for watchpoints on a constant address. + 2010-09-03 Jan Kratochvil * gdb.base/ui-redirect.exp: New file. diff --git a/gdb/testsuite/gdb.base/watchpoint.exp b/gdb/testsuite/gdb.base/watchpoint.exp index edc7ea012df..01c0c1c08ef 100644 --- a/gdb/testsuite/gdb.base/watchpoint.exp +++ b/gdb/testsuite/gdb.base/watchpoint.exp @@ -662,7 +662,28 @@ proc test_inaccessible_watchpoint {} { } } - gdb_test "watch *global_ptr" ".*atchpoint \[0-9\]+: \\*global_ptr" + # See whether a watchpoint on a normal variable is a hardware + # watchpoint or not. The watchpoints on NULL should be hardware + # iff this one is. + set watchpoint_msg "Watchpoint" + gdb_test_multiple "watch global_ptr" "watch global_ptr" { + -re "Watchpoint \[0-9\]+: global_ptr\r\n.*$gdb_prompt $" { + pass "watch global_ptr" + } + -re "Hardware watchpoint \[0-9\]+: global_ptr\r\n.*$gdb_prompt $" { + set watchpoint_msg "Hardware watchpoint" + pass "watch global_ptr" + } + } + delete_breakpoints + + # Make sure that we can watch a constant address, and correctly + # use a HW watchpoint if supported. + gdb_test "watch *(int *) 0" \ + "$watchpoint_msg \[0-9\]+: \\*\\(int \\*\\) 0" + delete_breakpoints + + gdb_test "watch *global_ptr" "$watchpoint_msg \[0-9\]+: \\*global_ptr" gdb_test "set \$global_ptr_breakpoint_number = \$bpnum" "" gdb_test "next" ".*global_ptr = buf.*" "global_ptr next" gdb_test_multiple "next" "next over ptr init" { @@ -771,6 +792,8 @@ if [initialize] then { test_complex_watchpoint } + test_inaccessible_watchpoint + # Verify that a user can force GDB to use "slow" watchpoints. # (This proves rather little on kernels that don't support # fast watchpoints, but still...) @@ -849,8 +872,6 @@ if [initialize] then { } } - test_inaccessible_watchpoint - # See above. if [istarget "mips-idt-*"] then { gdb_exit -- 2.30.2