This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
Re: Failures in store.exp caused by regcache
On Wed, Jan 08, 2003 at 02:10:44PM -0500, Andrew Cagney wrote:
> >(Or rather, by the value code's interaction with the regcache)
> >
> >Andrew, this is more your area; I'd like your advice before I dig any
> >further. Here's what's going wrong. Consider the command sequence:
> >"up; print u; set u = s_1; print u".
> > - u has class LOC_REGISTER
> > - The register's home is memory
> > - read_var_value therefore returns an lval_memory
> > - the value of the register is in the register unwind cache at this point
> > - we modify the memory backing the store
> > - we have no way to tell that we've just modified the value of a saved
> > register on the stack
> > - the second print returns the cached value
> >
> >So, what do we do?
>
> Flush the frame cache.
Ugg. Well, if we have to, then we have to. I suppose we do.
We obviously want to preserve things like the selected frame, however.
Andrew, should I do this the way I do for "set backtrace-below-main",
and should there be a general function for that? I.E.:
void
do_flush_frames_sfunc (char *args, int from_tty, struct cmd_list_element *c)
{
int saved_level;
struct frame_info *cur_frame;
if (! target_has_stack)
return;
saved_level = frame_relative_level (get_selected_frame ());
flush_cached_frames ();
cur_frame = find_relative_frame (get_current_frame (), &saved_level);
select_frame (cur_frame);
/* If we were below main and backtrace-below-main was turned off,
SAVED_LEVEL will be non-zero. CUR_FRAME will point to main.
Accept this but print the new frame. */
if (saved_level != 0)
print_stack_frame (get_selected_frame (), -1, 0);
}
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer