summaryrefslogtreecommitdiff
path: root/gdb/frame.c
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@suse.de>2007-06-12 15:21:27 +0000
committerAndreas Schwab <schwab@suse.de>2007-06-12 15:21:27 +0000
commitae4e6e4eaa6d988db4e6ecb37a25bf8cf1e33306 (patch)
tree1f370e2ab46d44e9ae887b7dc64412edbdb6b31f /gdb/frame.c
parent4330356dffab209a837d8904d43f145b4ff4ffed (diff)
downloadgdb-ae4e6e4eaa6d988db4e6ecb37a25bf8cf1e33306.tar.gz
* frame-unwind.h (frame_dealloc_cache_ftype): Define.
(struct frame_unwind): Add dealloc_cache. * frame.c (reinit_frame_cache): Call dealloc_cache on all caches. * libunwind-frame.h (libunwind_frame_dealloc_cache): Declare. * libunwind-frame.c (libunwind_frame_dealloc_cache): Define. (libunwind_frame_unwind): Set dealloc_cache. * ia64-tdep.c (ia64_libunwind_frame_unwind): Set dealloc_cache.
Diffstat (limited to 'gdb/frame.c')
-rw-r--r--gdb/frame.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/gdb/frame.c b/gdb/frame.c
index 63654625f25..42a44d42219 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -1077,6 +1077,17 @@ frame_observer_target_changed (struct target_ops *target)
void
reinit_frame_cache (void)
{
+ struct frame_info *fi;
+
+ /* Tear down all frame caches. */
+ for (fi = current_frame; fi != NULL; fi = fi->prev)
+ {
+ if (fi->prologue_cache && fi->unwind->dealloc_cache)
+ fi->unwind->dealloc_cache (fi, fi->prologue_cache);
+ if (fi->base_cache && fi->base->unwind->dealloc_cache)
+ fi->base->unwind->dealloc_cache (fi, fi->base_cache);
+ }
+
/* Since we can't really be sure what the first object allocated was */
obstack_free (&frame_cache_obstack, 0);
obstack_init (&frame_cache_obstack);