This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] breakpoint.c, scanning epilogue if frame chain is invalid


On Wed, Sep 03, 2003 at 01:28:43PM +0200, Eli Zaretskii wrote:
> > Date: Wed, 3 Sep 2003 11:38:15 +0200
> > From: Corinna Vinschen <vinschen@redhat.com>
> > 
> > -      if (within_current_scope && fr == get_current_frame ()
> > +      if ((!within_current_scope || fr == get_current_frame ())
> >            && gdbarch_in_function_epilogue_p (current_gdbarch, read_pc ()))
> >  	return WP_VALUE_NOT_CHANGED;
> >        if (within_current_scope)
> > [...]
> > The above patch is basically this:  If we couldn't find the watchpoint
> > frame, at least try to find out if PC is just in an epilogue.  If so,
> > it's probably the cause of failing to find the watchpoint frame so just
> > leave the watchpoint alone until we're on firmer ground again.
> 
> I'm not sure I understand why did you change
> 
>     within_current_scope && fr == get_current_frame ()
> 
> into
> 
>     (!within_current_scope || fr == get_current_frame ())
> 
> It doesn't seem to follow from the verbal description of the decision
> you'd like the code to make.  Perhaps I'm missing something, so could
> you please elaborate how the verbal description translates into the
> code?

The lines before this code are

  fr = frame_find_by_id (b->watchpoint_frame);
  within_current_scope = (fr != NULL);

So "within_current_scope" actually means "Couldn't find watchpoint frame".
Being out of scope is one possible cause, being in an epilogue another.

  if (!within_current_scope ||     <==     fr == NULL
      fr == get_current_frame ())  <==  or fr != NULL and
                                           current frame == watchpoint frame
  then call gdbarch_in_function_epilogue_p(current pc).

So after the change gdbarch_in_function_epilogue_p() is also called if the
watchpoint frame couldn't be found because the frame chain is temporarily
broken.  Since this is very likely occuring in an epilogue, it's pretty
naturally to call gdbarch_in_function_epilogue_p().

Corinna

-- 
Corinna Vinschen
Cygwin Developer
Red Hat, Inc.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]