Restore test-cp-name-parser build
[deliverable/binutils-gdb.git] / gdb / ctf.c
index df645c04b48cfb7b24b590305e5e3870a39c6df4..8716cadf97e6bce2512d651d29600319bc386121 100644 (file)
--- a/gdb/ctf.c
+++ b/gdb/ctf.c
@@ -1,6 +1,6 @@
 /* CTF format support.
 
-   Copyright (C) 2012-2014 Free Software Foundation, Inc.
+   Copyright (C) 2012-2017 Free Software Foundation, Inc.
    Contributed by Hui Zhu <hui_zhu@mentor.com>
    Contributed by Yao Qi <yao@codesourcery.com>
 
@@ -29,8 +29,8 @@
 #include "inferior.h"
 #include "gdbthread.h"
 #include "tracefile.h"
-
 #include <ctype.h>
+#include <algorithm>
 
 /* GDB saves trace buffers and other information (such as trace
    status) got from the remote target into Common Trace Format (CTF).
@@ -99,6 +99,11 @@ struct trace_write_handler
 
 /* Write metadata in FORMAT.  */
 
+static void
+ctf_save_write_metadata (struct trace_write_handler *handler,
+                        const char *format, ...)
+  ATTRIBUTE_PRINTF (2, 3);
+
 static void
 ctf_save_write_metadata (struct trace_write_handler *handler,
                         const char *format, ...)
@@ -197,27 +202,6 @@ ctf_save_next_packet (struct trace_write_handler *handler)
 static void
 ctf_save_metadata_header (struct trace_write_handler *handler)
 {
-  const char metadata_fmt[] =
-  "\ntrace {\n"
-  "    major = %u;\n"
-  "    minor = %u;\n"
-  "    byte_order = %s;\n"             /* be or le */
-  "    packet.header := struct {\n"
-  "            uint32_t magic;\n"
-  "    };\n"
-  "};\n"
-  "\n"
-  "stream {\n"
-  "    packet.context := struct {\n"
-  "            uint32_t content_size;\n"
-  "            uint32_t packet_size;\n"
-  "            uint16_t tpnum;\n"
-  "    };\n"
-  "    event.header := struct {\n"
-  "            uint32_t id;\n"
-  "    };\n"
-  "};\n";
-
   ctf_save_write_metadata (handler, "/* CTF %d.%d */\n",
                           CTF_SAVE_MAJOR, CTF_SAVE_MINOR);
   ctf_save_write_metadata (handler,
@@ -257,7 +241,26 @@ ctf_save_metadata_header (struct trace_write_handler *handler)
 #define HOST_ENDIANNESS "le"
 #endif
 
-  ctf_save_write_metadata (handler, metadata_fmt,
+  ctf_save_write_metadata (handler,
+                          "\ntrace {\n"
+                          "    major = %u;\n"
+                          "    minor = %u;\n"
+                          "    byte_order = %s;\n"
+                          "    packet.header := struct {\n"
+                          "            uint32_t magic;\n"
+                          "    };\n"
+                          "};\n"
+                          "\n"
+                          "stream {\n"
+                          "    packet.context := struct {\n"
+                          "            uint32_t content_size;\n"
+                          "            uint32_t packet_size;\n"
+                          "            uint16_t tpnum;\n"
+                          "    };\n"
+                          "    event.header := struct {\n"
+                          "            uint32_t id;\n"
+                          "    };\n"
+                          "};\n",
                           CTF_SAVE_MAJOR, CTF_SAVE_MINOR,
                           HOST_ENDIANNESS);
   ctf_save_write_metadata (handler, "\n");
@@ -301,11 +304,6 @@ ctf_target_save (struct trace_file_writer *self,
   return 0;
 }
 
-#ifdef USE_WIN32API
-#undef mkdir
-#define mkdir(pathname, mode) mkdir (pathname)
-#endif
-
 /* This is the implementation of trace_file_write_ops method
    start.  It creates the directory DIRNAME, metadata and datastream
    in the directory.  */
@@ -611,6 +609,15 @@ ctf_write_uploaded_tp (struct trace_file_writer *self,
 
 }
 
+/* This is the implementation of trace_file_write_ops method
+   write_tdesc.  */
+
+static void
+ctf_write_tdesc (struct trace_file_writer *self)
+{
+  /* Nothing so far. */
+}
+
 /* This is the implementation of trace_file_write_ops method
    write_definition_end.  */
 
@@ -623,11 +630,6 @@ ctf_write_definition_end (struct trace_file_writer *self)
   self->ops->frame_ops->end (self);
 }
 
-/* The minimal file size of data stream.  It is required by
-   babeltrace.  */
-
-#define CTF_FILE_MIN_SIZE              4096
-
 /* This is the implementation of trace_file_write_ops method
    end.  */
 
@@ -637,50 +639,6 @@ ctf_end (struct trace_file_writer *self)
   struct ctf_trace_file_writer *writer = (struct ctf_trace_file_writer *) self;
 
   gdb_assert (writer->tcs.content_size == 0);
-  /* The babeltrace requires or assumes that the size of datastream
-     file is greater than 4096 bytes.  If we don't generate enough
-     packets and events, create a fake packet which has zero event,
-      to use up the space.  */
-  if (writer->tcs.packet_start < CTF_FILE_MIN_SIZE)
-    {
-      uint32_t u32;
-
-      /* magic.  */
-      u32 = CTF_MAGIC;
-      ctf_save_write_uint32 (&writer->tcs, u32);
-
-      /* content_size.  */
-      u32 = 0;
-      ctf_save_write_uint32 (&writer->tcs, u32);
-
-      /* packet_size.  */
-      u32 = 12;
-      if (writer->tcs.packet_start + u32 < CTF_FILE_MIN_SIZE)
-       u32 = CTF_FILE_MIN_SIZE - writer->tcs.packet_start;
-
-      u32 *= TARGET_CHAR_BIT;
-      ctf_save_write_uint32 (&writer->tcs, u32);
-
-      /* tpnum.  */
-      u32 = 0;
-      ctf_save_write (&writer->tcs, (gdb_byte *) &u32, 2);
-
-      /* Enlarge the file to CTF_FILE_MIN_SIZE is it is still less
-        than that.  */
-      if (CTF_FILE_MIN_SIZE
-         > (writer->tcs.packet_start + writer->tcs.content_size))
-       {
-         gdb_byte b = 0;
-
-         /* Fake the content size to avoid assertion failure in
-            ctf_save_fseek.  */
-         writer->tcs.content_size = (CTF_FILE_MIN_SIZE
-                                     - 1 - writer->tcs.packet_start);
-         ctf_save_fseek (&writer->tcs, CTF_FILE_MIN_SIZE - 1,
-                         SEEK_SET);
-         ctf_save_write (&writer->tcs, &b, 1);
-       }
-    }
 }
 
 /* This is the implementation of trace_frame_write_ops method
@@ -843,6 +801,7 @@ static const struct trace_file_write_ops ctf_write_ops =
   ctf_write_status,
   ctf_write_uploaded_tsv,
   ctf_write_uploaded_tp,
+  ctf_write_tdesc,
   ctf_write_definition_end,
   NULL,
   &ctf_write_frame_ops,
@@ -854,8 +813,7 @@ static const struct trace_file_write_ops ctf_write_ops =
 struct trace_file_writer *
 ctf_trace_file_writer_new (void)
 {
-  struct ctf_trace_file_writer *writer
-    = xmalloc (sizeof (struct ctf_trace_file_writer));
+  struct ctf_trace_file_writer *writer = XNEW (struct ctf_trace_file_writer);
 
   writer->base.ops = &ctf_write_ops;
 
@@ -959,6 +917,12 @@ ctf_open_dir (const char *dirname)
                                                           (SCOPE),     \
                                                           #FIELD))
 
+#define SET_ENUM_FIELD(EVENT, SCOPE, VAR, TYPE, FIELD)                 \
+  (VAR)->FIELD = (TYPE) bt_ctf_get_int64 (bt_ctf_get_field ((EVENT),   \
+                                                           (SCOPE),    \
+                                                           #FIELD))
+
+
 /* EVENT is the "status" event and TS is filled in.  */
 
 static void
@@ -967,7 +931,7 @@ ctf_read_status (struct bt_ctf_event *event, struct trace_status *ts)
   const struct bt_definition *scope
     = bt_ctf_get_top_level_scope (event, BT_EVENT_FIELDS);
 
-  SET_INT32_FIELD (event, scope, ts, stop_reason);
+  SET_ENUM_FIELD (event, scope, ts, enum trace_stop_reason, stop_reason);
   SET_INT32_FIELD (event, scope, ts, stopping_tracepoint);
   SET_INT32_FIELD (event, scope, ts, traceframe_count);
   SET_INT32_FIELD (event, scope, ts, traceframes_created);
@@ -1103,7 +1067,7 @@ ctf_read_tp (struct uploaded_tp **uploaded_tps)
       SET_INT32_FIELD (event, scope, utp, step);
       SET_INT32_FIELD (event, scope, utp, pass);
       SET_INT32_FIELD (event, scope, utp, hit_count);
-      SET_INT32_FIELD (event, scope, utp, type);
+      SET_ENUM_FIELD (event, scope, utp, enum bptype, type);
 
       /* Read 'cmd_strings'.  */
       SET_ARRAY_FIELD (event, scope, utp, cmd_num, cmd_strings);
@@ -1318,7 +1282,7 @@ ctf_xfer_partial (struct target_ops *ops, enum target_object object,
 {
   /* We're only doing regular memory for now.  */
   if (object != TARGET_OBJECT_MEMORY)
-    return -1;
+    return TARGET_XFER_E_IO;
 
   if (readbuf == NULL)
     error (_("ctf_xfer_partial: trace file is read-only"));
@@ -1383,7 +1347,7 @@ ctf_xfer_partial (struct target_ops *ops, enum target_object object,
              gdb_byte *contents;
              int k;
 
-             contents = xmalloc (mlen);
+             contents = (gdb_byte *) xmalloc (mlen);
 
              for (k = 0; k < mlen; k++)
                {
@@ -1428,7 +1392,7 @@ ctf_xfer_partial (struct target_ops *ops, enum target_object object,
         and this address falls within a read-only section, fallback
         to reading from executable, up to LOW_ADDR_AVAILABLE  */
       if (offset < low_addr_available)
-       len = min (len, low_addr_available - offset);
+       len = std::min (len, low_addr_available - offset);
       res = exec_read_partial_read_only (readbuf, offset, len, xfered_len);
 
       if (res == TARGET_XFER_OK)
@@ -1723,7 +1687,7 @@ ctf_traceframe_info (struct target_ops *self)
          const struct bt_definition *def;
 
          def = bt_ctf_get_field (event, scope, "num");
-         vnum = (int) bt_ctf_get_int64 (def);
+         vnum = (int) bt_ctf_get_uint64 (def);
          VEC_safe_push (int, info->tvars, vnum);
        }
       else
This page took 0.029978 seconds and 4 git commands to generate.