Handle memory write errors on gdb.base/break-always.exp
authorLuis Machado <lgustavo@codesourcery.com>
Wed, 29 Apr 2015 15:09:40 +0000 (12:09 -0300)
committerLuis Machado <lgustavo@codesourcery.com>
Wed, 29 Apr 2015 15:09:40 +0000 (12:09 -0300)
This is another case of the testcase not handling memory write errors that
happen on some targets (QEMU) when GDB attempts to modify an address that
should contain a breakpoint, for example.

The following patch handles this and prevents spurious failures from
happening. It also adds a foreach loop to avoid duplication of code
and hardcoded patterns.

gdb/testsuite/ChangeLog:

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

* gdb.base/break-always.exp: Abort testing if writing to memory
causes an error.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/break-always.exp

index 639dae7..3e2df8f 100644 (file)
@@ -1,3 +1,8 @@
+2015-04-29  Luis Machado  <lgustavo@codesourcery.com>
+
+       * gdb.base/break-always.exp: Abort testing if writing to memory
+       causes an error.
+
 2015-04-28  Doug Evans  <dje@google.com>
 
        * gdb.python/py-pp-maint.py: Move "replace" testing to ...
index 681be37..c45ce54 100644 (file)
@@ -69,19 +69,25 @@ gdb_test "p /x \$shadow = *(char *) $bp_address" \
 # and still leave the breakpoint insn planted.  Try twice with
 # different values, in case we happen to be writting exactly what was
 # there already.
-gdb_test "p /x *(char *) $bp_address = 0" \
-    " = 0x0" \
-    "write 0 to breakpoint's address"
-gdb_test "p /x *(char *) $bp_address" \
-    " = 0x0" \
-    "read back 0 from the breakpoint's address"
-
-gdb_test "p /x *(char *) $bp_address = 1" \
-    " = 0x1" \
-    "write 1 to breakpoint's address"
-gdb_test "p /x *(char *) $bp_address" \
-    " = 0x1" \
-    "read back 1 from the breakpoint's address"
+foreach test_value {0 1} {
+    set write_test "write $test_value to breakpoint's address"
+
+    gdb_test_multiple "p /x *(char *) $bp_address = $test_value" $write_test {
+       -re "Cannot access memory at address $hex.*$gdb_prompt $" {
+
+           # Some targets do not allow manually writing a breakpoint to a
+           # certain memory address, like QEMU.  In that case, just bail out.
+           unsupported "Cannot write to address $bp_address"
+           return -1
+       }
+       -re " = .*$gdb_prompt $" {
+           pass $write_test
+       }
+    }
+
+    set read_test "read back $test_value from the breakpoint's address"
+    gdb_test "p /x *(char *) $bp_address" " = 0x$test_value" $read_test
+}
 
 # Restore the original contents.
 gdb_test "p /x *(char *) $bp_address = \$shadow" "" \