From patchwork Tue Oct 28 13:50:13 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: 3439 Received: (qmail 12167 invoked by alias); 28 Oct 2014 13:45:23 -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 12117 invoked by uid 89); 28 Oct 2014 13:45:23 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.9 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; Tue, 28 Oct 2014 13:45:21 +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 s9SDjIp5018209 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 28 Oct 2014 13:45:19 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s9SDjHrq022847 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 28 Oct 2014 13:45:18 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s9SCv6hP024504 for ; Tue, 28 Oct 2014 12:57:06 GMT Received: from localhost.localdomain (/10.175.175.133) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 28 Oct 2014 06:45:16 -0700 From: "Jose E. Marchesi" To: gdb-patches@sourceware.org Subject: [PATCH V3 4/9] New gdbarch functions: dtrace_parse_probe_argument, dtrace_probe_is_enabled, dtrace_enable_probe, dtrace_disable_probe. Date: Tue, 28 Oct 2014 14:50:13 +0100 Message-Id: <1414504218-31204-5-git-send-email-jose.marchesi@oracle.com> In-Reply-To: <1414504218-31204-1-git-send-email-jose.marchesi@oracle.com> References: <1414504218-31204-1-git-send-email-jose.marchesi@oracle.com> X-IsSubscribed: yes This patch adds several gdbarch functions (along with the corresponding predicates): `dtrace_parse_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/ChangeLog: 2014-10-28 Jose E. Marchesi * gdbarch.sh (dtrace_parse_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/gdbarch.c b/gdb/gdbarch.c index 2984358..cf41342 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -298,6 +298,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_parse_probe_argument_ftype *dtrace_parse_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; @@ -612,6 +616,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_parse_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 */ @@ -818,6 +826,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_parse_probe_argument_p() = %d\n", + gdbarch_dtrace_parse_probe_argument_p (gdbarch)); + fprintf_unfiltered (file, + "gdbarch_dump: dtrace_parse_probe_argument = <%s>\n", + host_address_to_string (gdbarch->dtrace_parse_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, @@ -4081,6 +4113,102 @@ set_gdbarch_stap_parse_special_token (struct gdbarch *gdbarch, } int +gdbarch_dtrace_parse_probe_argument_p (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + return gdbarch->dtrace_parse_probe_argument != NULL; +} + +void +gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, struct parser_state *pstate, int narg) +{ + gdb_assert (gdbarch != NULL); + gdb_assert (gdbarch->dtrace_parse_probe_argument != NULL); + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_dtrace_parse_probe_argument called\n"); + gdbarch->dtrace_parse_probe_argument (gdbarch, pstate, narg); +} + +void +set_gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, + gdbarch_dtrace_parse_probe_argument_ftype dtrace_parse_probe_argument) +{ + gdbarch->dtrace_parse_probe_argument = dtrace_parse_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 f5330c2..3617553 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; struct mem_range; @@ -1183,6 +1184,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_parse_probe_argument_p (struct gdbarch *gdbarch); + +typedef void (gdbarch_dtrace_parse_probe_argument_ftype) (struct gdbarch *gdbarch, struct parser_state *pstate, int narg); +extern void gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, struct parser_state *pstate, int narg); +extern void set_gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, gdbarch_dtrace_parse_probe_argument_ftype *dtrace_parse_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 5442799..63ec8a1 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -945,6 +945,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_parse_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. @@ -1153,6 +1168,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; struct mem_range;