+2014-06-25 Markus Metzger <markus.t.metzger@intel.com>
+
+ * target.h (target_ops) <to_prepare_to_generate_core>
+ <to_done_generating_core>: New.
+ (target_prepare_to_generate_core, target_done_generating_core): New.
+ * target.c (target_prepare_to_generate_core)
+ (target_done_generating_core): New.
+ * target-delegates.c: Regenerate.
+ * gcore.c: (write_gcore_file): Rename to ...
+ (write_gcore_file_1): ...this.
+ (write_gcore_file): Call target_prepare_to_generate_core
+ and target_done_generating_core.
+
2014-06-25 Markus Metzger <markus.t.metzger@intel.com>
* fbsd-nat.c (fbsd_make_corefile_notes): Remove make_cleanup call.
return obfd;
}
-/* write_gcore_file -- helper for gcore_command (exported).
- Compose and write the corefile data to the core file. */
-
+/* write_gcore_file_1 -- do the actual work of write_gcore_file. */
-void
-write_gcore_file (bfd *obfd)
+static void
+write_gcore_file_1 (bfd *obfd)
{
struct cleanup *cleanup;
void *note_data = NULL;
do_cleanups (cleanup);
}
+/* write_gcore_file -- helper for gcore_command (exported).
+ Compose and write the corefile data to the core file. */
+
+void
+write_gcore_file (bfd *obfd)
+{
+ volatile struct gdb_exception except;
+
+ target_prepare_to_generate_core ();
+
+ TRY_CATCH (except, RETURN_MASK_ALL)
+ write_gcore_file_1 (obfd);
+
+ target_done_generating_core ();
+
+ if (except.reason < 0)
+ throw_exception (except);
+}
+
static void
do_bfd_delete_cleanup (void *arg)
{
return self->to_decr_pc_after_break (self, arg1);
}
+static void
+delegate_prepare_to_generate_core (struct target_ops *self)
+{
+ self = self->beneath;
+ self->to_prepare_to_generate_core (self);
+}
+
+static void
+tdefault_prepare_to_generate_core (struct target_ops *self)
+{
+}
+
+static void
+delegate_done_generating_core (struct target_ops *self)
+{
+ self = self->beneath;
+ self->to_done_generating_core (self);
+}
+
+static void
+tdefault_done_generating_core (struct target_ops *self)
+{
+}
+
static void
install_delegators (struct target_ops *ops)
{
ops->to_get_tailcall_unwinder = delegate_get_tailcall_unwinder;
if (ops->to_decr_pc_after_break == NULL)
ops->to_decr_pc_after_break = delegate_decr_pc_after_break;
+ if (ops->to_prepare_to_generate_core == NULL)
+ ops->to_prepare_to_generate_core = delegate_prepare_to_generate_core;
+ if (ops->to_done_generating_core == NULL)
+ ops->to_done_generating_core = delegate_done_generating_core;
}
static void
ops->to_get_unwinder = tdefault_get_unwinder;
ops->to_get_tailcall_unwinder = tdefault_get_tailcall_unwinder;
ops->to_decr_pc_after_break = default_target_decr_pc_after_break;
+ ops->to_prepare_to_generate_core = tdefault_prepare_to_generate_core;
+ ops->to_done_generating_core = tdefault_done_generating_core;
}
return current_target.to_decr_pc_after_break (¤t_target, gdbarch);
}
+/* See target.h. */
+
+void
+target_prepare_to_generate_core (void)
+{
+ current_target.to_prepare_to_generate_core (¤t_target);
+}
+
+/* See target.h. */
+
+void
+target_done_generating_core (void)
+{
+ current_target.to_done_generating_core (¤t_target);
+}
+
static void
debug_to_files_info (struct target_ops *target)
{
struct gdbarch *gdbarch)
TARGET_DEFAULT_FUNC (default_target_decr_pc_after_break);
+ /* Prepare to generate a core file. */
+ void (*to_prepare_to_generate_core) (struct target_ops *)
+ TARGET_DEFAULT_IGNORE ();
+
+ /* Cleanup after generating a core file. */
+ void (*to_done_generating_core) (struct target_ops *)
+ TARGET_DEFAULT_IGNORE ();
+
int to_magic;
/* Need sub-structure for target machine related rather than comm related?
*/
/* See to_decr_pc_after_break. */
extern CORE_ADDR target_decr_pc_after_break (struct gdbarch *gdbarch);
+/* See to_prepare_to_generate_core. */
+extern void target_prepare_to_generate_core (void);
+
+/* See to_done_generating_core. */
+extern void target_done_generating_core (void);
+
#endif /* !defined (TARGET_H) */