From patchwork Tue Feb 17 22:06:48 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keith Seitz X-Patchwork-Id: 5146 Received: (qmail 14356 invoked by alias); 17 Feb 2015 22:06:55 -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 14248 invoked by uid 89); 17 Feb 2015 22:06:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00, SPF_HELO_PASS, SPF_PASS, T_FILL_THIS_FORM_SHORT, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Tue, 17 Feb 2015 22:06:50 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1HM6nB2022646 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 17 Feb 2015 17:06:49 -0500 Received: from valrhona.uglyboxes.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1HM6mCO008744 for ; Tue, 17 Feb 2015 17:06:49 -0500 Subject: [PATCH v3 5/9] Explicit locations: introduce probe locations From: Keith Seitz To: gdb-patches@sourceware.org Date: Tue, 17 Feb 2015 14:06:48 -0800 Message-ID: <20150217220648.1312.61126.stgit@valrhona.uglyboxes.com> In-Reply-To: <20150217220619.1312.39861.stgit@valrhona.uglyboxes.com> References: <20150217220619.1312.39861.stgit@valrhona.uglyboxes.com> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-IsSubscribed: yes This patch adds support for probe locations and converts existing probe linespec locations to the new location type. gdb/ChangeLog: * break-catch-throw.c (re_set_exception_catchpoint): Convert linespec for stap probe to probe location. * breakpoint.c (create_longjmp_master_breakpoint): Likewise. (create_exception_master_breakpoint): Likewise. (break_command_1): Remove local variable `arg_cp'. Check location type to set appropriate breakpoint ops methods. (trace_command): Likewise. * linespec.c (event_location_to_sals): Assert on probe locations. * location.c (EL_PROBE): Add macro definition. (new_probe_location, get_probe_location): New functions. (copy_event_location): Handle probe locations. (delete_event_location): Likewise. (event_location_to_string): Likewise. (string_to_event_location): Likewise. (event_location_empty_p): Likewise. * location.h (enum event_location_type): Add PROBE_LOCATION. (new_probe_location, get_probe_location): Declare. * probe.c (parse_probes): Assert that LOCATION is a probe location. Convert linespec into probe location. --- gdb/break-catch-throw.c | 5 ++-- gdb/breakpoint.c | 18 +++++++-------- gdb/linespec.c | 5 ++++ gdb/location.c | 56 +++++++++++++++++++++++++++++++++++++++++++++-- gdb/location.h | 17 +++++++++++++- gdb/probe.c | 5 +++- 6 files changed, 88 insertions(+), 18 deletions(-) diff --git a/gdb/break-catch-throw.c b/gdb/break-catch-throw.c index 551f722..1803041 100644 --- a/gdb/break-catch-throw.c +++ b/gdb/break-catch-throw.c @@ -208,11 +208,10 @@ re_set_exception_catchpoint (struct breakpoint *self) struct cleanup *cleanup; enum exception_event_kind kind = classify_exception_breakpoint (self); struct event_location *location; - char *p; /* We first try to use the probe interface. */ - p = ASTRDUP (exception_functions[kind].probe); - location = new_linespec_location (&p); + location + = new_probe_location (exception_functions[kind].probe); cleanup = make_cleanup_delete_event_location (location); TRY_CATCH (e, RETURN_MASK_ERROR) { diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index ec0c6f8..29c55e7 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -3496,7 +3496,6 @@ create_longjmp_master_breakpoint (void) int i; struct probe *probe; struct gdbarch *gdbarch = get_objfile_arch (objfile); - char *p; for (i = 0; VEC_iterate (probe_p, @@ -3511,8 +3510,8 @@ create_longjmp_master_breakpoint (void) objfile), bp_longjmp_master, &internal_breakpoint_ops); - p = ASTRDUP ("-probe-stap libc:longjmp"); - b->location = new_linespec_location (&p); + b->location + = new_probe_location ("-probe-stap libc:longjmp"); b->enable_state = bp_disabled; } @@ -3674,15 +3673,14 @@ create_exception_master_breakpoint (void) ++i) { struct breakpoint *b; - char *p; b = create_internal_breakpoint (gdbarch, get_probe_address (probe, objfile), bp_exception_master, &internal_breakpoint_ops); - p = ASTRDUP ("-probe-stap libgcc:unwind"); - b->location = new_linespec_location (&p); + b->location + = new_probe_location ("-probe-stap libgcc:unwind"); b->enable_state = bp_disabled; } @@ -10262,7 +10260,6 @@ break_command_1 (char *arg, int flag, int from_tty) ? bp_hardware_breakpoint : bp_breakpoint); struct breakpoint_ops *ops; - const char *arg_cp = arg; struct event_location *location; struct cleanup *cleanup; @@ -10270,7 +10267,8 @@ break_command_1 (char *arg, int flag, int from_tty) cleanup = make_cleanup_delete_event_location (location); /* Matching breakpoints on probes. */ - if (arg_cp != NULL && probe_linespec_to_ops (&arg_cp) != NULL) + if (location != NULL + && event_location_type (location) == PROBE_LOCATION) ops = &bkpt_probe_breakpoint_ops; else ops = &bkpt_breakpoint_ops; @@ -15534,11 +15532,11 @@ trace_command (char *arg, int from_tty) struct breakpoint_ops *ops; struct event_location *location; struct cleanup *back_to; - const char *arg_cp = arg; location = string_to_event_location (&arg, current_language); back_to = make_cleanup_delete_event_location (location); - if (arg_cp != NULL && probe_linespec_to_ops (&arg_cp) != NULL) + if (location != NULL + && event_location_type (location) == PROBE_LOCATION) ops = &tracepoint_probe_breakpoint_ops; else ops = &tracepoint_breakpoint_ops; diff --git a/gdb/linespec.c b/gdb/linespec.c index 9c36d6c..5f63750 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -2473,6 +2473,11 @@ event_location_to_sals (linespec_parser *parser, get_address_location (location)); break; + case PROBE_LOCATION: + /* Probes are handled by their own decoders. */ + gdb_assert_not_reached ("attempt to decode probe location"); + break; + default: gdb_assert_not_reached ("unhandled event location type"); } diff --git a/gdb/location.c b/gdb/location.c index c1f4e19..6059679 100644 --- a/gdb/location.c +++ b/gdb/location.c @@ -45,6 +45,7 @@ struct event_location probes. */ char *addr_string; #define EL_LINESPEC(PTR) ((PTR)->u.addr_string) +#define EL_PROBE(PTR) ((PTR)->u.addr_string) /* An address in the inferior. */ CORE_ADDR address; @@ -121,6 +122,29 @@ get_address_location (const struct event_location *location) /* See description in location.h. */ struct event_location * +new_probe_location (const char *probe) +{ + struct event_location *location; + + location = XCNEW (struct event_location); + EL_TYPE (location) = PROBE_LOCATION; + if (probe != NULL) + EL_PROBE (location) = xstrdup (probe); + return location; +} + +/* See description in location.h. */ + +const char * +get_probe_location (const struct event_location *location) +{ + gdb_assert (EL_TYPE (location) == PROBE_LOCATION); + return EL_PROBE (location); +} + +/* See description in location.h. */ + +struct event_location * copy_event_location (const struct event_location *src) { struct event_location *dst; @@ -141,6 +165,11 @@ copy_event_location (const struct event_location *src) EL_ADDRESS (dst) = EL_ADDRESS (src); break; + case PROBE_LOCATION: + if (EL_PROBE (src) != NULL) + EL_PROBE (dst) = xstrdup (EL_PROBE (src)); + break; + default: gdb_assert_not_reached ("unknown event location type"); } @@ -185,6 +214,10 @@ delete_event_location (struct event_location *location) /* Nothing to do. */ break; + case PROBE_LOCATION: + xfree (EL_PROBE (location)); + break; + default: gdb_assert_not_reached ("unknown event location type"); } @@ -216,6 +249,10 @@ event_location_to_string_const (const struct event_location *location) core_addr_to_string (EL_ADDRESS (location))); break; + case PROBE_LOCATION: + result = xstrdup (EL_PROBE (location)); + break; + default: gdb_assert_not_reached ("unknown event location type"); } @@ -256,8 +293,20 @@ string_to_event_location (char **stringp, } else { - /* Everything else is a linespec. */ - location = new_linespec_location (stringp); + const char *cs; + + /* Next, try the input as a probe spec. */ + cs = *stringp; + if (cs != NULL && probe_linespec_to_ops (&cs) != NULL) + { + location = new_probe_location (*stringp); + *stringp += strlen (*stringp); + } + else + { + /* Everything else is a linespec. */ + location = new_linespec_location (stringp); + } } return location; @@ -277,6 +326,9 @@ event_location_empty_p (const struct event_location *location) case ADDRESS_LOCATION: return 0; + case PROBE_LOCATION: + return EL_PROBE (location) == NULL; + default: gdb_assert_not_reached ("unknown event location type"); } diff --git a/gdb/location.h b/gdb/location.h index 39db10e..3112d63 100644 --- a/gdb/location.h +++ b/gdb/location.h @@ -31,7 +31,10 @@ enum event_location_type LINESPEC_LOCATION, /* An address in the inferior. */ - ADDRESS_LOCATION + ADDRESS_LOCATION, + + /* A probe location. */ + PROBE_LOCATION }; /* Return the type of the given event location. */ @@ -79,6 +82,18 @@ extern struct event_location * extern CORE_ADDR get_address_location (const struct event_location *location); +/* Create a new probe location. The return result is malloc'd + and should be freed with delete_event_location. */ + +extern struct event_location * + new_probe_location (const char *probe); + +/* Return the probe location (a string) of the given event_location + (which must be of type PROBE_LOCATION). */ + +extern const char * + get_probe_location (const struct event_location *location); + /* Free an event location and any associated data. */ extern void delete_event_location (struct event_location *location); diff --git a/gdb/probe.c b/gdb/probe.c index 61236ee..1798286 100644 --- a/gdb/probe.c +++ b/gdb/probe.c @@ -57,7 +57,8 @@ parse_probes (const struct event_location *location, result.sals = NULL; result.nelts = 0; - arg_start = get_linespec_location (location); + gdb_assert (event_location_type (location) == PROBE_LOCATION); + arg_start = get_probe_location (location); cs = arg_start; probe_ops = probe_linespec_to_ops (&cs); @@ -176,7 +177,7 @@ parse_probes (const struct event_location *location, make_cleanup (xfree, canon); canonical->special_display = 1; canonical->pre_expanded = 1; - canonical->location = new_linespec_location (&canon); + canonical->location = new_probe_location (canon); } do_cleanups (cleanup);