This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 3/5] Add id of TSV into traceframe_info.


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-07  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-07  Pedro Alves  <pedro@codesourcery.com>

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

gdb/gdbserver:

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

	* tracepoint.c (build_traceframe_info_xml): Output trace state
	variables present in the trace buffer.
---
 gdb/NEWS                         |    5 +++++
 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, 74 insertions(+), 10 deletions(-)

diff --git a/gdb/NEWS b/gdb/NEWS
index 00eeeb6..b10d6d4 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -91,6 +91,8 @@ 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.
+
 * New remote packets
 
 vCont;r
@@ -112,6 +114,9 @@ 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'.
+
 *** 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 82b1030..fefac12 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -41790,17 +41790,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.  -->
 
 <!-- traceframe-info: Root element with versioning -->
-<!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 1ff6114..5acc51a 100644
--- a/gdb/gdbserver/tracepoint.c
+++ b/gdb/gdbserver/tracepoint.c
@@ -5390,6 +5390,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 4fccfb3..a63ff8b 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 ab0d0bf..d3f0d48 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);
     }
@@ -5233,6 +5234,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':
       {
@@ -5590,6 +5597,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
@@ -5608,10 +5630,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 5ecf1fb..37abbdd 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]