Update copyright year range in all GDB files.
[deliverable/binutils-gdb.git] / gdb / common / btrace-common.c
index 0ea50f039f3b00f537bc8ea7920486ba563837c8..13f1f1a0fdd940492dc1498237ff3d1120275d2d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2014-2015 Free Software Foundation, Inc.
+/* Copyright (C) 2014-2019 Free Software Foundation, Inc.
 
    Contributed by Intel Corp. <markus.t.metzger@intel.com>
 
@@ -33,6 +33,9 @@ btrace_format_string (enum btrace_format format)
 
     case BTRACE_FORMAT_BTS:
       return _("Branch Trace Store");
+
+    case BTRACE_FORMAT_PT:
+      return _("Intel Processor Trace");
     }
 
   internal_error (__FILE__, __LINE__, _("Unknown branch trace format"));
@@ -40,25 +43,41 @@ btrace_format_string (enum btrace_format format)
 
 /* See btrace-common.h.  */
 
-void
-btrace_data_init (struct btrace_data *data)
+const char *
+btrace_format_short_string (enum btrace_format format)
 {
-  data->format = BTRACE_FORMAT_NONE;
+  switch (format)
+    {
+    case BTRACE_FORMAT_NONE:
+      return "unknown";
+
+    case BTRACE_FORMAT_BTS:
+      return "bts";
+
+    case BTRACE_FORMAT_PT:
+      return "pt";
+    }
+
+  internal_error (__FILE__, __LINE__, _("Unknown branch trace format"));
 }
 
 /* See btrace-common.h.  */
 
 void
-btrace_data_fini (struct btrace_data *data)
+btrace_data::fini ()
 {
-  switch (data->format)
+  switch (format)
     {
     case BTRACE_FORMAT_NONE:
       /* Nothing to do.  */
       return;
 
     case BTRACE_FORMAT_BTS:
-      VEC_free (btrace_block_s, data->variant.bts.blocks);
+      VEC_free (btrace_block_s, variant.bts.blocks);
+      return;
+
+    case BTRACE_FORMAT_PT:
+      xfree (variant.pt.data);
       return;
     }
 
@@ -67,16 +86,106 @@ btrace_data_fini (struct btrace_data *data)
 
 /* See btrace-common.h.  */
 
+bool
+btrace_data::empty () const
+{
+  switch (format)
+    {
+    case BTRACE_FORMAT_NONE:
+      return true;
+
+    case BTRACE_FORMAT_BTS:
+      return VEC_empty (btrace_block_s, variant.bts.blocks);
+
+    case BTRACE_FORMAT_PT:
+      return (variant.pt.size == 0);
+    }
+
+  internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
+}
+
+/* See btrace-common.h.  */
+
+void
+btrace_data::clear ()
+{
+  fini ();
+  format = BTRACE_FORMAT_NONE;
+}
+
+/* See btrace-common.h.  */
+
 int
-btrace_data_empty (struct btrace_data *data)
+btrace_data_append (struct btrace_data *dst,
+                   const struct btrace_data *src)
 {
-  switch (data->format)
+  switch (src->format)
     {
     case BTRACE_FORMAT_NONE:
-      return 1;
+      return 0;
 
     case BTRACE_FORMAT_BTS:
-      return VEC_empty (btrace_block_s, data->variant.bts.blocks);
+      switch (dst->format)
+       {
+       default:
+         return -1;
+
+       case BTRACE_FORMAT_NONE:
+         dst->format = BTRACE_FORMAT_BTS;
+         dst->variant.bts.blocks = NULL;
+
+         /* Fall-through.  */
+       case BTRACE_FORMAT_BTS:
+         {
+           unsigned int blk;
+
+           /* We copy blocks in reverse order to have the oldest block at
+              index zero.  */
+           blk = VEC_length (btrace_block_s, src->variant.bts.blocks);
+           while (blk != 0)
+             {
+               btrace_block_s *block;
+
+               block = VEC_index (btrace_block_s, src->variant.bts.blocks,
+                                  --blk);
+
+               VEC_safe_push (btrace_block_s, dst->variant.bts.blocks, block);
+             }
+         }
+       }
+      return 0;
+
+    case BTRACE_FORMAT_PT:
+      switch (dst->format)
+       {
+       default:
+         return -1;
+
+       case BTRACE_FORMAT_NONE:
+         dst->format = BTRACE_FORMAT_PT;
+         dst->variant.pt.data = NULL;
+         dst->variant.pt.size = 0;
+
+         /* fall-through.  */
+       case BTRACE_FORMAT_PT:
+         {
+           gdb_byte *data;
+           size_t size;
+
+           size = src->variant.pt.size + dst->variant.pt.size;
+           data = (gdb_byte *) xmalloc (size);
+
+           memcpy (data, dst->variant.pt.data, dst->variant.pt.size);
+           memcpy (data + dst->variant.pt.size, src->variant.pt.data,
+                   src->variant.pt.size);
+
+           xfree (dst->variant.pt.data);
+
+           dst->variant.pt.data = data;
+           dst->variant.pt.size = size;
+         }
+       }
+      return 0;
     }
 
   internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
This page took 0.026648 seconds and 4 git commands to generate.