diff options
author | Markus Metzger <mmetzger@sourceware.org> | 2013-03-11 08:28:58 +0000 |
---|---|---|
committer | Markus Metzger <mmetzger@sourceware.org> | 2013-03-11 08:28:58 +0000 |
commit | c12a29171fe3379095cfc896e0f8ddfb18c614c3 (patch) | |
tree | 309b8ca660993ea0fb05996e446d84e315c65182 /gdb | |
parent | 3e3aea48e21e35069ec893c4b5d49de494f8329c (diff) | |
download | gdb-c12a29171fe3379095cfc896e0f8ddfb18c614c3.zip gdb-c12a29171fe3379095cfc896e0f8ddfb18c614c3.tar.gz gdb-c12a29171fe3379095cfc896e0f8ddfb18c614c3.tar.bz2 |
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.
gdb/
* features/btrace.dtd: New file.
* Makefile.in (XMLFILES): Add btrace.dtd.
* btrace.h (parse_xml_btrace): New declaration.
* btrace.c: Include xml-support.h.
(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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 13 | ||||
-rw-r--r-- | gdb/Makefile.in | 3 | ||||
-rw-r--r-- | gdb/btrace.c | 94 | ||||
-rw-r--r-- | gdb/btrace.h | 3 | ||||
-rw-r--r-- | gdb/features/btrace.dtd | 12 |
5 files changed, 124 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7156011..426d631 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,18 @@ 2013-03-11 Markus Metzger <markus.t.metzger@intel.com> + * features/btrace.dtd: New file. + * Makefile.in (XMLFILES): Add btrace.dtd. + * btrace.h (parse_xml_btrace): New declaration. + * btrace.c: Include xml-support.h. + (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. + +2013-03-11 Markus Metzger <markus.t.metzger@intel.com> + * amd64-linux-nat.c: Include btrace.h and linux-btrace.h. (amd64_linux_enable_btrace): New. (amd64_linux_disable_btrace): New. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index de48caa..e11e3d1 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -497,7 +497,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 2acecbe..c39a32d 100644 --- a/gdb/btrace.c +++ b/gdb/btrace.c @@ -29,6 +29,7 @@ #include "disasm.h" #include "source.h" #include "filenames.h" +#include "xml-support.h" /* Print a record debug message. Use do ... while (0) to avoid ambiguities when used in if statements. */ @@ -447,3 +448,96 @@ btrace_free_objfile (struct objfile *objfile) ALL_THREADS (tp) btrace_clear (tp); } + +#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 != 0) + { + do_cleanups (cleanup); + return NULL; + } + + /* Keep parse results. */ + discard_cleanups (cleanup); + +#else /* !defined (HAVE_LIBEXPAT) */ + + error (_("Cannot process branch trace. XML parsing is not supported.")); + +#endif /* !defined (HAVE_LIBEXPAT) */ + + return btrace; +} diff --git a/gdb/btrace.h b/gdb/btrace.h index 26b1686..bd8425d 100644 --- a/gdb/btrace.h +++ b/gdb/btrace.h @@ -136,4 +136,7 @@ extern void btrace_clear (struct thread_info *); /* Clear the branch trace for all threads when an object file goes away. */ extern void btrace_free_objfile (struct objfile *); +/* 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..6fe0cd6 --- /dev/null +++ b/gdb/features/btrace.dtd @@ -0,0 +1,12 @@ +<!-- Copyright (C) 2013 Free Software Foundation, Inc. + + Copying and distribution of this file, with or without modification, + are permitted in any medium without royalty provided the copyright + notice and this notice are preserved. --> + +<!ELEMENT btrace (block)* > +<!ATTLIST btrace version CDATA #FIXED "1.0"> + +<!ELEMENT block EMPTY> +<!ATTLIST block begin CDATA #REQUIRED + end CDATA #REQUIRED> |