aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog12
-rw-r--r--gdb/compile/compile-object-run.c4
-rw-r--r--gdb/dummy-frame.c9
-rw-r--r--gdb/dummy-frame.h5
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