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.
It isn't that bad. In fact (per previous discussion), the code needed
to avoid flushing the caches would be far worse than what we have now.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);
}
what should: