mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-21 18:11:31 +00:00
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.
This commit is contained in:
parent
3e3aea48e2
commit
c12a29171f
@ -1,3 +1,16 @@
|
||||
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.
|
||||
|
@ -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,
|
||||
|
94
gdb/btrace.c
94
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;
|
||||
}
|
||||
|
@ -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 */
|
||||
|
12
gdb/features/btrace.dtd
Normal file
12
gdb/features/btrace.dtd
Normal file
@ -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>
|
Loading…
x
Reference in New Issue
Block a user