Simplify gdb.threads/wp-replication.exp on counting HW watchpoints
Nowadays, test gdb.threads/wp-replication.exp uses a while loop to repeatedly insert HW watchpoint, resume and check no error message coming out, in order to count HW watchpoints There are some drawbacks in this way, - the loop could be endless. I think this is use to making trouble to S/390, since we had such comment # Some targets (like S/390) behave as though supporting # unlimited hardware watchpoints. In this case we just take a # safe exit out of the loop. I hit this today too because a GDB internal error is triggered on "continue" in the loop, and $done is 0 invariantly, so the loop can't end. - the code counting hardware watchpoint is too complicated. We can use "set breakpoint always-inserted on" to get the result of inserting HW watchpoint without resuming the inferior. In this way, watch_count_done and empty_cycle in c file is no longer needed. In this patch, I change to use "set breakpoint always-inserted on" trick, and only iterate $NR_THREADS times, to count the HW watchpoint. In this way, the loop can't be endless, and GDB doesn't need to resume the inferior. gdb/testsuite: 2015-10-30 Yao Qi <yao.qi@linaro.org> * gdb.threads/wp-replication.c (watch_count_done): Remove. (empty_cycle): Remove. (main): Don't call empty_cycle. Don't use watch_count_done. * gdb.threads/wp-replication.exp: Don't set breakpoint on empty_cycle. Rewrite the code counting HW watchpoints.
This commit is contained in:
parent
10268a4c0d
commit
4081c0f122
|
@ -1,3 +1,11 @@
|
||||||
|
2015-10-30 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
|
* gdb.threads/wp-replication.c (watch_count_done): Remove.
|
||||||
|
(empty_cycle): Remove.
|
||||||
|
(main): Don't call empty_cycle. Don't use watch_count_done.
|
||||||
|
* gdb.threads/wp-replication.exp: Don't set breakpoint on
|
||||||
|
empty_cycle. Rewrite the code counting HW watchpoints.
|
||||||
|
|
||||||
2015-10-30 Marcin Kościelnicki <koriakin@0x04.net>
|
2015-10-30 Marcin Kościelnicki <koriakin@0x04.net>
|
||||||
|
|
||||||
* gdb.reverse/fstatat-reverse.c: New test.
|
* gdb.reverse/fstatat-reverse.c: New test.
|
||||||
|
|
|
@ -47,11 +47,6 @@ int test_ready = 0;
|
||||||
watchpoint triggers. */
|
watchpoint triggers. */
|
||||||
int can_terminate = 0;
|
int can_terminate = 0;
|
||||||
|
|
||||||
/* Used to push the program out of the waiting loop after the
|
|
||||||
testcase is done counting the number of hardware watchpoints
|
|
||||||
available for our target. */
|
|
||||||
int watch_count_done = 0;
|
|
||||||
|
|
||||||
/* Number of watchpoints GDB is capable of using (this is provided
|
/* Number of watchpoints GDB is capable of using (this is provided
|
||||||
by GDB during the test run). */
|
by GDB during the test run). */
|
||||||
int hw_watch_count = 0;
|
int hw_watch_count = 0;
|
||||||
|
@ -60,14 +55,6 @@ int hw_watch_count = 0;
|
||||||
static int watched_data[NR_THREADS];
|
static int watched_data[NR_THREADS];
|
||||||
pthread_mutex_t data_mutex;
|
pthread_mutex_t data_mutex;
|
||||||
|
|
||||||
/* Wait function to keep threads busy while the testcase does
|
|
||||||
what it needs to do. */
|
|
||||||
void
|
|
||||||
empty_cycle (void)
|
|
||||||
{
|
|
||||||
usleep (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main ()
|
main ()
|
||||||
{
|
{
|
||||||
|
@ -75,17 +62,6 @@ main ()
|
||||||
pthread_t threads[NR_THREADS];
|
pthread_t threads[NR_THREADS];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Something to ensure that the breakpoint used to run to main
|
|
||||||
is only hit once. */
|
|
||||||
empty_cycle ();
|
|
||||||
|
|
||||||
while (watch_count_done == 0)
|
|
||||||
{
|
|
||||||
/* GDB will modify the value of "watch_count_done" at runtime and we
|
|
||||||
will get past this point. */
|
|
||||||
empty_cycle ();
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_init (&data_mutex, NULL);
|
pthread_mutex_init (&data_mutex, NULL);
|
||||||
|
|
||||||
for (i = 0; i < NR_THREADS; i++)
|
for (i = 0; i < NR_THREADS; i++)
|
||||||
|
|
|
@ -47,55 +47,40 @@ if ![runto_main] then {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# First, break at empty_cycle.
|
|
||||||
gdb_test "break empty_cycle" \
|
|
||||||
"Breakpoint 2 at .*: file .*${srcfile}, line .*" \
|
|
||||||
"Breakpoint on empty_cycle"
|
|
||||||
|
|
||||||
# Set some default values.
|
# Set some default values.
|
||||||
set hwatch_count 0
|
set hwatch_count 0
|
||||||
set done 0
|
set count 0
|
||||||
|
|
||||||
# Count the number of hardware watchpoints available on
|
# Count the number of hardware watchpoints available on
|
||||||
# this target.
|
# this target.
|
||||||
while { $done == 0 } {
|
|
||||||
|
|
||||||
gdb_test "continue" \
|
# So we get an immediate warning/error if the target doesn't support a
|
||||||
".*Breakpoint 2, empty_cycle \\(\\) at .*${srcfile}.*" \
|
# hardware watchpoint or run out of hardware resource.
|
||||||
"Continue to empty_cycle to insert watchpoint $hwatch_count"
|
gdb_test_no_output "set breakpoint always-inserted on"
|
||||||
|
|
||||||
|
while { $count < $NR_THREADS } {
|
||||||
# Some targets do resource counting as we insert watchpoints.
|
# Some targets do resource counting as we insert watchpoints.
|
||||||
# Such targets won't cause a watchpoint insertion failure, but
|
# Such targets won't cause a watchpoint insertion failure, but
|
||||||
# will switch to software watchpoints silently. We check for
|
# will switch to software watchpoints silently. We check for
|
||||||
# both cases here.
|
# both cases here.
|
||||||
gdb_test_multiple "watch watched_data\[$hwatch_count\]" \
|
gdb_test_multiple "watch watched_data\[$hwatch_count\]" \
|
||||||
"watch watched_data\[$hwatch_count\]" {
|
"watch watched_data\[$hwatch_count\]" {
|
||||||
|
-re ".*Could not insert hardware watchpoint.*$gdb_prompt $" {
|
||||||
|
# End the loop.
|
||||||
|
set count $NR_THREADS
|
||||||
|
}
|
||||||
-re "Hardware watchpoint .*$gdb_prompt $" {
|
-re "Hardware watchpoint .*$gdb_prompt $" {
|
||||||
|
incr hwatch_count
|
||||||
}
|
}
|
||||||
-re "Watchpoint .*$gdb_prompt $" {
|
-re "Watchpoint .*$gdb_prompt $" {
|
||||||
set done 1
|
# End the loop.
|
||||||
break
|
set count $NR_THREADS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
incr count
|
||||||
|
}
|
||||||
|
|
||||||
gdb_test_multiple "continue" "watchpoint created successfully" {
|
gdb_test_no_output "set breakpoint always-inserted off"
|
||||||
-re ".*Breakpoint 2, empty_cycle \\(\\).*$gdb_prompt $" {
|
|
||||||
incr hwatch_count
|
|
||||||
|
|
||||||
# Some targets (like S/390) behave as though supporting
|
|
||||||
# unlimited hardware watchpoints. In this case we just take a
|
|
||||||
# safe exit out of the loop.
|
|
||||||
if { $hwatch_count == $NR_THREADS } {
|
|
||||||
set done 1
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-re ".*Could not insert hardware watchpoint.*$gdb_prompt $" {
|
|
||||||
set done 1
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Target cannot insert hardware watchpoints. It should have reported
|
# Target cannot insert hardware watchpoints. It should have reported
|
||||||
# (through board settings) that it did not support them in the first place.
|
# (through board settings) that it did not support them in the first place.
|
||||||
|
@ -114,11 +99,6 @@ gdb_test_no_output "set var hw_watch_count=${hwatch_count}" \
|
||||||
# the target supports. Use that to do further testing.
|
# the target supports. Use that to do further testing.
|
||||||
delete_breakpoints
|
delete_breakpoints
|
||||||
|
|
||||||
# Break out of the empty_cycle loop by changing the
|
|
||||||
# controlling variable.
|
|
||||||
gdb_test_no_output "set var watch_count_done=1" \
|
|
||||||
"set var watch_count_done=1"
|
|
||||||
|
|
||||||
# Prepare to create all the threads.
|
# Prepare to create all the threads.
|
||||||
gdb_test "break thread_started" \
|
gdb_test "break thread_started" \
|
||||||
"Breakpoint \[0-9\]+ at .*: file .*${srcfile}, line .*" \
|
"Breakpoint \[0-9\]+ at .*: file .*${srcfile}, line .*" \
|
||||||
|
|
Loading…
Reference in New Issue