diff options
-rw-r--r-- | gdb/ChangeLog | 12 | ||||
-rw-r--r-- | gdb/compile/compile-object-run.c | 4 | ||||
-rw-r--r-- | gdb/dummy-frame.c | 9 | ||||
-rw-r--r-- | gdb/dummy-frame.h | 5 |
4 files changed, 23 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d452fc2..e77a9a9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. diff --git a/gdb/compile/compile-object-run.c b/gdb/compile/compile-object-run.c index 6738aad..422693b 100644 --- a/gdb/compile/compile-object-run.c +++ b/gdb/compile/compile-object-run.c @@ -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 diff --git a/gdb/dummy-frame.c b/gdb/dummy-frame.c index f193289..6c4fb4c 100644 --- a/gdb/dummy-frame.c +++ b/gdb/dummy-frame.c @@ -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); diff --git a/gdb/dummy-frame.h b/gdb/dummy-frame.h index ffd3b0a..c156b81 100644 --- a/gdb/dummy-frame.h +++ b/gdb/dummy-frame.h @@ -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 |