aboutsummaryrefslogtreecommitdiff
path: root/gdb/dummy-frame.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2008-08-26 17:40:25 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2008-08-26 17:40:25 +0000
commita45ae3ed061717e5a1538b1ac402cad93f81cb55 (patch)
tree27192166c6239fdae09810dd0b92f692fc566264 /gdb/dummy-frame.c
parent879d1e6b4674bc8c09b64dafad9248fb782c8924 (diff)
downloadgdb-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.c61
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);
}