Call dummy_frame_dtor_ftype also from remove_dummy_frame
authorJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 13 May 2015 18:47:32 +0000 (20:47 +0200)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 13 May 2015 18:47:32 +0000 (20:47 +0200)
There was now a leak-like bug that if dummy_frame "disappeared" by
remove_dummy_frame then its destructor was not called.  For example in the case
of 'compile code' dummy frames the injected objfile would never get freed after
some inferior longjmp out of the injected code.

gdb/ChangeLog
2015-05-13  Jan Kratochvil  <jan.kratochvil@redhat.com>

* compile/compile-object-run.c (do_module_cleanup): Add parameter
registers_valid.
(compile_object_run): Update do_module_cleanup caller.
* dummy-frame.c: Include infcall.h.
(struct dummy_frame): Update dtor comment.
(remove_dummy_frame): Call dtor.
(pop_dummy_frame): Update dtor caller.
* dummy-frame.h (dummy_frame_dtor_ftype): Add parameter
registers_valid.

gdb/ChangeLog
gdb/compile/compile-object-run.c
gdb/dummy-frame.c
gdb/dummy-frame.h

index d452fc2ff81dcdeb957f9ce1884d6f706ea4b853..e77a9a9705056d06af634117c9ab27bdabfba318 100644 (file)
@@ -1,3 +1,15 @@
+2015-05-13  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * compile/compile-object-run.c (do_module_cleanup): Add parameter
+       registers_valid.
+       (compile_object_run): Update do_module_cleanup caller.
+       * dummy-frame.c: Include infcall.h.
+       (struct dummy_frame): Update dtor comment.
+       (remove_dummy_frame): Call dtor.
+       (pop_dummy_frame): Update dtor caller.
+       * dummy-frame.h (dummy_frame_dtor_ftype): Add parameter
+       registers_valid.
+
 2015-05-13  Joel Brobecker  <brobecker@adacore.com>
 
        GDB 7.9.1 released.
index 6738aad9b1e72876d77094ccc74f44e760a81a45..422693b6167dfd59be973cb059021f0f636ebf4d 100644 (file)
@@ -45,7 +45,7 @@ struct do_module_cleanup
 
 static dummy_frame_dtor_ftype do_module_cleanup;
 static void
-do_module_cleanup (void *arg)
+do_module_cleanup (void *arg, int registers_valid)
 {
   struct do_module_cleanup *data = arg;
   struct objfile *objfile;
@@ -129,7 +129,7 @@ compile_object_run (struct compile_module *module)
        data->executedp = NULL;
       gdb_assert (!(dtor_found && executed));
       if (!dtor_found && !executed)
-       do_module_cleanup (data);
+       do_module_cleanup (data, 0);
       throw_exception (ex);
     }
   END_CATCH
index f193289aeda78d213243f1cb750999be9c91a337..6c4fb4c6b47f02d9f71c2c5060102ebced927495 100644 (file)
@@ -28,6 +28,7 @@
 #include "gdbcmd.h"
 #include "observer.h"
 #include "gdbthread.h"
+#include "infcall.h"
 
 struct dummy_frame_id
 {
@@ -62,8 +63,7 @@ struct dummy_frame
   /* The caller's state prior to the call.  */
   struct infcall_suspend_state *caller_state;
 
-  /* If non-NULL, a destructor that is run when this dummy frame is
-     popped.  */
+  /* If non-NULL, a destructor that is run when this dummy frame is freed.  */
   dummy_frame_dtor_ftype *dtor;
 
   /* Arbitrary data that is passed to DTOR.  */
@@ -96,6 +96,9 @@ remove_dummy_frame (struct dummy_frame **dummy_ptr)
 {
   struct dummy_frame *dummy = *dummy_ptr;
 
+  if (dummy->dtor != NULL)
+    dummy->dtor (dummy->dtor_data, 0);
+
   *dummy_ptr = dummy->next;
   discard_infcall_suspend_state (dummy->caller_state);
   xfree (dummy);
@@ -136,7 +139,7 @@ pop_dummy_frame (struct dummy_frame **dummy_ptr)
   gdb_assert (ptid_equal (dummy->id.ptid, inferior_ptid));
 
   if (dummy->dtor != NULL)
-    dummy->dtor (dummy->dtor_data);
+    dummy->dtor (dummy->dtor_data, 1);
 
   restore_infcall_suspend_state (dummy->caller_state);
 
index ffd3b0ad02595fe85fab44ae80da50c79ba70dd5..c156b810245a2fd22f4234857d74955e91c00bff 100644 (file)
@@ -54,8 +54,9 @@ extern void dummy_frame_discard (struct frame_id dummy_id, ptid_t ptid);
 
 extern const struct frame_unwind dummy_frame_unwind;
 
-/* Destructor for dummy_frame.  DATA is supplied by registrant.  */
-typedef void (dummy_frame_dtor_ftype) (void *data);
+/* Destructor for dummy_frame.  DATA is supplied by registrant.
+   REGISTERS_VALID is 1 for dummy_frame_pop, 0 for dummy_frame_discard.  */
+typedef void (dummy_frame_dtor_ftype) (void *data, int registers_valid);
 
 /* Call DTOR with DTOR_DATA when DUMMY_ID frame of thread PTID gets discarded.
    Dummy frame with DUMMY_ID must exist.  There must be no other call of