aboutsummaryrefslogtreecommitdiff
path: root/gdb/frame.c
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@linux-m68k.org>2007-06-12 15:21:27 +0000
committerAndreas Schwab <schwab@linux-m68k.org>2007-06-12 15:21:27 +0000
commit272dfcfd78cd900157ff2e4c8c8ed95645dae4f6 (patch)
tree13d19819273e00972d49fd4e14f1bf10157b82b2 /gdb/frame.c
parent4339e69e64f47a31e706ba9c1e7c00945c1620ff (diff)
downloadgdb-272dfcfd78cd900157ff2e4c8c8ed95645dae4f6.zip
gdb-272dfcfd78cd900157ff2e4c8c8ed95645dae4f6.tar.gz
gdb-272dfcfd78cd900157ff2e4c8c8ed95645dae4f6.tar.bz2
* 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 6365462..42a44d4 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);