diff mbox

[PUSHED] Get trace_regblock_size from metadata instead of event

Message ID 1397887427-18674-1-git-send-email-yao@codesourcery.com
State Committed
Headers show

Commit Message

Yao Qi April 19, 2014, 6:03 a.m. UTC
In ctf trace, for each 'R' block, we save it as a "register" event,
as defined below in metadata.

event {
        name = "register";
        id = 0;
        fields := struct {
                ascii contents[440];
        };
}

Nowadays, we initialize trace_regblock_size by getting the length of
"contents" from a "register" event.  However, 'R' block may not exist
in traceframe, as a result, "register" event doesn't exist in trace file
and trace_regblock_size isn't set.

This patch changes to get trace_regblock_size from metadata (or declaration)
which always exists.  Patch is tested by running tests in gdb.trace on
x86-linux with libbabeltrace installed.  Patch is pushed.

gdb:

2014-04-19  Yao Qi  <yao@codesourcery.com>

	* ctf.c (handle_id): New static variable.
	(ctf_open_dir): Get handle_id from bt_context_add_trace return
	value.  Get the declaration of event "register" and get length
	of field "contents".
---
 gdb/ChangeLog |  7 +++++++
 gdb/ctf.c     | 56 ++++++++++++++++++++++----------------------------------
 2 files changed, 29 insertions(+), 34 deletions(-)
diff mbox

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 2d2b839..6bc9d87 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@ 
 2014-04-19  Yao Qi  <yao@codesourcery.com>
 
+	* ctf.c (handle_id): New static variable.
+	(ctf_open_dir): Get handle_id from bt_context_add_trace return
+	value.  Get the declaration of event "register" and get length
+	of field "contents".
+
+2014-04-19  Yao Qi  <yao@codesourcery.com>
+
 	* ctf.c (ctf_xfer_partial): Check 'name' is NULL before strcmp.
 
 2014-04-18  Siva Chandra Reddy  <sivachandra@google.com>
diff --git a/gdb/ctf.c b/gdb/ctf.c
index f011738..aa63d5b 100644
--- a/gdb/ctf.c
+++ b/gdb/ctf.c
@@ -873,6 +873,7 @@  ctf_trace_file_writer_new (void)
 #include <babeltrace/ctf/iterator.h>
 
 /* The struct pointer for current CTF directory.  */
+static int handle_id = -1;
 static struct bt_context *ctx = NULL;
 static struct bt_ctf_iter *ctf_iter = NULL;
 /* The position of the first packet containing trace frame.  */
@@ -905,15 +906,16 @@  ctf_destroy (void)
 static void
 ctf_open_dir (char *dirname)
 {
-  int ret;
   struct bt_iter_pos begin_pos;
   struct bt_iter_pos *pos;
+  unsigned int count, i;
+  struct bt_ctf_event_decl * const *list;
 
   ctx = bt_context_create ();
   if (ctx == NULL)
     error (_("Unable to create bt_context"));
-  ret = bt_context_add_trace (ctx, dirname, "ctf", NULL, NULL, NULL);
-  if (ret < 0)
+  handle_id = bt_context_add_trace (ctx, dirname, "ctf", NULL, NULL, NULL);
+  if (handle_id < 0)
     {
       ctf_destroy ();
       error (_("Unable to use libbabeltrace on directory \"%s\""),
@@ -928,42 +930,28 @@  ctf_open_dir (char *dirname)
       error (_("Unable to create bt_iterator"));
     }
 
-  /* Iterate over events, and look for an event for register block
-     to set trace_regblock_size.  */
+  /* Look for the declaration of register block.  Get the length of
+     array "contents" to set trace_regblock_size.  */
 
-  /* Save the current position.  */
-  pos = bt_iter_get_pos (bt_ctf_get_iter (ctf_iter));
-  gdb_assert (pos->type == BT_SEEK_RESTORE);
+  bt_ctf_get_event_decl_list (handle_id, ctx, &list, &count);
+  for (i = 0; i < count; i++)
+    if (strcmp ("register", bt_ctf_get_decl_event_name (list[i])) == 0)
+      {
+	unsigned int j;
+	const struct bt_ctf_field_decl * const *field_list;
+	const struct bt_declaration *decl;
 
-  while (1)
-    {
-      const char *name;
-      struct bt_ctf_event *event;
+	bt_ctf_get_decl_fields (list[i], BT_EVENT_FIELDS, &field_list,
+				&count);
 
-      event = bt_ctf_iter_read_event (ctf_iter);
-
-      name = bt_ctf_event_name (event);
+	gdb_assert (count == 1);
+	gdb_assert (0 == strcmp ("contents",
+				 bt_ctf_get_decl_field_name (field_list[0])));
+	decl = bt_ctf_get_decl_from_field_decl (field_list[0]);
+	trace_regblock_size = bt_ctf_get_array_len (decl);
 
-      if (name == NULL)
 	break;
-      else if (strcmp (name, "register") == 0)
-	{
-	  const struct bt_definition *scope
-	    = bt_ctf_get_top_level_scope (event,
-					  BT_EVENT_FIELDS);
-	  const struct bt_definition *array
-	    = bt_ctf_get_field (event, scope, "contents");
-
-	  trace_regblock_size
-	    = bt_ctf_get_array_len (bt_ctf_get_decl_from_def (array));
-	}
-
-      if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
-	break;
-    }
-
-  /* Restore the position.  */
-  bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
+      }
 }
 
 #define SET_INT32_FIELD(EVENT, SCOPE, VAR, FIELD)			\