* frame-unwind.h (frame_dealloc_cache_ftype): Define.
authorAndreas Schwab <schwab@linux-m68k.org>
Tue, 12 Jun 2007 15:21:27 +0000 (15:21 +0000)
committerAndreas Schwab <schwab@linux-m68k.org>
Tue, 12 Jun 2007 15:21:27 +0000 (15:21 +0000)
(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.

gdb/ChangeLog
gdb/frame-unwind.h
gdb/frame.c
gdb/ia64-tdep.c
gdb/libunwind-frame.c
gdb/libunwind-frame.h

index d35b3abe492ce6ca4437c8aa6c5305b0139f4d9c..cd4322bfad5858a3c6863926ae4a417d125657e8 100644 (file)
@@ -1,3 +1,14 @@
+2007-06-12  Andreas Schwab  <schwab@suse.de>
+
+       * 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.
+
 2007-06-12  Ulrich Weigand  <uweigand@de.ibm.com>
            Markus Deuling  <deuling@de.ibm.com>
 
index e1ac8717c7817cb02803e21392ade800246f2c1e..87c8161e6686af7beb686d61814046b12f0f13c6 100644 (file)
@@ -125,6 +125,10 @@ typedef void (frame_prev_register_ftype) (struct frame_info *next_frame,
 typedef CORE_ADDR (frame_prev_pc_ftype) (struct frame_info *next_frame,
                                         void **this_prologue_cache);
 
+/* Deallocate extra memory associated with the frame cache if any.  */
+
+typedef void (frame_dealloc_cache_ftype) (struct frame_info *self,
+                                         void *this_cache);
 
 struct frame_unwind
 {
@@ -138,6 +142,7 @@ struct frame_unwind
   const struct frame_data *unwind_data;
   frame_sniffer_ftype *sniffer;
   frame_prev_pc_ftype *prev_pc;
+  frame_dealloc_cache_ftype *dealloc_cache;
 };
 
 /* Register a frame unwinder, _prepending_ it to the front of the
index 63654625f25a8080cb64a9ef20dcc278d279da7b..42a44d42219be8c32cfc408edc85af595f7bffac 100644 (file)
@@ -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);
index 526926ce232de3c44cea4b76e54a1807a4101681..a462f6493fbe2b36f31c9366a42ca990343700af 100644 (file)
@@ -2778,7 +2778,11 @@ static const struct frame_unwind ia64_libunwind_frame_unwind =
 {
   NORMAL_FRAME,
   ia64_libunwind_frame_this_id,
-  ia64_libunwind_frame_prev_register
+  ia64_libunwind_frame_prev_register,
+  NULL,
+  NULL,
+  NULL,
+  libunwind_frame_dealloc_cache
 };
 
 static const struct frame_unwind *
index b22e6d71846a57ff04f92482ed0e0bc487137729..ebf7eb21521859a3a789b3c4a88e78dafda0c660 100644 (file)
@@ -65,6 +65,7 @@ struct libunwind_frame_cache
   CORE_ADDR base;
   CORE_ADDR func_addr;
   unw_cursor_t cursor;
+  unw_addr_space_t as;
 };
 
 /* We need to qualify the function names with a platform-specific prefix to match 
@@ -187,11 +188,20 @@ libunwind_frame_cache (struct frame_info *next_frame, void **this_cache)
     }
 
   cache->base = (CORE_ADDR)fp;
+  cache->as = as;
 
   *this_cache = cache;
   return cache;
 }
 
+void
+libunwind_frame_dealloc_cache (struct frame_info *self, void *this_cache)
+{
+  struct libunwind_frame_cache *cache = this_cache;
+  if (cache->as)
+    unw_destroy_addr_space_p (cache->as);
+}
+
 unw_word_t
 libunwind_find_dyn_list (unw_addr_space_t as, unw_dyn_info_t *di, void *arg)
 {
@@ -202,7 +212,11 @@ static const struct frame_unwind libunwind_frame_unwind =
 {
   NORMAL_FRAME,
   libunwind_frame_this_id,
-  libunwind_frame_prev_register
+  libunwind_frame_prev_register,
+  NULL,
+  NULL,
+  NULL,
+  libunwind_frame_dealloc_cache
 };
 
 /* Verify if there is sufficient libunwind information for the frame to use
index 499055ac98da97ac71f6d61a665cad5dc401f2b2..03a1395427ea4f2ca22cf3a39c8ba6a9d6114f36 100644 (file)
@@ -53,6 +53,7 @@ void libunwind_frame_prev_register (struct frame_info *next_frame, void **this_c
                                    int regnum, int *optimizedp,
                                    enum lval_type *lvalp, CORE_ADDR *addrp,
                                    int *realnump, gdb_byte *valuep);
+void libunwind_frame_dealloc_cache (struct frame_info *self, void *cache);
 CORE_ADDR libunwind_frame_base_address (struct frame_info *next_frame, void **this_cache);
 
 int libunwind_is_initialized (void);