From patchwork Fri Sep 26 09:48:20 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jose E. Marchesi" X-Patchwork-Id: 2987 Received: (qmail 9434 invoked by alias); 26 Sep 2014 09:43:44 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 9401 invoked by uid 89); 26 Sep 2014 09:43:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=AWL, BAYES_00, LIKELY_SPAM_BODY, RP_MATCHES_RCVD, SPF_PASS, UNPARSEABLE_RELAY autolearn=no version=3.3.2 X-HELO: userp1040.oracle.com Received: from userp1040.oracle.com (HELO userp1040.oracle.com) (156.151.31.81) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Fri, 26 Sep 2014 09:43:40 +0000 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s8Q9hcVD025503 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 26 Sep 2014 09:43:39 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s8Q9hbD6028521 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 26 Sep 2014 09:43:38 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s8Q9hbxa028517 for ; Fri, 26 Sep 2014 09:43:37 GMT Received: from localhost.localdomain (/10.175.173.100) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 26 Sep 2014 02:43:37 -0700 From: "Jose E. Marchesi" To: gdb-patches@sourceware.org Subject: [PATCH 4/9] New gdbarch functions: dtrace_probe_argument, dtrace_probe_is_enabled, dtrace_enable_probe, dtrace_disable_probe. Date: Fri, 26 Sep 2014 11:48:20 +0200 Message-Id: <1411724905-31234-5-git-send-email-jose.marchesi@oracle.com> In-Reply-To: <1411724905-31234-1-git-send-email-jose.marchesi@oracle.com> References: <1411724905-31234-1-git-send-email-jose.marchesi@oracle.com> X-IsSubscribed: yes This patch adds several gdbarch functions (along with the corresponding predicates): `dtrace_probe_argument', `dtrace_probe_is_enabled', `dtrace_enable_probe' and `dtrace_disable_probe'. These functions will be implemented by target-specific code, and called from the DTrace probes implementation in order to calculate the value of probe arguments, and manipulate is-enabled probes. gdb: 2014-09-26 Jose E. Marchesi * gdbarch.sh (dtrace_probe_argument): New. (dtrace_probe_is_enabled): Likewise. (dtrace_enable_probe): Likewise. (dtrace_disable_probe): Likewise. * gdbarch.c: Regenerate. * gdbarch.h: Regenerate. --- gdb/ChangeLog | 9 ++++ gdb/gdbarch.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/gdbarch.h | 36 ++++++++++++++++ gdb/gdbarch.sh | 16 +++++++ 4 files changed, 189 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2f94e05..7041cfb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ 2014-09-26 Jose E. Marchesi + * gdbarch.sh (dtrace_probe_argument): New. + (dtrace_probe_is_enabled): Likewise. + (dtrace_enable_probe): Likewise. + (dtrace_disable_probe): Likewise. + * gdbarch.c: Regenerate. + * gdbarch.h: Regenerate. + +2014-09-26 Jose E. Marchesi + * stap-probe.c (stap_probe_ops): Add NULLs in the static stap_probe_ops for `enable_probe' and `disable_probe'. diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index b0ee79d..3d494a4 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -299,6 +299,10 @@ struct gdbarch const char * stap_gdb_register_suffix; gdbarch_stap_is_single_operand_ftype *stap_is_single_operand; gdbarch_stap_parse_special_token_ftype *stap_parse_special_token; + gdbarch_dtrace_probe_argument_ftype *dtrace_probe_argument; + gdbarch_dtrace_probe_is_enabled_ftype *dtrace_probe_is_enabled; + gdbarch_dtrace_enable_probe_ftype *dtrace_enable_probe; + gdbarch_dtrace_disable_probe_ftype *dtrace_disable_probe; int has_global_solist; int has_global_breakpoints; gdbarch_has_shared_address_space_ftype *has_shared_address_space; @@ -611,6 +615,10 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of stap_gdb_register_suffix, invalid_p == 0 */ /* Skip verify of stap_is_single_operand, has predicate. */ /* Skip verify of stap_parse_special_token, has predicate. */ + /* Skip verify of dtrace_probe_argument, has predicate. */ + /* Skip verify of dtrace_probe_is_enabled, has predicate. */ + /* Skip verify of dtrace_enable_probe, has predicate. */ + /* Skip verify of dtrace_disable_probe, has predicate. */ /* Skip verify of has_global_solist, invalid_p == 0 */ /* Skip verify of has_global_breakpoints, invalid_p == 0 */ /* Skip verify of has_shared_address_space, invalid_p == 0 */ @@ -819,6 +827,30 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) "gdbarch_dump: double_format = %s\n", pformat (gdbarch->double_format)); fprintf_unfiltered (file, + "gdbarch_dump: gdbarch_dtrace_disable_probe_p() = %d\n", + gdbarch_dtrace_disable_probe_p (gdbarch)); + fprintf_unfiltered (file, + "gdbarch_dump: dtrace_disable_probe = <%s>\n", + host_address_to_string (gdbarch->dtrace_disable_probe)); + fprintf_unfiltered (file, + "gdbarch_dump: gdbarch_dtrace_enable_probe_p() = %d\n", + gdbarch_dtrace_enable_probe_p (gdbarch)); + fprintf_unfiltered (file, + "gdbarch_dump: dtrace_enable_probe = <%s>\n", + host_address_to_string (gdbarch->dtrace_enable_probe)); + fprintf_unfiltered (file, + "gdbarch_dump: gdbarch_dtrace_probe_argument_p() = %d\n", + gdbarch_dtrace_probe_argument_p (gdbarch)); + fprintf_unfiltered (file, + "gdbarch_dump: dtrace_probe_argument = <%s>\n", + host_address_to_string (gdbarch->dtrace_probe_argument)); + fprintf_unfiltered (file, + "gdbarch_dump: gdbarch_dtrace_probe_is_enabled_p() = %d\n", + gdbarch_dtrace_probe_is_enabled_p (gdbarch)); + fprintf_unfiltered (file, + "gdbarch_dump: dtrace_probe_is_enabled = <%s>\n", + host_address_to_string (gdbarch->dtrace_probe_is_enabled)); + fprintf_unfiltered (file, "gdbarch_dump: gdbarch_dummy_id_p() = %d\n", gdbarch_dummy_id_p (gdbarch)); fprintf_unfiltered (file, @@ -4095,6 +4127,102 @@ set_gdbarch_stap_parse_special_token (struct gdbarch *gdbarch, } int +gdbarch_dtrace_probe_argument_p (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + return gdbarch->dtrace_probe_argument != NULL; +} + +void +gdbarch_dtrace_probe_argument (struct gdbarch *gdbarch, struct parser_state *pstate, int narg) +{ + gdb_assert (gdbarch != NULL); + gdb_assert (gdbarch->dtrace_probe_argument != NULL); + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_dtrace_probe_argument called\n"); + gdbarch->dtrace_probe_argument (gdbarch, pstate, narg); +} + +void +set_gdbarch_dtrace_probe_argument (struct gdbarch *gdbarch, + gdbarch_dtrace_probe_argument_ftype dtrace_probe_argument) +{ + gdbarch->dtrace_probe_argument = dtrace_probe_argument; +} + +int +gdbarch_dtrace_probe_is_enabled_p (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + return gdbarch->dtrace_probe_is_enabled != NULL; +} + +int +gdbarch_dtrace_probe_is_enabled (struct gdbarch *gdbarch, CORE_ADDR addr) +{ + gdb_assert (gdbarch != NULL); + gdb_assert (gdbarch->dtrace_probe_is_enabled != NULL); + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_dtrace_probe_is_enabled called\n"); + return gdbarch->dtrace_probe_is_enabled (gdbarch, addr); +} + +void +set_gdbarch_dtrace_probe_is_enabled (struct gdbarch *gdbarch, + gdbarch_dtrace_probe_is_enabled_ftype dtrace_probe_is_enabled) +{ + gdbarch->dtrace_probe_is_enabled = dtrace_probe_is_enabled; +} + +int +gdbarch_dtrace_enable_probe_p (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + return gdbarch->dtrace_enable_probe != NULL; +} + +void +gdbarch_dtrace_enable_probe (struct gdbarch *gdbarch, CORE_ADDR addr) +{ + gdb_assert (gdbarch != NULL); + gdb_assert (gdbarch->dtrace_enable_probe != NULL); + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_dtrace_enable_probe called\n"); + gdbarch->dtrace_enable_probe (gdbarch, addr); +} + +void +set_gdbarch_dtrace_enable_probe (struct gdbarch *gdbarch, + gdbarch_dtrace_enable_probe_ftype dtrace_enable_probe) +{ + gdbarch->dtrace_enable_probe = dtrace_enable_probe; +} + +int +gdbarch_dtrace_disable_probe_p (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + return gdbarch->dtrace_disable_probe != NULL; +} + +void +gdbarch_dtrace_disable_probe (struct gdbarch *gdbarch, CORE_ADDR addr) +{ + gdb_assert (gdbarch != NULL); + gdb_assert (gdbarch->dtrace_disable_probe != NULL); + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_dtrace_disable_probe called\n"); + gdbarch->dtrace_disable_probe (gdbarch, addr); +} + +void +set_gdbarch_dtrace_disable_probe (struct gdbarch *gdbarch, + gdbarch_dtrace_disable_probe_ftype dtrace_disable_probe) +{ + gdbarch->dtrace_disable_probe = dtrace_disable_probe; +} + +int gdbarch_has_global_solist (struct gdbarch *gdbarch) { gdb_assert (gdbarch != NULL); diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 0303b2e..89f3c83 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -57,6 +57,7 @@ struct syscall; struct agent_expr; struct axs_value; struct stap_parse_info; +struct parser_state; struct ravenscar_arch_ops; struct elf_internal_linux_prpsinfo; @@ -1179,6 +1180,41 @@ typedef int (gdbarch_stap_parse_special_token_ftype) (struct gdbarch *gdbarch, s extern int gdbarch_stap_parse_special_token (struct gdbarch *gdbarch, struct stap_parse_info *p); extern void set_gdbarch_stap_parse_special_token (struct gdbarch *gdbarch, gdbarch_stap_parse_special_token_ftype *stap_parse_special_token); +/* DTrace related functions. + The expression to compute the NARTGth+1 argument to a DTrace USDT probe. + NARG must be >= 0. */ + +extern int gdbarch_dtrace_probe_argument_p (struct gdbarch *gdbarch); + +typedef void (gdbarch_dtrace_probe_argument_ftype) (struct gdbarch *gdbarch, struct parser_state *pstate, int narg); +extern void gdbarch_dtrace_probe_argument (struct gdbarch *gdbarch, struct parser_state *pstate, int narg); +extern void set_gdbarch_dtrace_probe_argument (struct gdbarch *gdbarch, gdbarch_dtrace_probe_argument_ftype *dtrace_probe_argument); + +/* True if the given ADDR does not contain the instruction sequence + corresponding to a disabled DTrace is-enabled probe. */ + +extern int gdbarch_dtrace_probe_is_enabled_p (struct gdbarch *gdbarch); + +typedef int (gdbarch_dtrace_probe_is_enabled_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr); +extern int gdbarch_dtrace_probe_is_enabled (struct gdbarch *gdbarch, CORE_ADDR addr); +extern void set_gdbarch_dtrace_probe_is_enabled (struct gdbarch *gdbarch, gdbarch_dtrace_probe_is_enabled_ftype *dtrace_probe_is_enabled); + +/* Enable a DTrace is-enabled probe at ADDR. */ + +extern int gdbarch_dtrace_enable_probe_p (struct gdbarch *gdbarch); + +typedef void (gdbarch_dtrace_enable_probe_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr); +extern void gdbarch_dtrace_enable_probe (struct gdbarch *gdbarch, CORE_ADDR addr); +extern void set_gdbarch_dtrace_enable_probe (struct gdbarch *gdbarch, gdbarch_dtrace_enable_probe_ftype *dtrace_enable_probe); + +/* Disable a DTrace is-enabled probe at ADDR. */ + +extern int gdbarch_dtrace_disable_probe_p (struct gdbarch *gdbarch); + +typedef void (gdbarch_dtrace_disable_probe_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr); +extern void gdbarch_dtrace_disable_probe (struct gdbarch *gdbarch, CORE_ADDR addr); +extern void set_gdbarch_dtrace_disable_probe (struct gdbarch *gdbarch, gdbarch_dtrace_disable_probe_ftype *dtrace_disable_probe); + /* True if the list of shared libraries is one and only for all processes, as opposed to a list of shared libraries per inferior. This usually means that all processes, although may or may not share diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index 2a8bca8..0458134 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -944,6 +944,21 @@ M:int:stap_is_single_operand:const char *s:s # parser), and should advance the buffer pointer (p->arg). M:int:stap_parse_special_token:struct stap_parse_info *p:p +# DTrace related functions. + +# The expression to compute the NARTGth+1 argument to a DTrace USDT probe. +# NARG must be >= 0. +M:void:dtrace_probe_argument:struct parser_state *pstate, int narg:pstate, narg + +# True if the given ADDR does not contain the instruction sequence +# corresponding to a disabled DTrace is-enabled probe. +M:int:dtrace_probe_is_enabled:CORE_ADDR addr:addr + +# Enable a DTrace is-enabled probe at ADDR. +M:void:dtrace_enable_probe:CORE_ADDR addr:addr + +# Disable a DTrace is-enabled probe at ADDR. +M:void:dtrace_disable_probe:CORE_ADDR addr:addr # True if the list of shared libraries is one and only for all # processes, as opposed to a list of shared libraries per inferior. @@ -1146,6 +1161,7 @@ struct syscall; struct agent_expr; struct axs_value; struct stap_parse_info; +struct parser_state; struct ravenscar_arch_ops; struct elf_internal_linux_prpsinfo;