From patchwork Thu May 8 17:58:54 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keith Seitz X-Patchwork-Id: 841 Return-Path: X-Original-To: siddhesh@wilcox.dreamhost.com Delivered-To: siddhesh@wilcox.dreamhost.com Received: from homiemail-mx22.g.dreamhost.com (mx2.sub5.homie.mail.dreamhost.com [208.113.200.128]) by wilcox.dreamhost.com (Postfix) with ESMTP id 1BD5E360098 for ; Thu, 8 May 2014 10:59:03 -0700 (PDT) Received: by homiemail-mx22.g.dreamhost.com (Postfix, from userid 14314964) id D11B1527A822; Thu, 8 May 2014 10:59:02 -0700 (PDT) X-Original-To: gdb@patchwork.siddhesh.in Delivered-To: x14314964@homiemail-mx22.g.dreamhost.com Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by homiemail-mx22.g.dreamhost.com (Postfix) with ESMTPS id A8A1B527A817 for ; Thu, 8 May 2014 10:59:02 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:subject :content-type; q=dns; s=default; b=CczLjjlhTwQWofRisAchV7WuW6jza C8TFZvAhP/0gu917KZ4RV9PKLOa7JH5KrFUrflmw/9Doq5THhk+V49OMcQeEFniM 49UTZm0GV29hdW0TavGP6T7EJoQlWZf+4OwlP8Wv7W+qwLF9jTmuqyEfq4ngjvwb 5Wn8Ug6bsGed8s= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:subject :content-type; s=default; bh=5UgLsu5Kk0EhLg1dwtA7ZrWG7C8=; b=OwA 4uWlig1cDsL4BrSfoA9WSqXgiukzA0hUzAnABP1chl1EAAqbTQbOiLFp0wPpo7m4 V4Z8I5kHs/goDl9914zSWNjSR7AZeYiR6xdG4ehz1ddtBaAHw0feAwyhwD7qLZDI g5YW5QEk/qzGswg6y1dkcg60+h6YuRyCWaJgVh+k= Received: (qmail 11370 invoked by alias); 8 May 2014 17:59:01 -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 11355 invoked by uid 89); 8 May 2014 17:58:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS 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 ESMTP; Thu, 08 May 2014 17:58:57 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s48HwsYv017620 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 8 May 2014 13:58:55 -0400 Received: from valrhona.uglyboxes.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s48Hws48018555 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Thu, 8 May 2014 13:58:54 -0400 Message-ID: <536BC5DE.5050707@redhat.com> Date: Thu, 08 May 2014 10:58:54 -0700 From: Keith Seitz User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: "gdb-patches@sourceware.org ml" Subject: [RFA 2/9] Explicit locations v2 - Event locations API X-IsSubscribed: yes X-DH-Original-To: gdb@patchwork.siddhesh.in Hi, This patch is also a nop. In fact, the code added by this patch isn't even used. I present here the new locations API which will be used/elaborated upon by subsequent patches. The basic premise here is that the breakpoint methods will no longer accept char*/char** argument "address strings." They will take a "location", which is a structure: struct event_location { /* The type of this breakpoint specification. */ enum event_location_type type; #define EVENT_LOCATION_TYPE(S) ((S)->type) union { /* data needed for the various location types */ } u; }; The UIs will use the new API function string_to_event_location to turn arbitrary text input into one of these structures. This patch and the next only implement linespec locations. In other words, it only massages the current API without introducing any new features. Keith ChangeLog 2014-05-08 Keith Seitz * Makefile.in (SFILES): Add location.c. (HFILES_NO_SRCDIR): Add location.h. (COMMON_OBS): Add location.o. * location.c: New file. * location.h: New file. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 3efedc8..266a6ec 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -805,7 +805,7 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \ inline-frame.c \ interps.c \ jv-exp.y jv-lang.c jv-valprint.c jv-typeprint.c jv-varobj.c \ - language.c linespec.c minidebug.c \ + language.c linespec.c location.c minidebug.c \ m2-exp.y m2-lang.c m2-typeprint.c m2-valprint.c \ macrotab.c macroexp.c macrocmd.c macroscope.c main.c maint.c \ mdebugread.c memattr.c mem-break.c minsyms.c mipsread.c memory-map.c \ @@ -887,7 +887,7 @@ mi/mi-out.h mi/mi-main.h mi/mi-common.h mi/mi-cmds.h linux-nat.h \ complaints.h gdb_proc_service.h gdb_regex.h xtensa-tdep.h inf-loop.h \ common/gdb_wait.h common/gdb_assert.h solib.h ppc-tdep.h cp-support.h glibc-tdep.h \ interps.h auxv.h gdbcmd.h tramp-frame.h mipsnbsd-tdep.h \ -amd64-linux-tdep.h linespec.h i387-tdep.h mn10300-tdep.h \ +amd64-linux-tdep.h linespec.h location.h i387-tdep.h mn10300-tdep.h \ sparc64-tdep.h monitor.h ppcobsd-tdep.h srec.h solib-pa64.h \ coff-pe-read.h parser-defs.h gdb_ptrace.h mips-linux-tdep.h \ m68k-tdep.h spu-tdep.h jv-lang.h environ.h solib-irix.h amd64-tdep.h \ @@ -964,7 +964,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \ source.o value.o eval.o valops.o valarith.o valprint.o printcmd.o \ block.o symtab.o psymtab.o symfile.o symfile-debug.o symmisc.o \ linespec.o dictionary.o \ - infcall.o \ + location.o infcall.o \ infcmd.o infrun.o \ expprint.o environ.o stack.o thread.o \ exceptions.o \ diff --git a/gdb/location.c b/gdb/location.c new file mode 100644 index 0000000..3f50bed --- /dev/null +++ b/gdb/location.c @@ -0,0 +1,159 @@ +/* Data structures and API for event locations in GDB. + Copyright (C) 2013-2014 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "defs.h" +#include "gdb_assert.h" +#include "location.h" +#include "symtab.h" +#include "language.h" +#include "linespec.h" +#include "cli/cli-utils.h" +#include "probe.h" + +#include +#include + +/* Initialize the given LOCATION. */ + +void +initialize_event_location (struct event_location *location, + enum event_location_type type) +{ + memset (location, 0, sizeof (struct event_location)); + EVENT_LOCATION_TYPE (location) = type; +} + +/* Create a new location with the given TYPE. */ + +struct event_location * +new_event_location (enum event_location_type type) +{ + struct event_location *location; + + location = XNEW (struct event_location); + initialize_event_location (location, type); + return location; +} + +/* Return a copy of the given SRC location. */ + +struct event_location * +copy_event_location (const struct event_location *src) +{ + struct event_location *dst; + + dst = XCNEW (struct event_location); + EVENT_LOCATION_TYPE (dst) = EVENT_LOCATION_TYPE (src); + if (EVENT_LOCATION_SAVE_SPEC (src) != NULL) + EVENT_LOCATION_SAVE_SPEC (dst) = xstrdup (EVENT_LOCATION_SAVE_SPEC (src)); + + switch (EVENT_LOCATION_TYPE (src)) + { + case EVENT_LOCATION_LINESPEC: + EVENT_LOCATION_LINESPEC (dst) = xstrdup (EVENT_LOCATION_LINESPEC (src)); + break; + + default: + gdb_assert_not_reached ("unknown event location type"); + } + + return dst; +} + +/* Free LOCATION and any associated data. */ + +void +delete_event_location (void *data) +{ + struct event_location *location + = (struct event_location *) data; + + if (location != NULL) + { + xfree (EVENT_LOCATION_SAVE_SPEC (location)); + + switch (EVENT_LOCATION_TYPE (location)) + { + case EVENT_LOCATION_LINESPEC: + xfree (EVENT_LOCATION_LINESPEC (location)); + break; + + default: + gdb_assert_not_reached ("unknown event location type"); + } + + xfree (location); + } +} + +/* Return a string representation of the LOCATION. + This function may return NULL for unspecified linespecs, + e.g, EVENT_LOCATION_LINESPEC and addr_string is NULL. */ + +const char * +event_location_to_string (const struct event_location *location) +{ + const char *result = NULL; + + switch (EVENT_LOCATION_TYPE (location)) + { + case EVENT_LOCATION_LINESPEC: + result = EVENT_LOCATION_LINESPEC (location); + break; + + default: + gdb_assert_not_reached ("unknown event location type"); + } + + return result; +} + +/* Parse the user input in *STRINGP and turn it into a struct + event_location, advancing STRINGP past any parsed input. + Return value is malloc'd. */ + +struct event_location * +string_to_event_location (char **stringp, + const struct language_defn *language) +{ + struct event_location *location; + + location = new_event_location (EVENT_LOCATION_LINESPEC); + if (*stringp != NULL) + { + EVENT_LOCATION_LINESPEC (location) = xstrdup (*stringp); + *stringp += strlen (*stringp); + } + + return location; +} + +/* A convenience function for testing for unset locations. */ + +int +event_location_empty_p (const struct event_location *location) +{ + switch (EVENT_LOCATION_TYPE (location)) + { + case EVENT_LOCATION_LINESPEC: + return EVENT_LOCATION_LINESPEC (location) == NULL; + + default: + gdb_assert_not_reached ("unknown event location type"); + } +} diff --git a/gdb/location.h b/gdb/location.h new file mode 100644 index 0000000..83fc3a4 --- /dev/null +++ b/gdb/location.h @@ -0,0 +1,100 @@ +/* Data structures and API for event locations in GDB. + Copyright (C) 2013, 2014 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef LOCATIONS_H +#define LOCATIONS_H 1 + +struct language_defn; + +/* An enumeration of the various ways to specify a stop event + location (used with create_breakpoint). */ + +enum event_location_type +{ + /* A traditional linespec. */ + EVENT_LOCATION_LINESPEC +}; + +/* An event location used to set a stop event in the inferior. + This structure is an amalgam of the various ways + to specify a where a stop event should be set. */ + +struct event_location +{ + /* The type of this breakpoint specification. */ + enum event_location_type type; +#define EVENT_LOCATION_TYPE(S) ((S)->type) + + union + { + /* A generic "this is a string specification" for a location. + This representation is used by both "normal" linespecs and + probes. */ + char *addr_string; +#define EVENT_LOCATION_LINESPEC(S) ((S)->u.addr_string) + } u; + + /* A string representation of how this location may be + saved. This is used to save stop event locations to file. + Malloc'd. */ + char *save_spec; +#define EVENT_LOCATION_SAVE_SPEC(S) ((S)->save_spec) +}; + +/* Return a string representation of the LOCATION. + This function may return NULL for unspecified linespecs, + e.g, EVENT_LOCATION_LINESPEC and addr_string is NULL. */ + +extern const char * + event_location_to_string (const struct event_location *location); + +/* Free an event location and any associated data. */ + +extern void delete_event_location (void *data); + +/* Create a new event location with the given TYPE. */ + +extern struct event_location * + new_event_location (enum event_location_type type); + +/* Return a copy of the given SRC location. */ +extern struct event_location * + copy_event_location (const struct event_location *src); + +/* Initialize the given LOCATION. */ + +extern void initialize_event_location (struct event_location *location, + enum event_location_type type); + +/* Attempt to convert the input string in *ARGP into an event location. + ARGP is advanced past any processed input. Returns a event_location + (malloc'd) if an event location was successfully found in *ARGP, + NULL otherwise. + + This function may call error() if *ARGP looks like properly formed, + but invalid, input, e.g., if it is called with missing argument parameters + or invalid options. */ + +extern struct event_location * + string_to_event_location (char **argp, + const struct language_defn *langauge); + +/* A convenience function for testing for unset locations. */ + +extern int event_location_empty_p (const struct event_location *location); +#endif /* LOCATIONS_H */