mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-03 21:34:46 +08:00
* frame.c (has_stack_frames): Make public.
(get_prev_frame): Don't allow a NULL this_frame anymore. * frame.h (has_stack_frames): Declare. * varobj.c (find_frame_addr_in_frame_chain): Don't ever pass NULL to get_prev_frame, instead start at get_current_frame. (varobj_create): Check has_stack_frames before getting any frame; eliminate one usage of deprecated_safe_get_selected_frame.
This commit is contained in:
@ -1,3 +1,13 @@
|
||||
2009-02-05 Pedro Alves <pedro@codesourcery.com>
|
||||
|
||||
* frame.c (has_stack_frames): Make public.
|
||||
(get_prev_frame): Don't allow a NULL this_frame anymore.
|
||||
* frame.h (has_stack_frames): Declare.
|
||||
* varobj.c (find_frame_addr_in_frame_chain): Don't ever pass NULL
|
||||
to get_prev_frame, instead start at get_current_frame.
|
||||
(varobj_create): Check has_stack_frames before getting any frame;
|
||||
eliminate one usage of deprecated_safe_get_selected_frame.
|
||||
|
||||
2009-02-05 Tom Tromey <tromey@redhat.com>
|
||||
Thiago Jung Bauermann <bauerman@br.ibm.com>
|
||||
|
||||
|
38
gdb/frame.c
38
gdb/frame.c
@ -997,7 +997,7 @@ get_current_frame (void)
|
||||
|
||||
static struct frame_info *selected_frame;
|
||||
|
||||
static int
|
||||
int
|
||||
has_stack_frames (void)
|
||||
{
|
||||
if (!target_has_registers || !target_has_stack || !target_has_memory)
|
||||
@ -1458,42 +1458,6 @@ get_prev_frame (struct frame_info *this_frame)
|
||||
{
|
||||
struct frame_info *prev_frame;
|
||||
|
||||
/* Return the inner-most frame, when the caller passes in NULL. */
|
||||
/* NOTE: cagney/2002-11-09: Not sure how this would happen. The
|
||||
caller should have previously obtained a valid frame using
|
||||
get_selected_frame() and then called this code - only possibility
|
||||
I can think of is code behaving badly.
|
||||
|
||||
NOTE: cagney/2003-01-10: Talk about code behaving badly. Check
|
||||
block_innermost_frame(). It does the sequence: frame = NULL;
|
||||
while (1) { frame = get_prev_frame (frame); .... }. Ulgh! Why
|
||||
it couldn't be written better, I don't know.
|
||||
|
||||
NOTE: cagney/2003-01-11: I suspect what is happening in
|
||||
block_innermost_frame() is, when the target has no state
|
||||
(registers, memory, ...), it is still calling this function. The
|
||||
assumption being that this function will return NULL indicating
|
||||
that a frame isn't possible, rather than checking that the target
|
||||
has state and then calling get_current_frame() and
|
||||
get_prev_frame(). This is a guess mind. */
|
||||
if (this_frame == NULL)
|
||||
{
|
||||
/* NOTE: cagney/2002-11-09: There was a code segment here that
|
||||
would error out when CURRENT_FRAME was NULL. The comment
|
||||
that went with it made the claim ...
|
||||
|
||||
``This screws value_of_variable, which just wants a nice
|
||||
clean NULL return from block_innermost_frame if there are no
|
||||
frames. I don't think I've ever seen this message happen
|
||||
otherwise. And returning NULL here is a perfectly legitimate
|
||||
thing to do.''
|
||||
|
||||
Per the above, this code shouldn't even be called with a NULL
|
||||
THIS_FRAME. */
|
||||
frame_debug_got_null_frame (this_frame, "this_frame NULL");
|
||||
return current_frame;
|
||||
}
|
||||
|
||||
/* There is always a frame. If this assertion fails, suspect that
|
||||
something should be calling get_selected_frame() or
|
||||
get_current_frame(). */
|
||||
|
@ -204,6 +204,11 @@ enum frame_type
|
||||
error. */
|
||||
extern struct frame_info *get_current_frame (void);
|
||||
|
||||
/* Does the current target interface have enough state to be able to
|
||||
query the current inferior for frame info, and is the inferior in a
|
||||
state where that is possible? */
|
||||
extern int has_stack_frames (void);
|
||||
|
||||
/* Invalidates the frame cache (this function should have been called
|
||||
invalidate_cached_frames).
|
||||
|
||||
|
39
gdb/varobj.c
39
gdb/varobj.c
@ -431,14 +431,15 @@ find_frame_addr_in_frame_chain (CORE_ADDR frame_addr)
|
||||
if (frame_addr == (CORE_ADDR) 0)
|
||||
return NULL;
|
||||
|
||||
while (1)
|
||||
for (frame = get_current_frame ();
|
||||
frame != NULL;
|
||||
frame = get_prev_frame (frame))
|
||||
{
|
||||
frame = get_prev_frame (frame);
|
||||
if (frame == NULL)
|
||||
return NULL;
|
||||
if (get_frame_base_address (frame) == frame_addr)
|
||||
return frame;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct varobj *
|
||||
@ -462,20 +463,26 @@ varobj_create (char *objname,
|
||||
struct value *value = NULL;
|
||||
int expr_len;
|
||||
|
||||
/* Parse and evaluate the expression, filling in as much
|
||||
of the variable's data as possible */
|
||||
/* Parse and evaluate the expression, filling in as much of the
|
||||
variable's data as possible. */
|
||||
|
||||
/* Allow creator to specify context of variable */
|
||||
if ((type == USE_CURRENT_FRAME) || (type == USE_SELECTED_FRAME))
|
||||
fi = deprecated_safe_get_selected_frame ();
|
||||
if (has_stack_frames ())
|
||||
{
|
||||
/* Allow creator to specify context of variable */
|
||||
if ((type == USE_CURRENT_FRAME) || (type == USE_SELECTED_FRAME))
|
||||
fi = get_selected_frame (NULL);
|
||||
else
|
||||
/* FIXME: cagney/2002-11-23: This code should be doing a
|
||||
lookup using the frame ID and not just the frame's
|
||||
``address''. This, of course, means an interface
|
||||
change. However, with out that interface change ISAs,
|
||||
such as the ia64 with its two stacks, won't work.
|
||||
Similar goes for the case where there is a frameless
|
||||
function. */
|
||||
fi = find_frame_addr_in_frame_chain (frame);
|
||||
}
|
||||
else
|
||||
/* FIXME: cagney/2002-11-23: This code should be doing a
|
||||
lookup using the frame ID and not just the frame's
|
||||
``address''. This, of course, means an interface change.
|
||||
However, with out that interface change ISAs, such as the
|
||||
ia64 with its two stacks, won't work. Similar goes for the
|
||||
case where there is a frameless function. */
|
||||
fi = find_frame_addr_in_frame_chain (frame);
|
||||
fi = NULL;
|
||||
|
||||
/* frame = -2 means always use selected frame */
|
||||
if (type == USE_SELECTED_FRAME)
|
||||
|
Reference in New Issue
Block a user