From 9d49bdc28ad672f6e23e9f33759f73968d6885ff Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 5 Feb 2009 17:28:21 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 10 ++++++++++ gdb/frame.c | 38 +------------------------------------- gdb/frame.h | 5 +++++ gdb/varobj.c | 39 +++++++++++++++++++++++---------------- 4 files changed, 39 insertions(+), 53 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 97f7044b4e..94adead737 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2009-02-05 Pedro Alves + + * 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 Thiago Jung Bauermann diff --git a/gdb/frame.c b/gdb/frame.c index 7f67d2e453..f0aefb5620 100644 --- a/gdb/frame.c +++ b/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(). */ diff --git a/gdb/frame.h b/gdb/frame.h index b25ab9cc05..224aec9a03 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -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). diff --git a/gdb/varobj.c b/gdb/varobj.c index 5b2ed9c377..2ec6d90f22 100644 --- a/gdb/varobj.c +++ b/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) -- 2.34.1