[Patch 1/2] Fix aftermath of 'infrun.c support for MIPS hardware watchpoints.'

David Daney
2009-04-20T18:31:35Z

[-- Attachment #1: Type: text/plain, Size: 1495 bytes --]

Pedro Alves wrote:
> Thanks for the update.
>
> On Thursday 16 April 2009 18:08:07, David Daney wrote:
>>>> Reported instruction location of the watchpoint trigger is one
>>>> instruction later and one line later.
>>> Why is that?
>> I was mistaken, it is earlier, not later. With hardware watch points,
>> $pc points to the faulting instruction, with software watch points $pc
>> points to the following instruction. In a couple of tests, this results
>> in the reported line number being different than the expected value.
>
> I'm missing something and am still confused. PC points at the
> faulting instruction when the target reports the watchpoint hit to
> infrun --- . That step-over-watchpoint dance that patch 1/2 took care of comes
> into play. That should move the inferior to the following instruction, evaluate
> the watchpoint expression, notice the value changed, and report to the
> user. Why does the PC still point at the faulting instruction?
>

This patch had a small problem:

http://sourceware.org/ml/gdb-patches/2009-04/msg00245.html

I was calling registers_changed() to clear the register cache, but then
immediately calling read_pc() which caused it to be reloaded. After the
single step to move past the watchpoint, the old cached register values
were used instead of the current values.

The fix: Move the registers_changed() call after read_pc().

Tested on x86_64-unknown-linux-gnu and mips64-unknown-linux-gnu with no
regressions.

OK to commit?

[-- Attachment #2: infrun.patch --]
[-- Type: text/plain, Size: 799 bytes --]

2009-04-20 David Daney <ddaney@caviumnetworks.com>

* infrun.c (handle_inferior_event): Move registers_changed call down.

Index: infrun.c
===================================================================
RCS file: /cvs/src/src/gdb/infrun.c,v
retrieving revision 1.368
diff -u -p -r1.368 infrun.c
--- infrun.c 14 Apr 2009 00:59:47 -0000 1.368
+++ infrun.c 20 Apr 2009 18:14:35 -0000
@@ -2842,9 +2842,9 @@ targets should add new threads to the th

if (!HAVE_STEPPABLE_WATCHPOINT)
remove_breakpoints ();
- registers_changed ();
/* Single step */
hw_step = maybe_software_singlestep (current_gdbarch, read_pc ());
+ registers_changed ();
target_resume (ecs->ptid, hw_step, TARGET_SIGNAL_0);
waiton_ptid = ecs->ptid;
if (HAVE_STEPPABLE_WATCHPOINT)