From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28153 invoked by alias); 24 Jun 2014 08:51:40 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 28143 invoked by uid 89); 24 Jun 2014 08:51:39 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.8 required=5.0 tests=AWL,BAYES_00,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mga01.intel.com Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 24 Jun 2014 08:51:37 +0000 Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga101.fm.intel.com with ESMTP; 24 Jun 2014 01:51:33 -0700 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga001.fm.intel.com with ESMTP; 24 Jun 2014 01:51:13 -0700 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id s5O8pDtt005695; Tue, 24 Jun 2014 09:51:13 +0100 Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id s5O8pDEI025578; Tue, 24 Jun 2014 10:51:13 +0200 Received: (from mmetzger@localhost) by ulvlx001.iul.intel.com with œ id s5O8pC8S025573; Tue, 24 Jun 2014 10:51:12 +0200 From: Markus Metzger To: palves@redhat.com Cc: gdb-patches@sourceware.org Subject: [PATCH v2 2/3] gcore, target: allow target to prepare/cleanup for/after core file generation Date: Tue, 24 Jun 2014 08:51:00 -0000 Message-Id: <1403599872-25299-2-git-send-email-markus.t.metzger@intel.com> In-Reply-To: <1403599872-25299-1-git-send-email-markus.t.metzger@intel.com> References: <1403599872-25299-1-git-send-email-markus.t.metzger@intel.com> X-IsSubscribed: yes X-SW-Source: 2014-06/txt/msg00836.txt.bz2 Add new target functions to_prepare_to_generate_core and to_done_generating_core that are called before and after generating a core file, respectively. This allows targets to prepare for core file generation and to clean up afterwards. 2014-06-24 Markus Metzger * target.h (target_ops) : 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. --- gdb/gcore.c | 27 ++++++++++++++++++++++----- gdb/target-delegates.c | 30 ++++++++++++++++++++++++++++++ gdb/target.c | 16 ++++++++++++++++ gdb/target.h | 14 ++++++++++++++ 4 files changed, 82 insertions(+), 5 deletions(-) diff --git a/gdb/gcore.c b/gdb/gcore.c index 7a4ded7..44acbe3 100644 --- a/gdb/gcore.c +++ b/gdb/gcore.c @@ -61,12 +61,10 @@ create_gcore_bfd (const char *filename) 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; @@ -111,6 +109,25 @@ write_gcore_file (bfd *obfd) 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) { diff --git a/gdb/target-delegates.c b/gdb/target-delegates.c index 4eefae8..eaab916 100644 --- a/gdb/target-delegates.c +++ b/gdb/target-delegates.c @@ -1625,6 +1625,30 @@ delegate_decr_pc_after_break (struct target_ops *self, struct gdbarch *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) { if (ops->to_post_attach == NULL) @@ -1897,6 +1921,10 @@ 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 @@ -2037,4 +2065,6 @@ install_dummy_methods (struct target_ops *ops) 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; } diff --git a/gdb/target.c b/gdb/target.c index 075425d..f384ed0 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -3606,6 +3606,22 @@ target_decr_pc_after_break (struct gdbarch *gdbarch) 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) { diff --git a/gdb/target.h b/gdb/target.h index e563f2f..96d5cb1 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -1109,6 +1109,14 @@ struct target_ops 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? */ @@ -2261,4 +2269,10 @@ extern CORE_ADDR forward_target_decr_pc_after_break (struct target_ops *ops, /* 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) */ -- 1.8.3.1