diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2008-08-26 17:40:25 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2008-08-26 17:40:25 +0000 |
commit | a45ae3ed061717e5a1538b1ac402cad93f81cb55 (patch) | |
tree | 27192166c6239fdae09810dd0b92f692fc566264 /gdb/dummy-frame.c | |
parent | 879d1e6b4674bc8c09b64dafad9248fb782c8924 (diff) | |
download | gdb-a45ae3ed061717e5a1538b1ac402cad93f81cb55.zip gdb-a45ae3ed061717e5a1538b1ac402cad93f81cb55.tar.gz gdb-a45ae3ed061717e5a1538b1ac402cad93f81cb55.tar.bz2 |
* dummy-frame.h (dummy_frame_pop): Add prototype.
* dummy-frame.c: Include "observer.h".
(dummy_frame_push): Do not check for stale frames.
(dummy_frame_pop): New function.
(cleanup_dummy_frames): New function.
(_initialize_dummy_frame): Install it as inferior_created observer.
* frame.h (struct frame_id): Update comments.
(frame_id_inner): Remove prototype.
* frame.c (frame_id_inner): Make static. Add comments.
(frame_find_by_id): Update frame_id_inner safety net check to avoid
false positives for targets using non-contiguous stack ranges.
(get_prev_frame_1): Update frame_id_inner safety net check.
(frame_pop): Call dummy_frame_pop when popping a dummy frame.
* stack.c (return_command): Directly pop the selected frame.
* infrun.c (handle_inferior_event): Remove dead code.
* i386-tdep.c (i386_push_dummy_call): Update comment.
Diffstat (limited to 'gdb/dummy-frame.c')
-rw-r--r-- | gdb/dummy-frame.c | 61 |
1 files changed, 43 insertions, 18 deletions
diff --git a/gdb/dummy-frame.c b/gdb/dummy-frame.c index 4c044ef..a27de2e 100644 --- a/gdb/dummy-frame.c +++ b/gdb/dummy-frame.c @@ -30,6 +30,7 @@ #include "command.h" #include "gdbcmd.h" #include "gdb_string.h" +#include "observer.h" /* Dummy frame. This saves the processor state just prior to setting up the inferior function call. Older targets save the registers @@ -87,26 +88,8 @@ void dummy_frame_push (struct regcache *caller_regcache, const struct frame_id *dummy_id) { - struct gdbarch *gdbarch = get_regcache_arch (caller_regcache); struct dummy_frame *dummy_frame; - /* Check to see if there are stale dummy frames, perhaps left over - from when a longjump took us out of a function that was called by - the debugger. */ - dummy_frame = dummy_frame_stack; - while (dummy_frame) - /* FIXME: cagney/2004-08-02: Should just test IDs. */ - if (frame_id_inner (gdbarch, dummy_frame->id, (*dummy_id))) - /* Stale -- destroy! */ - { - dummy_frame_stack = dummy_frame->next; - regcache_xfree (dummy_frame->regcache); - xfree (dummy_frame); - dummy_frame = dummy_frame_stack; - } - else - dummy_frame = dummy_frame->next; - dummy_frame = XZALLOC (struct dummy_frame); dummy_frame->regcache = caller_regcache; dummy_frame->id = (*dummy_id); @@ -114,6 +97,47 @@ dummy_frame_push (struct regcache *caller_regcache, dummy_frame_stack = dummy_frame; } +/* Pop the dummy frame with ID dummy_id from the dummy-frame stack. */ + +void +dummy_frame_pop (struct frame_id dummy_id) +{ + struct dummy_frame **dummy_ptr; + + for (dummy_ptr = &dummy_frame_stack; + (*dummy_ptr) != NULL; + dummy_ptr = &(*dummy_ptr)->next) + { + struct dummy_frame *dummy = *dummy_ptr; + if (frame_id_eq (dummy->id, dummy_id)) + { + *dummy_ptr = dummy->next; + regcache_xfree (dummy->regcache); + xfree (dummy); + break; + } + } +} + +/* There may be stale dummy frames, perhaps left over from when a longjump took us + out of a function that was called by the debugger. Clean them up at least once + whenever we start a new inferior. */ + +static void +cleanup_dummy_frames (struct target_ops *target, int from_tty) +{ + struct dummy_frame *dummy, *next; + + for (dummy = dummy_frame_stack; dummy; dummy = next) + { + next = dummy->next; + regcache_xfree (dummy->regcache); + xfree (dummy); + } + + dummy_frame_stack = NULL; +} + /* Return the dummy frame cache, it contains both the ID, and a pointer to the regcache. */ struct dummy_frame_cache @@ -258,4 +282,5 @@ _initialize_dummy_frame (void) _("Print the contents of the internal dummy-frame stack."), &maintenanceprintlist); + observer_attach_inferior_created (cleanup_dummy_frames); } |