Patchwork Use software watchpoints if hardware watchpoints are not available when testing gdb.base/watch-bitfields.exp.

login
register
mail settings
Submitter Luis Machado
Date April 13, 2015, 6:35 p.m.
Message ID <1428950158-15872-1-git-send-email-lgustavo@codesourcery.com>
Download mbox | patch
Permalink /patch/6189/
State New
Headers show

Comments

Luis Machado - April 13, 2015, 6:35 p.m.
There are targets GDB thinks support hardware watchpoints, but in reality they
don't.  Though it may seem that hardware watchpoint creation was successful,
the actual insertion of such watchpoint will fail when GDB moves the inferior.

(gdb) watch -location q.a^M
Hardware watchpoint 2: -location q.a^M
(gdb) PASS: gdb.base/watch-bitfields.exp: -location watch against bitfields: watch -location q.a
watch -location q.e^M
Hardware watchpoint 3: -location q.e^M
(gdb) PASS: gdb.base/watch-bitfields.exp: -location watch against bitfields: watch -location q.e
print q.a^M
$1 = 0^M
(gdb) PASS: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: print expression before
continue^M
Continuing.^M
Warning:^M
Could not insert hardware watchpoint 2.^M
Could not insert hardware watchpoint 3.^M
Could not insert hardware breakpoints:^M
You may have requested too many hardware breakpoints/watchpoints.^M
^M
(gdb) FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: continue

This leads to a number of FAILs:

FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: continue
FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: print expression after
FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 0->5: continue
FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 0->5: print expression after
FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 1->0: print expression before
FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 1->0: continue
FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 5->4: print expression before
FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 5->4: continue
FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 5->4: print expression after
FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: continue until exit
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 0->4: continue
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 0->4: print expression after
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 4->10: print expression before
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 4->10: continue
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 4->10: print expression after
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 10->3: print expression before
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 10->3: continue
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 10->3: print expression after
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 3->2: print expression before
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 3->2: continue
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 3->2: print expression after
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 2->1: print expression before
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 2->1: continue
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 2->1: print expression after
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 1->0: print expression before
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 1->0: continue
FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: continue until exit

We can avoid these errors/FAILs by checking the board data and switching to
software watchpoints if the board does not support hardware watchpoints.

Regression tested on x86-64-linux and aarch64-linux (QEMU).

Ok?

2015-04-13  Luis Machado  <lgustavo@codesourcery.com>

	gdb/testsuite/ChangeLog/
	* gdb.base/watch-bitfields.exp: Switch to software watchpoints if
	the target does not support hardware watchpoints.
---
 gdb/testsuite/gdb.base/watch-bitfields.exp | 5 +++++
 1 file changed, 5 insertions(+)
Yao Qi - April 14, 2015, 8:50 a.m.
Luis Machado <lgustavo@codesourcery.com> writes:

Hi Luis,

> +# Disable hardware watchpoints if the target does not support it.
> +if [target_info exists gdb,no_hardware_watchpoints] {
> +    gdb_test_no_output "set can-use-hw-watchpoints 0"
> +}
> +
>  test_watch_location
>  test_regular_watch

The fix looks right to me, but why don't we invoke test_watch_location
and test_regular_watch twice? if [target_info exists gdb,no_hardware_watchpoints]
is false, set can-use-hw-watchpoints 1, and run them.  Then,
"set can-use-hw-watchpoints 0" and run them again.  Similar to what we
are doing in gdb.base/watch-vfork.exp.  In this way, we can exercise
software watchpoint on targets have hardware watchpoints too.
Luis Machado - April 27, 2015, 3:41 p.m.
Ping?

On 04/13/2015 03:35 PM, Luis Machado wrote:
> There are targets GDB thinks support hardware watchpoints, but in reality they
> don't.  Though it may seem that hardware watchpoint creation was successful,
> the actual insertion of such watchpoint will fail when GDB moves the inferior.
>
> (gdb) watch -location q.a^M
> Hardware watchpoint 2: -location q.a^M
> (gdb) PASS: gdb.base/watch-bitfields.exp: -location watch against bitfields: watch -location q.a
> watch -location q.e^M
> Hardware watchpoint 3: -location q.e^M
> (gdb) PASS: gdb.base/watch-bitfields.exp: -location watch against bitfields: watch -location q.e
> print q.a^M
> $1 = 0^M
> (gdb) PASS: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: print expression before
> continue^M
> Continuing.^M
> Warning:^M
> Could not insert hardware watchpoint 2.^M
> Could not insert hardware watchpoint 3.^M
> Could not insert hardware breakpoints:^M
> You may have requested too many hardware breakpoints/watchpoints.^M
> ^M
> (gdb) FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: continue
>
> This leads to a number of FAILs:
>
> FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: continue
> FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: print expression after
> FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 0->5: continue
> FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 0->5: print expression after
> FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 1->0: print expression before
> FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 1->0: continue
> FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 5->4: print expression before
> FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 5->4: continue
> FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 5->4: print expression after
> FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: continue until exit
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 0->4: continue
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 0->4: print expression after
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 4->10: print expression before
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 4->10: continue
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 4->10: print expression after
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 10->3: print expression before
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 10->3: continue
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 10->3: print expression after
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 3->2: print expression before
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 3->2: continue
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 3->2: print expression after
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 2->1: print expression before
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 2->1: continue
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 2->1: print expression after
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 1->0: print expression before
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 1->0: continue
> FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: continue until exit
>
> We can avoid these errors/FAILs by checking the board data and switching to
> software watchpoints if the board does not support hardware watchpoints.
>
> Regression tested on x86-64-linux and aarch64-linux (QEMU).
>
> Ok?
>
> 2015-04-13  Luis Machado  <lgustavo@codesourcery.com>
>
> 	gdb/testsuite/ChangeLog/
> 	* gdb.base/watch-bitfields.exp: Switch to software watchpoints if
> 	the target does not support hardware watchpoints.
> ---
>   gdb/testsuite/gdb.base/watch-bitfields.exp | 5 +++++
>   1 file changed, 5 insertions(+)
>
> diff --git a/gdb/testsuite/gdb.base/watch-bitfields.exp b/gdb/testsuite/gdb.base/watch-bitfields.exp
> index 9d5293b..9f0192d 100644
> --- a/gdb/testsuite/gdb.base/watch-bitfields.exp
> +++ b/gdb/testsuite/gdb.base/watch-bitfields.exp
> @@ -77,5 +77,10 @@ proc test_regular_watch {} {
>       }
>   }
>
> +# Disable hardware watchpoints if the target does not support it.
> +if [target_info exists gdb,no_hardware_watchpoints] {
> +    gdb_test_no_output "set can-use-hw-watchpoints 0"
> +}
> +
>   test_watch_location
>   test_regular_watch
>
Yao Qi - April 28, 2015, 10:42 a.m.
Luis Machado <lgustavo@codesourcery.com> writes:

> 2015-04-13  Luis Machado  <lgustavo@codesourcery.com>
>
> 	gdb/testsuite/ChangeLog/
> 	* gdb.base/watch-bitfields.exp: Switch to software watchpoints if
> 	the target does not support hardware watchpoints.

The patch looks good to me.
Luis Machado - April 29, 2015, 3:24 p.m.
On 04/28/2015 07:42 AM, Yao Qi wrote:
> Luis Machado <lgustavo@codesourcery.com> writes:
>
>> 2015-04-13  Luis Machado  <lgustavo@codesourcery.com>
>>
>> 	gdb/testsuite/ChangeLog/
>> 	* gdb.base/watch-bitfields.exp: Switch to software watchpoints if
>> 	the target does not support hardware watchpoints.
>
> The patch looks good to me.
>

I've pushed this on too.

Thanks!
Luis

Patch

diff --git a/gdb/testsuite/gdb.base/watch-bitfields.exp b/gdb/testsuite/gdb.base/watch-bitfields.exp
index 9d5293b..9f0192d 100644
--- a/gdb/testsuite/gdb.base/watch-bitfields.exp
+++ b/gdb/testsuite/gdb.base/watch-bitfields.exp
@@ -77,5 +77,10 @@  proc test_regular_watch {} {
     }
 }
 
+# Disable hardware watchpoints if the target does not support it.
+if [target_info exists gdb,no_hardware_watchpoints] {
+    gdb_test_no_output "set can-use-hw-watchpoints 0"
+}
+
 test_watch_location
 test_regular_watch