From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5758 invoked by alias); 7 Dec 2012 10:37:52 -0000 Received: (qmail 5699 invoked by uid 22791); 7 Dec 2012 10:37:50 -0000 X-SWARE-Spam-Status: No, hits=-7.9 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mga14.intel.com (HELO mga14.intel.com) (143.182.124.37) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 07 Dec 2012 10:37:44 +0000 Received: from azsmga002.ch.intel.com ([10.2.17.35]) by azsmga102.ch.intel.com with ESMTP; 07 Dec 2012 02:37:38 -0800 X-ExtLoop1: 1 Received: from swsutil001.isw.intel.com ([10.237.237.11]) by AZSMGA002.ch.intel.com with ESMTP; 07 Dec 2012 02:37:35 -0800 Received: from ulslx001.iul.intel.com (ulslx001.iul.intel.com [172.28.207.63]) by swsutil001.isw.intel.com (8.13.6/8.13.6/MailSET/Hub) with ESMTP id qB7AbY0e003972; Fri, 7 Dec 2012 10:37:34 GMT Received: from ulslx001.iul.intel.com (localhost [127.0.0.1]) by ulslx001.iul.intel.com with ESMTP id qB7AbXDl026020; Fri, 7 Dec 2012 11:37:33 +0100 Received: (from mmetzger@localhost) by ulslx001.iul.intel.com with id qB7AbXeH026016; Fri, 7 Dec 2012 11:37:33 +0100 From: markus.t.metzger@intel.com To: gdb-patches@sourceware.org Cc: markus.t.metzger@gmail.com, jan.kratochvil@redhat.com, palves@redhat.com, tromey@redhat.com, kettenis@gnu.org, Markus Metzger Subject: [patch v5 05/12] xml, btrace: define btrace xml document style Date: Fri, 07 Dec 2012 10:38:00 -0000 Message-Id: <1354876644-25749-6-git-send-email-markus.t.metzger@intel.com> In-Reply-To: <1354876644-25749-1-git-send-email-markus.t.metzger@intel.com> References: <1354876644-25749-1-git-send-email-markus.t.metzger@intel.com> X-IsSubscribed: yes 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 X-SW-Source: 2012-12/txt/msg00151.txt.bz2 From: Markus Metzger Define the xml document style for transferring branch trace data. Add a function to parse a btrace xml document into a vector of branch trace blocks. 2012-12-07 Markus Metzger * features/btrace.dtd: New file. * Makefile.in (XMLFILES): Add btrace.dtd. * btrace.h (parse_xml_btrace): New declaration. * btrace.c (parse_xml_btrace): New function. (parse_xml_btrace_block): New function. (block_attributes): New struct. (btrace_attributes): New struct. (btrace_children): New struct. (btrace_elements): New struct. --- gdb/Makefile.in | 3 +- gdb/btrace.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++ gdb/btrace.h | 3 + gdb/features/btrace.dtd | 12 ++++++ 4 files changed, 112 insertions(+), 1 deletions(-) create mode 100644 gdb/features/btrace.dtd diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 112f13e..57f6548 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -494,7 +494,8 @@ RUNTESTFLAGS= XMLFILES = $(srcdir)/features/gdb-target.dtd $(srcdir)/features/xinclude.dtd \ $(srcdir)/features/library-list.dtd \ $(srcdir)/features/library-list-svr4.dtd $(srcdir)/features/osdata.dtd \ - $(srcdir)/features/threads.dtd $(srcdir)/features/traceframe-info.dtd + $(srcdir)/features/threads.dtd $(srcdir)/features/traceframe-info.dtd \ + $(srcdir)/features/btrace.dtd # This is ser-unix.o for any system which supports a v7/BSD/SYSV/POSIX # interface to the serial port. Hopefully if get ported to OS/2, VMS, diff --git a/gdb/btrace.c b/gdb/btrace.c index 68b109a..00b2d90 100644 --- a/gdb/btrace.c +++ b/gdb/btrace.c @@ -32,6 +32,7 @@ #include "arch-utils.h" #include "disasm.h" #include "gdbarch.h" +#include "xml-support.h" #include #include @@ -706,6 +707,100 @@ cmd_btrace (char *args, int from_tty) do_btrace_range (tp, flags, args); } +#if defined(HAVE_LIBEXPAT) + +/* Check the btrace document version. */ + +static void +check_xml_btrace_version (struct gdb_xml_parser *parser, + const struct gdb_xml_element *element, + void *user_data, VEC (gdb_xml_value_s) *attributes) +{ + const char *version = xml_find_attribute (attributes, "version")->value; + + if (strcmp (version, "1.0") != 0) + gdb_xml_error (parser, _("Unsupported btrace version: \"%s\""), version); +} + +/* Parse a btrace "block" xml record. */ + +static void +parse_xml_btrace_block (struct gdb_xml_parser *parser, + const struct gdb_xml_element *element, + void *user_data, VEC (gdb_xml_value_s) *attributes) +{ + VEC (btrace_block_s) **btrace; + struct btrace_block *block; + ULONGEST *begin, *end; + + btrace = user_data; + block = VEC_safe_push (btrace_block_s, *btrace, NULL); + + begin = xml_find_attribute (attributes, "begin")->value; + end = xml_find_attribute (attributes, "end")->value; + + block->begin = *begin; + block->end = *end; +} + +static const struct gdb_xml_attribute block_attributes[] = { + { "begin", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, + { "end", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, + { NULL, GDB_XML_AF_NONE, NULL, NULL } +}; + +static const struct gdb_xml_attribute btrace_attributes[] = { + { "version", GDB_XML_AF_NONE, NULL, NULL }, + { NULL, GDB_XML_AF_NONE, NULL, NULL } +}; + +static const struct gdb_xml_element btrace_children[] = { + { "block", block_attributes, NULL, + GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL, parse_xml_btrace_block, NULL }, + { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } +}; + +static const struct gdb_xml_element btrace_elements[] = { + { "btrace", btrace_attributes, btrace_children, GDB_XML_EF_NONE, + check_xml_btrace_version, NULL }, + { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } +}; + +#endif /* defined(HAVE_LIBEXPAT) */ + +/* See btrace.h. */ + +VEC (btrace_block_s) * +parse_xml_btrace (const char *buffer) +{ + VEC (btrace_block_s) *btrace = NULL; + struct cleanup *cleanup; + int errcode; + +#if defined(HAVE_LIBEXPAT) + + cleanup = make_cleanup (VEC_cleanup (btrace_block_s), &btrace); + errcode = gdb_xml_parse_quick (_("btrace"), "btrace.dtd", btrace_elements, + buffer, &btrace); + if (errcode) + { + do_cleanups (cleanup); + errno = errcode; + return NULL; + } + + /* Keep parse results. */ + discard_cleanups (cleanup); + +#else /* !defined(HAVE_LIBEXPAT) */ + + error (_("Cannot process branch tracing result. XML parsing not supported.")); + +#endif /* !defined(HAVE_LIBEXPAT) */ + + return btrace; +} + void _initialize_btrace (void); /* Initialize btrace commands. */ diff --git a/gdb/btrace.h b/gdb/btrace.h index df9df23..26fafc7 100644 --- a/gdb/btrace.h +++ b/gdb/btrace.h @@ -80,4 +80,7 @@ extern struct btrace_block *read_btrace (struct thread_info *, int); extern struct btrace_block *prev_btrace (struct thread_info *); extern struct btrace_block *next_btrace (struct thread_info *); +/* Parse a branch trace xml document into a block vector. */ +extern VEC (btrace_block_s) *parse_xml_btrace (const char*); + #endif /* BTRACE_H */ diff --git a/gdb/features/btrace.dtd b/gdb/features/btrace.dtd new file mode 100644 index 0000000..18c5b2a --- /dev/null +++ b/gdb/features/btrace.dtd @@ -0,0 +1,12 @@ + + + + + + + -- 1.7.1