[PATCH 4/6] Add id of TSV into traceframe_info.

Yao Qi
2013-06-13T01:29:12Z

Hi,
This patch extends the qXfer:traceframe-info object to report the set
of collected trace state variables in the current traceframe.

Since VEC(int) is used in tracepoint.h, to avoid duplicated definition
error, this patch also moves DEF_VEC_I(int) to gdb_vecs.h, and include
it in other files instead of defining it by their own.

When GDB reads from trace file (tfile or ctf), the traceframe_ifo
object should be updated for trace state variables as well.

gdb:

2013-06-13 Pedro Alves <pedro@codesourcery.com>
Yao Qi <yao@codesourcery.com>

* ctf.c (ctf_traceframe_info): Push trace state variables
present in the trace data into the traceframe info object.
* breakpoint.c (DEF_VEC_I): Remove.
* common/filestuff.c (DEF_VEC_I): Likewise.
* dwarf2loc.c (DEF_VEC_I): Likewise.
* mi/mi-main.c (DEF_VEC_I): Likewise.
* common/gdb_vecs.h (DEF_VEC_I): Define vector for int.
* features/traceframe-info.dtd: Add tvar element and its
attributes.
* tracepoint.c (free_traceframe_info): Free vector 'tvars'.
(build_traceframe_info): Push trace state variables present in the
trace data into the traceframe info object.
(traceframe_info_start_tvar): New function.
(tvar_attributes): New.
(traceframe_info_children): Add "tvar" element.
* tracepoint.h (struct traceframe_info) <tvars>: New field.

* NEWS: Mention the change in GDB and GDBserver.

gdb/doc:

2013-06-13 Pedro Alves <pedro@codesourcery.com>

* gdb.texinfo (Traceframe Info Format): Document tvar element and
its attributes.

gdb/gdbserver:

2013-06-13 Pedro Alves <pedro@codesourcery.com>

* tracepoint.c (build_traceframe_info_xml): Output trace state
variables present in the trace buffer.
---
gdb/NEWS | 7 +++++++
gdb/breakpoint.c | 2 --
gdb/common/filestuff.c | 2 --
gdb/common/gdb_vecs.h | 2 ++
gdb/ctf.c | 12 ++++++++++++
gdb/doc/gdb.texinfo | 12 +++++++++++-
gdb/dwarf2loc.c | 2 --
gdb/features/traceframe-info.dtd | 5 ++++-
gdb/gdbserver/tracepoint.c | 7 +++++++
gdb/mi/mi-main.c | 2 --
gdb/tracepoint.c | 30 ++++++++++++++++++++++++++++++
gdb/tracepoint.h | 3 +++
12 files changed, 76 insertions(+), 10 deletions(-)

diff --git a/gdb/NEWS b/gdb/NEWS
index ed1c32f..2c66db7 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -91,6 +91,9 @@ show range-stepping
the number of control packets from/to GDB. See "New remote packets"
below.

+* GDB now understands the element 'tvar' in the XML traceframe info.
+ It has the id of the collected trace state variables.
+
* New remote packets

vCont;r
@@ -112,6 +115,10 @@ qXfer:libraries-svr4:read's annex
** GDBserver now supports target-assisted range stepping. Currently
enabled on x86/x86_64 GNU/Linux targets.

+ ** GDBserver now adds element 'tvar' in the XML in the reply to
+ 'qXfer:traceframe-info:read'. It has the id of the collected
+ trace state variables.
+
*** Changes in GDB 7.6

* Target record has been renamed to record-full.
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index d4ccc81..6054ef4 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -5788,8 +5788,6 @@ bptype_string (enum bptype type)
return bptypes[(int) type].description;
}

-DEF_VEC_I(int);
-
/* For MI, output a field named 'thread-groups' with a list as the value.
For CLI, prefix the list with the string 'inf'. */

diff --git a/gdb/common/filestuff.c b/gdb/common/filestuff.c
index daf96d9..7d1a69a 100644
--- a/gdb/common/filestuff.c
+++ b/gdb/common/filestuff.c
@@ -157,8 +157,6 @@ fdwalk (int (*func) (void *, int), void *arg)
don't use a hashtab because libiberty isn't linked into gdbserver;
and anyway we don't expect there to be many open fds. */

-DEF_VEC_I (int);
-
static VEC (int) *open_fds;

/* An fdwalk callback function used by notice_open_fds. It puts the
diff --git a/gdb/common/gdb_vecs.h b/gdb/common/gdb_vecs.h
index 1b05b0c..7df3001 100644
--- a/gdb/common/gdb_vecs.h
+++ b/gdb/common/gdb_vecs.h
@@ -29,6 +29,8 @@ DEF_VEC_P (char_ptr);

DEF_VEC_P (const_char_ptr);

+DEF_VEC_I (int);
+
extern void free_char_ptr_vec (VEC (char_ptr) *char_ptr_vec);

extern struct cleanup *
diff --git a/gdb/ctf.c b/gdb/ctf.c
index 278f950..1f6402d 100644
--- a/gdb/ctf.c
+++ b/gdb/ctf.c
@@ -1778,6 +1778,18 @@ ctf_traceframe_info (void)
def = bt_ctf_get_field (event, scope, "length");
r->length = (uint16_t) bt_ctf_get_uint64 (def);
}
+ else if (strcmp (name, "tsv") == 0)
+ {
+ int32_t vnum;
+ const struct bt_definition *scope
+ = bt_ctf_get_top_level_scope (event,
+ BT_EVENT_FIELDS);
+ const struct bt_definition *def;
+
+ def = bt_ctf_get_field (event, scope, "num");
+ vnum = (int32_t) bt_ctf_get_uint64 (def);
+ VEC_safe_push (int, info->tvars, vnum);
+ }
else
{
warning (_("Unhandled trace block type (%s) "
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index d25cdae..3992704 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -41789,17 +41789,27 @@ A region of collected memory starting at @var{addr} and extending for
<memory start="@var{addr}" length="@var{length}"/>
@end smallexample

+@item
+A block indicating trace state variable numbered @var{number} has been
+collected:
+
+@smallexample
+<tvar id="@var{number}"/>
+@end smallexample
+
@end itemize

The formal DTD for the traceframe info format is given below:

@smallexample
-<!ELEMENT traceframe-info (memory)* >
+<!ELEMENT traceframe-info (memory | tvar)* >
<!ATTLIST traceframe-info version CDATA #FIXED "1.0">

<!ELEMENT memory EMPTY>
<!ATTLIST memory start CDATA #REQUIRED
length CDATA #REQUIRED>
+<!ELEMENT tvar>
+<!ATTLIST tvar id CDATA #REQUIRED>
@end smallexample

@node Branch Trace Format
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index 9e44096..aac2a1a 100644
--- a/gdb/dwarf2loc.c
+++ b/gdb/dwarf2loc.c
@@ -42,8 +42,6 @@
#include "gdb_string.h"
#include "gdb_assert.h"

-DEF_VEC_I(int);
-
extern int dwarf2_always_disassemble;

static void dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc,
diff --git a/gdb/features/traceframe-info.dtd b/gdb/features/traceframe-info.dtd
index 0da2bec..b811122 100644
--- a/gdb/features/traceframe-info.dtd
+++ b/gdb/features/traceframe-info.dtd
@@ -5,9 +5,12 @@
notice and this notice are preserved. -->


-<!ELEMENT traceframe-info (memory)* >
+<!ELEMENT traceframe-info (memory | tvar)* >
<!ATTLIST traceframe-info version CDATA #FIXED "1.0">

<!ELEMENT memory EMPTY>
<!ATTLIST memory start CDATA #REQUIRED
length CDATA #REQUIRED>
+
+<!ELEMENT tvar EMPTY>
+<!ATTLIST tvar id CDATA #REQUIRED>
diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c
index d237e7f..6492b5a 100644
--- a/gdb/gdbserver/tracepoint.c
+++ b/gdb/gdbserver/tracepoint.c
@@ -5401,6 +5401,13 @@ build_traceframe_info_xml (char blocktype, unsigned char *dataptr, void *data)
break;
}
case 'V':
+ {
+ int vnum;
+
+ memcpy (&vnum, dataptr, sizeof (vnum));
+ buffer_xml_printf (buffer, "<tvar id=\"%d\"/>\n", vnum);
+ break;
+ }
case 'R':
case 'S':
{
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 127f6ff..430d530 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -513,8 +513,6 @@ mi_cmd_thread_info (char *command, char **argv, int argc)
print_thread_info (current_uiout, argv[0], -1);
}

-DEF_VEC_I(int);
-
struct collect_cores_data
{
int pid;
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 86a573e..d7d0e88 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -235,6 +235,7 @@ free_traceframe_info (struct traceframe_info *info)
if (info != NULL)
{
VEC_free (mem_range_s, info->memory);
+ VEC_free (int, info->tvars);

xfree (info);
}
@@ -5224,6 +5225,12 @@ build_traceframe_info (char blocktype, void *data)
break;
}
case 'V':
+ {
+ int vnum;
+
+ tfile_read ((gdb_byte *) &vnum, 4);
+ VEC_safe_push (int, info->tvars, vnum);
+ }
case 'R':
case 'S':
{
@@ -5581,6 +5588,21 @@ traceframe_info_start_memory (struct gdb_xml_parser *parser,
r->length = *length_p;
}

+/* Handle the start of a <tvar> element. */
+
+static void
+traceframe_info_start_tvar (struct gdb_xml_parser *parser,
+ const struct gdb_xml_element *element,
+ void *user_data,
+ VEC(gdb_xml_value_s) *attributes)
+{
+ struct traceframe_info *info = user_data;
+ const char *id_attrib = xml_find_attribute (attributes, "id")->value;
+ int id = gdb_xml_parse_ulongest (parser, id_attrib);
+
+ VEC_safe_push (int, info->tvars, id);
+}
+
/* Discard the constructed trace frame info (if an error occurs). */

static void
@@ -5599,10 +5621,18 @@ static const struct gdb_xml_attribute memory_attributes[] = {
{ NULL, GDB_XML_AF_NONE, NULL, NULL }
};

+static const struct gdb_xml_attribute tvar_attributes[] = {
+ { "id", GDB_XML_AF_NONE, NULL, NULL },
+ { NULL, GDB_XML_AF_NONE, NULL, NULL }
+};
+
static const struct gdb_xml_element traceframe_info_children[] = {
{ "memory", memory_attributes, NULL,
GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
traceframe_info_start_memory, NULL },
+ { "tvar", tvar_attributes, NULL,
+ GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
+ traceframe_info_start_tvar, NULL },
{ NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
};

diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h
index 3b09ca8..350ab5e 100644
--- a/gdb/tracepoint.h
+++ b/gdb/tracepoint.h
@@ -30,6 +30,9 @@ struct traceframe_info
{
/* Collected memory. */
VEC(mem_range_s) *memory;
+
+ /* Collected trace state variables. */
+ VEC(int) *tvars;
};

/* A trace state variable is a value managed by a target being
--
1.7.7.6