Create individual fields for string metadata types

Instead of lumping them into a repeated field of string metadata, we
want to have a separate field for each string type (hostname, arch,
etc). This allows us to selectively omit fields for privacy reasons.

BUG=chromium:365023
TEST=perf_serializer_test passes

Change-Id: Ib0ae22da12de1c9ccc6d1bac7f63a29e89cb6700
Signed-off-by: Simon Que <sque@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/195686
Reviewed-by: Balazs Engedy <engedy@chromium.org>
Reviewed-by: Emma Rapati <rapati@chromium.org>
diff --git a/perf_data.proto b/perf_data.proto
index b4fdf28..00177db 100644
--- a/perf_data.proto
+++ b/perf_data.proto
@@ -11,7 +11,7 @@
 //
 // See $kernel/tools/perf/design.txt for more details.
 
-// Next tag: 13
+// Next tag: 14
 message PerfDataProto {
 
   // Perf event attribute. Stores the event description.
@@ -402,15 +402,6 @@
   }
 
   // Next tag: 3
-  message PerfStringMetadata {
-    // Type of metadata, such as hostname, osrelease, version, etc.
-    optional uint32 type = 1;
-
-    // String data.
-    repeated string data = 2;
-  }
-
-  // Next tag: 3
   message PerfUint32Metadata {
     // Type of metadata, such as nrcpus.
     optional uint32 type = 1;
@@ -497,8 +488,6 @@
   // See adds_features in perf_reader.cc
   repeated uint64 metadata_mask = 5;
 
-  repeated PerfStringMetadata string_metadata = 6;
-
   repeated PerfBuildID build_ids = 7;
 
   repeated PerfUint32Metadata uint32_metadata = 8;
@@ -508,4 +497,45 @@
   optional PerfCPUTopologyMetadata cpu_topology = 11;
 
   repeated PerfNodeTopologyMetadata numa_topology = 12;
+
+  // Next tag: 9
+  message StringMetadata {
+    // Next tag: 3
+    message StringAndMd5sumPrefix {
+      // The string value.
+      optional string value = 1;
+
+      // The string value's md5sum prefix.
+      optional uint64 value_md5_prefix = 2;
+    }
+
+    // Name of the machine, e.g. "localhost".
+    optional StringAndMd5sumPrefix hostname = 1;
+
+    // Kernel version, e.g. "3.4.0".
+    optional StringAndMd5sumPrefix kernel_version = 2;
+
+    // Perf version, e.g. "3.4.2642.g0aa604".
+    optional StringAndMd5sumPrefix perf_version = 3;
+
+    // CPU architecture family, e.g. "x86_64".
+    optional StringAndMd5sumPrefix architecture = 4;
+
+    // CPU description, e.g. "Intel(R) Celeron(R) CPU 867 @ 1.30GHz".
+    optional StringAndMd5sumPrefix cpu_description = 5;
+
+    // CPU ID string, with the format: "$VENDOR,$FAMILY,$MODEL,$STEP"
+    optional StringAndMd5sumPrefix cpu_id = 6;
+
+    // Command line used to run perf to collect this profile.
+    // This is split into string tokens to reflect the way it is stored in the
+    // raw perf data.  e.g. "perf record -a -- sleep 2" become stored as:
+    //   { "perf", "record", "-a", "--", "sleep", "2" }
+    repeated StringAndMd5sumPrefix perf_command_line_token = 7;
+
+    // The command line stored as a single string.
+    optional StringAndMd5sumPrefix perf_command_line_whole = 8;
+  }
+
+  optional StringMetadata string_metadata = 13;
 }
diff --git a/perf_serializer.cc b/perf_serializer.cc
index 27564a1..a5726b3 100644
--- a/perf_serializer.cc
+++ b/perf_serializer.cc
@@ -5,6 +5,7 @@
 #include "perf_serializer.h"
 
 #include <bitset>
+#include <utility>
 
 #include <stdio.h>
 #include <sys/time.h>
@@ -43,18 +44,7 @@
 
   perf_data_proto->add_metadata_mask(metadata_mask_);
 
-  if (!SerializeBuildIDs(
-          build_id_events_, perf_data_proto->mutable_build_ids()) ||
-      !SerializeStringMetadata(
-          string_metadata_, perf_data_proto->mutable_string_metadata()) ||
-      !SerializeUint32Metadata(
-          uint32_metadata_, perf_data_proto->mutable_uint32_metadata()) ||
-      !SerializeUint64Metadata(
-          uint64_metadata_, perf_data_proto->mutable_uint64_metadata()) ||
-      !SerializeCPUTopologyMetadata(
-          cpu_topology_, perf_data_proto->mutable_cpu_topology()) ||
-      !SerializeNUMATopologyMetadata(
-          numa_topology_, perf_data_proto->mutable_numa_topology())) {
+  if (!SerializeMetadata(perf_data_proto)) {
     return false;
   }
 
@@ -103,18 +93,7 @@
   if (perf_data_proto.metadata_mask_size())
     metadata_mask_ = perf_data_proto.metadata_mask(0);
 
-  if (!DeserializeBuildIDs(perf_data_proto.build_ids(),
-                           &build_id_events_) ||
-      !DeserializeStringMetadata(perf_data_proto.string_metadata(),
-                                 &string_metadata_) ||
-      !DeserializeUint32Metadata(perf_data_proto.uint32_metadata(),
-                                 &uint32_metadata_) ||
-      !DeserializeUint64Metadata(perf_data_proto.uint64_metadata(),
-                                 &uint64_metadata_) ||
-      !DeserializeCPUTopologyMetadata(perf_data_proto.cpu_topology(),
-                                      &cpu_topology_) ||
-      !DeserializeNUMATopologyMetadata(perf_data_proto.numa_topology(),
-                                       &numa_topology_)) {
+  if (!DeserializeMetadata(perf_data_proto)) {
     return false;
   }
 
@@ -724,6 +703,149 @@
   return DeserializeBuildIDEvents(from, to);
 }
 
+bool PerfSerializer::SerializeMetadata(PerfDataProto* to) const {
+  if (!SerializeBuildIDs(build_id_events_, to->mutable_build_ids()) ||
+      !SerializeUint32Metadata(uint32_metadata_,
+                               to->mutable_uint32_metadata()) ||
+      !SerializeUint64Metadata(uint64_metadata_,
+                               to->mutable_uint64_metadata()) ||
+      !SerializeCPUTopologyMetadata(cpu_topology_,
+                                    to->mutable_cpu_topology()) ||
+      !SerializeNUMATopologyMetadata(numa_topology_,
+                                     to->mutable_numa_topology())) {
+    return false;
+  }
+  typedef PerfDataProto_StringMetadata_StringAndMd5sumPrefix
+      StringAndMd5sumPrefix;
+  // Handle the string metadata specially.
+  for (size_t i = 0; i < string_metadata_.size(); ++i) {
+    StringAndMd5sumPrefix* to_metadata = NULL;
+    uint32 type = string_metadata_[i].type;
+    PerfDataProto_StringMetadata* proto_string_metadata =
+        to->mutable_string_metadata();
+    bool is_command_line = false;
+    switch (type) {
+    case HEADER_HOSTNAME:
+      to_metadata = proto_string_metadata->mutable_hostname();
+      break;
+    case HEADER_OSRELEASE:
+      to_metadata = proto_string_metadata->mutable_kernel_version();
+      break;
+    case HEADER_VERSION:
+      to_metadata = proto_string_metadata->mutable_perf_version();
+      break;
+    case HEADER_ARCH:
+      to_metadata = proto_string_metadata->mutable_architecture();
+      break;
+    case HEADER_CPUDESC:
+      to_metadata = proto_string_metadata->mutable_cpu_description();
+      break;
+    case HEADER_CPUID:
+      to_metadata = proto_string_metadata->mutable_cpu_id();
+      break;
+    case HEADER_CMDLINE:
+      is_command_line = true;
+      to_metadata = proto_string_metadata->mutable_perf_command_line_whole();
+      break;
+    default:
+      LOG(ERROR) << "Unsupported string metadata type: " << type;
+      continue;
+    }
+    if (is_command_line) {
+      // Handle command lines as a special case. It has two protobuf fields, one
+      // of which is a repeated field.
+      string full_command_line;
+      for (size_t j = 0; j < string_metadata_[i].data.size(); ++j) {
+        StringAndMd5sumPrefix* command_line_token =
+                proto_string_metadata->add_perf_command_line_token();
+        command_line_token->set_value(string_metadata_[i].data[j].str);
+        command_line_token->
+            set_value_md5_prefix(Md5Prefix(command_line_token->value()));
+        full_command_line += string_metadata_[i].data[j].str + " ";
+      }
+      // Delete the extra space at the end of the newly created command string.
+      TrimWhitespace(&full_command_line);
+      to_metadata->set_value(full_command_line);
+      to_metadata->set_value_md5_prefix(Md5Prefix(full_command_line));
+    } else {
+      DCHECK(to_metadata);  // Make sure a valid destination metadata was found.
+      to_metadata->set_value(string_metadata_[i].data[0].str);
+      to_metadata->set_value_md5_prefix(
+          Md5Prefix(string_metadata_[i].data[0].str));
+    }
+  }
+  return true;
+}
+
+bool PerfSerializer::DeserializeMetadata(const PerfDataProto& from) {
+  if (!DeserializeBuildIDs(from.build_ids(), &build_id_events_) ||
+      !DeserializeUint32Metadata(from.uint32_metadata(), &uint32_metadata_) ||
+      !DeserializeUint64Metadata(from.uint64_metadata(), &uint64_metadata_) ||
+      !DeserializeCPUTopologyMetadata(from.cpu_topology(), &cpu_topology_) ||
+      !DeserializeNUMATopologyMetadata(from.numa_topology(), &numa_topology_)) {
+    return false;
+  }
+
+  // Handle the string metadata specially.
+  typedef PerfDataProto_StringMetadata_StringAndMd5sumPrefix
+      StringAndMd5sumPrefix;
+  const PerfDataProto_StringMetadata& data = from.string_metadata();
+  std::vector<std::pair<u32, StringAndMd5sumPrefix> > metadata_strings;
+  if (data.has_hostname()) {
+    metadata_strings.push_back(
+        std::make_pair(static_cast<u32>(HEADER_HOSTNAME), data.hostname()));
+  }
+  if (data.has_kernel_version()) {
+    metadata_strings.push_back(
+        std::make_pair(static_cast<u32>(HEADER_OSRELEASE),
+                       data.kernel_version()));
+  }
+  if (data.has_perf_version()) {
+    metadata_strings.push_back(
+        std::make_pair(static_cast<u32>(HEADER_VERSION), data.perf_version()));
+  }
+  if (data.has_architecture()) {
+    metadata_strings.push_back(
+        std::make_pair(static_cast<u32>(HEADER_ARCH), data.architecture()));
+  }
+  if (data.has_cpu_description()) {
+    metadata_strings.push_back(
+        std::make_pair(static_cast<u32>(HEADER_CPUDESC),
+                       data.cpu_description()));
+  }
+  if (data.has_cpu_id()) {
+    metadata_strings.push_back(
+        std::make_pair(static_cast<u32>(HEADER_CPUID), data.cpu_id()));
+  }
+
+  // Add each string metadata element to |string_metadata_|.
+  for (size_t i = 0; i < metadata_strings.size(); ++i) {
+    PerfStringMetadata metadata;
+    metadata.type = metadata_strings[i].first;
+    CStringWithLength cstring;
+    cstring.str = metadata_strings[i].second.value();
+    cstring.len = cstring.str.size() + 1;   // Include the null terminator.
+    metadata.data.push_back(cstring);
+
+    string_metadata_.push_back(metadata);
+  }
+
+  // Add the command line tokens as a special case (repeated field).
+  if (data.perf_command_line_token_size() > 0) {
+    PerfStringMetadata metadata;
+    metadata.type = HEADER_CMDLINE;
+    for (int i = 0; i < data.perf_command_line_token_size(); ++i) {
+      CStringWithLength cstring;
+      cstring.str = data.perf_command_line_token(i).value();
+      cstring.len = cstring.str.size() + 1;   // Include the null terminator.
+      metadata.data.push_back(cstring);
+    }
+    string_metadata_.push_back(metadata);
+  }
+
+  return true;
+}
+
 bool PerfSerializer::SerializeBuildIDEvent(
     build_id_event* const& from,
     PerfDataProto_PerfBuildID* to) const {
@@ -755,28 +877,6 @@
   return true;
 }
 
-bool PerfSerializer::SerializeSingleStringMetadata(
-    const PerfStringMetadata& metadata,
-    PerfDataProto_PerfStringMetadata* proto_metadata) const {
-  proto_metadata->set_type(metadata.type);
-  for (size_t i = 0; i < metadata.data.size(); ++i)
-    proto_metadata->add_data(metadata.data[i].str);
-  return true;
-}
-
-bool PerfSerializer::DeserializeSingleStringMetadata(
-    const PerfDataProto_PerfStringMetadata& proto_metadata,
-    PerfStringMetadata* metadata) const {
-  metadata->type = proto_metadata.type();
-  for (int i = 0; i < proto_metadata.data_size(); ++i) {
-    CStringWithLength single_string;
-    single_string.str = proto_metadata.data(i);
-    single_string.len = GetUint64AlignedStringLength(single_string.str);
-    metadata->data.push_back(single_string);
-  }
-  return true;
-}
-
 bool PerfSerializer::SerializeSingleUint32Metadata(
     const PerfUint32Metadata& metadata,
     PerfDataProto_PerfUint32Metadata* proto_metadata) const {
diff --git a/perf_serializer.h b/perf_serializer.h
index 9c2e47e..1e30802 100644
--- a/perf_serializer.h
+++ b/perf_serializer.h
@@ -129,18 +129,14 @@
       RepeatedPtrField<PerfDataProto_PerfBuildID>& from,
       std::vector<build_id_event*>* to) const;
 
+  bool SerializeMetadata(PerfDataProto* to) const;
+  bool DeserializeMetadata(const PerfDataProto& from);
+
   bool SerializeBuildIDEvent(build_id_event* const& from,
                              PerfDataProto_PerfBuildID* to) const;
   bool DeserializeBuildIDEvent(const PerfDataProto_PerfBuildID& from,
                                build_id_event** to) const;
 
-  bool SerializeSingleStringMetadata(
-      const PerfStringMetadata& metadata,
-      PerfDataProto_PerfStringMetadata* proto_metadata) const;
-  bool DeserializeSingleStringMetadata(
-      const PerfDataProto_PerfStringMetadata& proto_metadata,
-      PerfStringMetadata* metadata) const;
-
   bool SerializeSingleUint32Metadata(
       const PerfUint32Metadata& metadata,
       PerfDataProto_PerfUint32Metadata* proto_metadata) const;
@@ -226,13 +222,6 @@
                             quipper::PerfDataProto_PerfBuildID,
                             DeserializeBuildIDEvent)
 
-  SERIALIZEVECTORFUNCTION(SerializeStringMetadata, PerfStringMetadata,
-                          quipper::PerfDataProto_PerfStringMetadata,
-                          SerializeSingleStringMetadata)
-  DESERIALIZEVECTORFUNCTION(DeserializeStringMetadata, PerfStringMetadata,
-                            quipper::PerfDataProto_PerfStringMetadata,
-                            DeserializeSingleStringMetadata)
-
   SERIALIZEVECTORFUNCTION(SerializeUint32Metadata, PerfUint32Metadata,
                           quipper::PerfDataProto_PerfUint32Metadata,
                           SerializeSingleUint32Metadata)
diff --git a/test_utils.cc b/test_utils.cc
index 92e0496..21ee49b 100644
--- a/test_utils.cc
+++ b/test_utils.cc
@@ -71,19 +71,6 @@
   return args;
 }
 
-// Trim leading and trailing whitespace from |str|.
-void TrimWhitespace(string* str) {
-  const char kWhitespaceCharacters[] = " \t\n\r";
-  size_t end = str->find_last_not_of(kWhitespaceCharacters);
-  if (end != std::string::npos) {
-    size_t start = str->find_first_not_of(kWhitespaceCharacters);
-    *str = str->substr(start, end + 1 - start);
-  } else {
-    // The string contains only whitespace.
-    *str = "";
-  }
-}
-
 // Splits a character array by |delimiter| into a vector of strings tokens.
 void SplitString(const string& str,
                  char delimiter,
diff --git a/testdata/perf.data.armv7.io.out.pb_text.gz b/testdata/perf.data.armv7.io.out.pb_text.gz
index 2701477..dec335c 100644
--- a/testdata/perf.data.armv7.io.out.pb_text.gz
+++ b/testdata/perf.data.armv7.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.armv7.parse.out.pb_text.gz b/testdata/perf.data.armv7.parse.out.pb_text.gz
index d7c451d..dec335c 100644
--- a/testdata/perf.data.armv7.parse.out.pb_text.gz
+++ b/testdata/perf.data.armv7.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.armv7.parse.remap.out.pb_text.gz b/testdata/perf.data.armv7.parse.remap.out.pb_text.gz
index 249aa0b..d805351 100644
--- a/testdata/perf.data.armv7.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.armv7.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.armv7.parse.remap2.out.pb_text.gz b/testdata/perf.data.armv7.parse.remap2.out.pb_text.gz
index 8f36ff3..d805351 100644
--- a/testdata/perf.data.armv7.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.armv7.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.armv7.pb_text.gz b/testdata/perf.data.armv7.pb_text.gz
index dbbdae6..dec335c 100644
--- a/testdata/perf.data.armv7.pb_text.gz
+++ b/testdata/perf.data.armv7.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.armv7.pr.out.pb_text.gz b/testdata/perf.data.armv7.pr.out.pb_text.gz
index a9d2415..dec335c 100644
--- a/testdata/perf.data.armv7.pr.out.pb_text.gz
+++ b/testdata/perf.data.armv7.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.armv7.ser.comm.out.pb_text.gz b/testdata/perf.data.armv7.ser.comm.out.pb_text.gz
index ca9f6c0..3243389 100644
--- a/testdata/perf.data.armv7.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.armv7.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.armv7.serialized.out.pb_text.gz b/testdata/perf.data.armv7.serialized.out.pb_text.gz
index 86244e5..dec335c 100644
--- a/testdata/perf.data.armv7.serialized.out.pb_text.gz
+++ b/testdata/perf.data.armv7.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.io.out.pb_text.gz b/testdata/perf.data.branch.io.out.pb_text.gz
index 1a4e66c..af894a5 100644
--- a/testdata/perf.data.branch.io.out.pb_text.gz
+++ b/testdata/perf.data.branch.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.next.io.out.pb_text.gz b/testdata/perf.data.branch.next.io.out.pb_text.gz
index 2827016..cf146e0 100644
--- a/testdata/perf.data.branch.next.io.out.pb_text.gz
+++ b/testdata/perf.data.branch.next.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.next.parse.out.pb_text.gz b/testdata/perf.data.branch.next.parse.out.pb_text.gz
index 9a07f13..cf146e0 100644
--- a/testdata/perf.data.branch.next.parse.out.pb_text.gz
+++ b/testdata/perf.data.branch.next.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.next.parse.remap.out.pb_text.gz b/testdata/perf.data.branch.next.parse.remap.out.pb_text.gz
index 4aed957..debf9bd 100644
--- a/testdata/perf.data.branch.next.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.branch.next.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.next.parse.remap2.out.pb_text.gz b/testdata/perf.data.branch.next.parse.remap2.out.pb_text.gz
index 233a18a..debf9bd 100644
--- a/testdata/perf.data.branch.next.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.branch.next.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.next.pb_text.gz b/testdata/perf.data.branch.next.pb_text.gz
index 96ed7bc..b1887dc 100644
--- a/testdata/perf.data.branch.next.pb_text.gz
+++ b/testdata/perf.data.branch.next.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.next.pr.out.pb_text.gz b/testdata/perf.data.branch.next.pr.out.pb_text.gz
index 324dd88..cf146e0 100644
--- a/testdata/perf.data.branch.next.pr.out.pb_text.gz
+++ b/testdata/perf.data.branch.next.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.next.ser.comm.out.pb_text.gz b/testdata/perf.data.branch.next.ser.comm.out.pb_text.gz
index d07838f..dbb77a8 100644
--- a/testdata/perf.data.branch.next.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.branch.next.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.next.serialized.out.pb_text.gz b/testdata/perf.data.branch.next.serialized.out.pb_text.gz
index acff6f3..1696e75 100644
--- a/testdata/perf.data.branch.next.serialized.out.pb_text.gz
+++ b/testdata/perf.data.branch.next.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.parse.out.pb_text.gz b/testdata/perf.data.branch.parse.out.pb_text.gz
index 6cd0e8e..af894a5 100644
--- a/testdata/perf.data.branch.parse.out.pb_text.gz
+++ b/testdata/perf.data.branch.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.parse.remap.out.pb_text.gz b/testdata/perf.data.branch.parse.remap.out.pb_text.gz
index cbf2bfa..e1232c3 100644
--- a/testdata/perf.data.branch.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.branch.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.parse.remap2.out.pb_text.gz b/testdata/perf.data.branch.parse.remap2.out.pb_text.gz
index 8745733..e1232c3 100644
--- a/testdata/perf.data.branch.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.branch.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.pb_text.gz b/testdata/perf.data.branch.pb_text.gz
index 3e4197e..af894a5 100644
--- a/testdata/perf.data.branch.pb_text.gz
+++ b/testdata/perf.data.branch.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.pr.out.pb_text.gz b/testdata/perf.data.branch.pr.out.pb_text.gz
index 715b82c..af894a5 100644
--- a/testdata/perf.data.branch.pr.out.pb_text.gz
+++ b/testdata/perf.data.branch.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.ser.comm.out.pb_text.gz b/testdata/perf.data.branch.ser.comm.out.pb_text.gz
index c30cf84..a548d00 100644
--- a/testdata/perf.data.branch.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.branch.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.branch.serialized.out.pb_text.gz b/testdata/perf.data.branch.serialized.out.pb_text.gz
index dc50f60..e55fb19 100644
--- a/testdata/perf.data.branch.serialized.out.pb_text.gz
+++ b/testdata/perf.data.branch.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.io.out.pb_text.gz b/testdata/perf.data.busy.0.io.out.pb_text.gz
index 857a478..6218e70 100644
--- a/testdata/perf.data.busy.0.io.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.next.io.out.pb_text.gz b/testdata/perf.data.busy.0.next.io.out.pb_text.gz
index 6e72cf1..f3aa817 100644
--- a/testdata/perf.data.busy.0.next.io.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.next.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.next.parse.out.pb_text.gz b/testdata/perf.data.busy.0.next.parse.out.pb_text.gz
index 5a33ec7..f3aa817 100644
--- a/testdata/perf.data.busy.0.next.parse.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.next.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.next.parse.remap.out.pb_text.gz b/testdata/perf.data.busy.0.next.parse.remap.out.pb_text.gz
index fae027e..a3943c4 100644
--- a/testdata/perf.data.busy.0.next.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.next.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.next.parse.remap2.out.pb_text.gz b/testdata/perf.data.busy.0.next.parse.remap2.out.pb_text.gz
index 9b5cc5a..a3943c4 100644
--- a/testdata/perf.data.busy.0.next.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.next.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.next.pb_text.gz b/testdata/perf.data.busy.0.next.pb_text.gz
index ddc1a91..cbcc433 100644
--- a/testdata/perf.data.busy.0.next.pb_text.gz
+++ b/testdata/perf.data.busy.0.next.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.next.pr.out.pb_text.gz b/testdata/perf.data.busy.0.next.pr.out.pb_text.gz
index d5031b8..f3aa817 100644
--- a/testdata/perf.data.busy.0.next.pr.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.next.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.next.ser.comm.out.pb_text.gz b/testdata/perf.data.busy.0.next.ser.comm.out.pb_text.gz
index 91f75f8..c1eae67 100644
--- a/testdata/perf.data.busy.0.next.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.next.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.next.serialized.out.pb_text.gz b/testdata/perf.data.busy.0.next.serialized.out.pb_text.gz
index d0a19f7..de34c39 100644
--- a/testdata/perf.data.busy.0.next.serialized.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.next.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.parse.out.pb_text.gz b/testdata/perf.data.busy.0.parse.out.pb_text.gz
index a9b9fe3..6218e70 100644
--- a/testdata/perf.data.busy.0.parse.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.parse.remap.out.pb_text.gz b/testdata/perf.data.busy.0.parse.remap.out.pb_text.gz
index e486ef2..b19fcba 100644
--- a/testdata/perf.data.busy.0.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.parse.remap2.out.pb_text.gz b/testdata/perf.data.busy.0.parse.remap2.out.pb_text.gz
index 73f69e8..b19fcba 100644
--- a/testdata/perf.data.busy.0.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.pb_text.gz b/testdata/perf.data.busy.0.pb_text.gz
index 719330b..6218e70 100644
--- a/testdata/perf.data.busy.0.pb_text.gz
+++ b/testdata/perf.data.busy.0.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.pr.out.pb_text.gz b/testdata/perf.data.busy.0.pr.out.pb_text.gz
index e5c6485..6218e70 100644
--- a/testdata/perf.data.busy.0.pr.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.ser.comm.out.pb_text.gz b/testdata/perf.data.busy.0.ser.comm.out.pb_text.gz
index 6b5231c..edeb9c6 100644
--- a/testdata/perf.data.busy.0.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.0.serialized.out.pb_text.gz b/testdata/perf.data.busy.0.serialized.out.pb_text.gz
index 9796e26..0437fca 100644
--- a/testdata/perf.data.busy.0.serialized.out.pb_text.gz
+++ b/testdata/perf.data.busy.0.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.io.out.pb_text.gz b/testdata/perf.data.busy.1.io.out.pb_text.gz
index a843089..f82c922 100644
--- a/testdata/perf.data.busy.1.io.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.next.io.out.pb_text.gz b/testdata/perf.data.busy.1.next.io.out.pb_text.gz
index 7f10510..411b5d6 100644
--- a/testdata/perf.data.busy.1.next.io.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.next.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.next.parse.out.pb_text.gz b/testdata/perf.data.busy.1.next.parse.out.pb_text.gz
index b6a47a7..411b5d6 100644
--- a/testdata/perf.data.busy.1.next.parse.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.next.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.next.parse.remap.out.pb_text.gz b/testdata/perf.data.busy.1.next.parse.remap.out.pb_text.gz
index 9264048..35033cc 100644
--- a/testdata/perf.data.busy.1.next.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.next.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.next.parse.remap2.out.pb_text.gz b/testdata/perf.data.busy.1.next.parse.remap2.out.pb_text.gz
index eb5ba97..35033cc 100644
--- a/testdata/perf.data.busy.1.next.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.next.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.next.pb_text.gz b/testdata/perf.data.busy.1.next.pb_text.gz
index 3ad8be7..c3ef849 100644
--- a/testdata/perf.data.busy.1.next.pb_text.gz
+++ b/testdata/perf.data.busy.1.next.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.next.pr.out.pb_text.gz b/testdata/perf.data.busy.1.next.pr.out.pb_text.gz
index 0d2f576..411b5d6 100644
--- a/testdata/perf.data.busy.1.next.pr.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.next.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.next.ser.comm.out.pb_text.gz b/testdata/perf.data.busy.1.next.ser.comm.out.pb_text.gz
index c723ba7..8ec26f7 100644
--- a/testdata/perf.data.busy.1.next.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.next.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.next.serialized.out.pb_text.gz b/testdata/perf.data.busy.1.next.serialized.out.pb_text.gz
index 957f300..411b5d6 100644
--- a/testdata/perf.data.busy.1.next.serialized.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.next.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.parse.out.pb_text.gz b/testdata/perf.data.busy.1.parse.out.pb_text.gz
index 0222b29..f82c922 100644
--- a/testdata/perf.data.busy.1.parse.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.parse.remap.out.pb_text.gz b/testdata/perf.data.busy.1.parse.remap.out.pb_text.gz
index 47a9136..405f325 100644
--- a/testdata/perf.data.busy.1.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.parse.remap2.out.pb_text.gz b/testdata/perf.data.busy.1.parse.remap2.out.pb_text.gz
index 108cf17..405f325 100644
--- a/testdata/perf.data.busy.1.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.pb_text.gz b/testdata/perf.data.busy.1.pb_text.gz
index b347dba..f82c922 100644
--- a/testdata/perf.data.busy.1.pb_text.gz
+++ b/testdata/perf.data.busy.1.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.pr.out.pb_text.gz b/testdata/perf.data.busy.1.pr.out.pb_text.gz
index 9d7481e..f82c922 100644
--- a/testdata/perf.data.busy.1.pr.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.ser.comm.out.pb_text.gz b/testdata/perf.data.busy.1.ser.comm.out.pb_text.gz
index e31a59d..9fed740 100644
--- a/testdata/perf.data.busy.1.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.1.serialized.out.pb_text.gz b/testdata/perf.data.busy.1.serialized.out.pb_text.gz
index 3777fd3..f82c922 100644
--- a/testdata/perf.data.busy.1.serialized.out.pb_text.gz
+++ b/testdata/perf.data.busy.1.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.io.out.pb_text.gz b/testdata/perf.data.busy.5.io.out.pb_text.gz
index 94f9bbf..ba7c8cc 100644
--- a/testdata/perf.data.busy.5.io.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.next.io.out.pb_text.gz b/testdata/perf.data.busy.5.next.io.out.pb_text.gz
index 80fb0e9..e20f3fe 100644
--- a/testdata/perf.data.busy.5.next.io.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.next.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.next.parse.out.pb_text.gz b/testdata/perf.data.busy.5.next.parse.out.pb_text.gz
index aa57bba..e20f3fe 100644
--- a/testdata/perf.data.busy.5.next.parse.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.next.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.next.parse.remap.out.pb_text.gz b/testdata/perf.data.busy.5.next.parse.remap.out.pb_text.gz
index 5415f0c..7c567ec 100644
--- a/testdata/perf.data.busy.5.next.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.next.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.next.parse.remap2.out.pb_text.gz b/testdata/perf.data.busy.5.next.parse.remap2.out.pb_text.gz
index e5362eb..7c567ec 100644
--- a/testdata/perf.data.busy.5.next.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.next.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.next.pb_text.gz b/testdata/perf.data.busy.5.next.pb_text.gz
index aaf8e08..bfcec4f 100644
--- a/testdata/perf.data.busy.5.next.pb_text.gz
+++ b/testdata/perf.data.busy.5.next.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.next.pr.out.pb_text.gz b/testdata/perf.data.busy.5.next.pr.out.pb_text.gz
index 36dd827..e20f3fe 100644
--- a/testdata/perf.data.busy.5.next.pr.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.next.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.next.ser.comm.out.pb_text.gz b/testdata/perf.data.busy.5.next.ser.comm.out.pb_text.gz
index ba7f6fd..0827a6e 100644
--- a/testdata/perf.data.busy.5.next.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.next.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.next.serialized.out.pb_text.gz b/testdata/perf.data.busy.5.next.serialized.out.pb_text.gz
index 5e0e651..cdb0b83 100644
--- a/testdata/perf.data.busy.5.next.serialized.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.next.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.parse.out.pb_text.gz b/testdata/perf.data.busy.5.parse.out.pb_text.gz
index bb1a3c6..ba7c8cc 100644
--- a/testdata/perf.data.busy.5.parse.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.parse.remap.out.pb_text.gz b/testdata/perf.data.busy.5.parse.remap.out.pb_text.gz
index 6fb1c3a..f2f0b1f 100644
--- a/testdata/perf.data.busy.5.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.parse.remap2.out.pb_text.gz b/testdata/perf.data.busy.5.parse.remap2.out.pb_text.gz
index 3a718fe..f2f0b1f 100644
--- a/testdata/perf.data.busy.5.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.pb_text.gz b/testdata/perf.data.busy.5.pb_text.gz
index 03ce848..ba7c8cc 100644
--- a/testdata/perf.data.busy.5.pb_text.gz
+++ b/testdata/perf.data.busy.5.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.pr.out.pb_text.gz b/testdata/perf.data.busy.5.pr.out.pb_text.gz
index 614155e..ba7c8cc 100644
--- a/testdata/perf.data.busy.5.pr.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.ser.comm.out.pb_text.gz b/testdata/perf.data.busy.5.ser.comm.out.pb_text.gz
index 4588bc3..1947bd9 100644
--- a/testdata/perf.data.busy.5.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.busy.5.serialized.out.pb_text.gz b/testdata/perf.data.busy.5.serialized.out.pb_text.gz
index 1f0ee3a..fc82ee0 100644
--- a/testdata/perf.data.busy.5.serialized.out.pb_text.gz
+++ b/testdata/perf.data.busy.5.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.cycles_and_branch.io.out.pb_text.gz b/testdata/perf.data.cycles_and_branch.io.out.pb_text.gz
index 51cb683..07863fc 100644
--- a/testdata/perf.data.cycles_and_branch.io.out.pb_text.gz
+++ b/testdata/perf.data.cycles_and_branch.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.cycles_and_branch.parse.out.pb_text.gz b/testdata/perf.data.cycles_and_branch.parse.out.pb_text.gz
index 3ea66cc..07863fc 100644
--- a/testdata/perf.data.cycles_and_branch.parse.out.pb_text.gz
+++ b/testdata/perf.data.cycles_and_branch.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.cycles_and_branch.parse.remap.out.pb_text.gz b/testdata/perf.data.cycles_and_branch.parse.remap.out.pb_text.gz
index 40b3aa4..85bdbba 100644
--- a/testdata/perf.data.cycles_and_branch.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.cycles_and_branch.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.cycles_and_branch.parse.remap2.out.pb_text.gz b/testdata/perf.data.cycles_and_branch.parse.remap2.out.pb_text.gz
index cfef53c..85bdbba 100644
--- a/testdata/perf.data.cycles_and_branch.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.cycles_and_branch.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.cycles_and_branch.pb_text.gz b/testdata/perf.data.cycles_and_branch.pb_text.gz
index 06e260b..07863fc 100644
--- a/testdata/perf.data.cycles_and_branch.pb_text.gz
+++ b/testdata/perf.data.cycles_and_branch.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.cycles_and_branch.pr.out.pb_text.gz b/testdata/perf.data.cycles_and_branch.pr.out.pb_text.gz
index 952a215..07863fc 100644
--- a/testdata/perf.data.cycles_and_branch.pr.out.pb_text.gz
+++ b/testdata/perf.data.cycles_and_branch.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.cycles_and_branch.ser.comm.out.pb_text.gz b/testdata/perf.data.cycles_and_branch.ser.comm.out.pb_text.gz
index 46893d8..3dac74f 100644
--- a/testdata/perf.data.cycles_and_branch.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.cycles_and_branch.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.cycles_and_branch.serialized.out.pb_text.gz b/testdata/perf.data.cycles_and_branch.serialized.out.pb_text.gz
index a9facc8..55e0e7d 100644
--- a/testdata/perf.data.cycles_and_branch.serialized.out.pb_text.gz
+++ b/testdata/perf.data.cycles_and_branch.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.io.out.pb_text.gz b/testdata/perf.data.forkexit.io.out.pb_text.gz
index febfd59..bffac40 100644
--- a/testdata/perf.data.forkexit.io.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.next.io.out.pb_text.gz b/testdata/perf.data.forkexit.next.io.out.pb_text.gz
index faf4e50..656401b 100644
--- a/testdata/perf.data.forkexit.next.io.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.next.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.next.parse.out.pb_text.gz b/testdata/perf.data.forkexit.next.parse.out.pb_text.gz
index 537281d..656401b 100644
--- a/testdata/perf.data.forkexit.next.parse.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.next.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.next.parse.remap.out.pb_text.gz b/testdata/perf.data.forkexit.next.parse.remap.out.pb_text.gz
index c489b49..e6e7a06 100644
--- a/testdata/perf.data.forkexit.next.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.next.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.next.parse.remap2.out.pb_text.gz b/testdata/perf.data.forkexit.next.parse.remap2.out.pb_text.gz
index 9b07c23..e6e7a06 100644
--- a/testdata/perf.data.forkexit.next.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.next.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.next.pb_text.gz b/testdata/perf.data.forkexit.next.pb_text.gz
index 1c6007e..17b05b1 100644
--- a/testdata/perf.data.forkexit.next.pb_text.gz
+++ b/testdata/perf.data.forkexit.next.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.next.pr.out.pb_text.gz b/testdata/perf.data.forkexit.next.pr.out.pb_text.gz
index 45aecba..656401b 100644
--- a/testdata/perf.data.forkexit.next.pr.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.next.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.next.ser.comm.out.pb_text.gz b/testdata/perf.data.forkexit.next.ser.comm.out.pb_text.gz
index ab0c2c8..5f64436 100644
--- a/testdata/perf.data.forkexit.next.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.next.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.next.serialized.out.pb_text.gz b/testdata/perf.data.forkexit.next.serialized.out.pb_text.gz
index 6b3637a..656401b 100644
--- a/testdata/perf.data.forkexit.next.serialized.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.next.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.parse.out.pb_text.gz b/testdata/perf.data.forkexit.parse.out.pb_text.gz
index f977663..bffac40 100644
--- a/testdata/perf.data.forkexit.parse.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.parse.remap.out.pb_text.gz b/testdata/perf.data.forkexit.parse.remap.out.pb_text.gz
index 3c5c59d..bc7611e 100644
--- a/testdata/perf.data.forkexit.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.parse.remap2.out.pb_text.gz b/testdata/perf.data.forkexit.parse.remap2.out.pb_text.gz
index 9e4b563..bc7611e 100644
--- a/testdata/perf.data.forkexit.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.pb_text.gz b/testdata/perf.data.forkexit.pb_text.gz
index 872388c..bffac40 100644
--- a/testdata/perf.data.forkexit.pb_text.gz
+++ b/testdata/perf.data.forkexit.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.pr.out.pb_text.gz b/testdata/perf.data.forkexit.pr.out.pb_text.gz
index e4df5bd..bffac40 100644
--- a/testdata/perf.data.forkexit.pr.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.ser.comm.out.pb_text.gz b/testdata/perf.data.forkexit.ser.comm.out.pb_text.gz
index 405e874..f22926b 100644
--- a/testdata/perf.data.forkexit.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.forkexit.serialized.out.pb_text.gz b/testdata/perf.data.forkexit.serialized.out.pb_text.gz
index 9a1f66c..bffac40 100644
--- a/testdata/perf.data.forkexit.serialized.out.pb_text.gz
+++ b/testdata/perf.data.forkexit.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.i686.io.out.pb_text.gz b/testdata/perf.data.i686.io.out.pb_text.gz
index 35c2105..8cc9d74 100644
--- a/testdata/perf.data.i686.io.out.pb_text.gz
+++ b/testdata/perf.data.i686.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.i686.parse.out.pb_text.gz b/testdata/perf.data.i686.parse.out.pb_text.gz
index f76cdd2..8cc9d74 100644
--- a/testdata/perf.data.i686.parse.out.pb_text.gz
+++ b/testdata/perf.data.i686.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.i686.parse.remap.out.pb_text.gz b/testdata/perf.data.i686.parse.remap.out.pb_text.gz
index eee8435..e7db807 100644
--- a/testdata/perf.data.i686.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.i686.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.i686.parse.remap2.out.pb_text.gz b/testdata/perf.data.i686.parse.remap2.out.pb_text.gz
index da09ae5..e7db807 100644
--- a/testdata/perf.data.i686.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.i686.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.i686.pb_text.gz b/testdata/perf.data.i686.pb_text.gz
index 9526553..8cc9d74 100644
--- a/testdata/perf.data.i686.pb_text.gz
+++ b/testdata/perf.data.i686.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.i686.pr.out.pb_text.gz b/testdata/perf.data.i686.pr.out.pb_text.gz
index 52ff2a8..8cc9d74 100644
--- a/testdata/perf.data.i686.pr.out.pb_text.gz
+++ b/testdata/perf.data.i686.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.i686.ser.comm.out.pb_text.gz b/testdata/perf.data.i686.ser.comm.out.pb_text.gz
index 913fdd4..c580fd5 100644
--- a/testdata/perf.data.i686.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.i686.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.i686.serialized.out.pb_text.gz b/testdata/perf.data.i686.serialized.out.pb_text.gz
index b684618..4250de6 100644
--- a/testdata/perf.data.i686.serialized.out.pb_text.gz
+++ b/testdata/perf.data.i686.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.numatopology.io.out.pb_text.gz b/testdata/perf.data.numatopology.io.out.pb_text.gz
index 0de94ab..72cb484 100644
--- a/testdata/perf.data.numatopology.io.out.pb_text.gz
+++ b/testdata/perf.data.numatopology.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.numatopology.parse.out.pb_text.gz b/testdata/perf.data.numatopology.parse.out.pb_text.gz
index 8e93664..72cb484 100644
--- a/testdata/perf.data.numatopology.parse.out.pb_text.gz
+++ b/testdata/perf.data.numatopology.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.numatopology.parse.remap.out.pb_text.gz b/testdata/perf.data.numatopology.parse.remap.out.pb_text.gz
index 4699a07..3d6671a 100644
--- a/testdata/perf.data.numatopology.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.numatopology.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.numatopology.parse.remap2.out.pb_text.gz b/testdata/perf.data.numatopology.parse.remap2.out.pb_text.gz
index 8fbd879..3d6671a 100644
--- a/testdata/perf.data.numatopology.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.numatopology.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.numatopology.pb_text.gz b/testdata/perf.data.numatopology.pb_text.gz
index effe655..72cb484 100644
--- a/testdata/perf.data.numatopology.pb_text.gz
+++ b/testdata/perf.data.numatopology.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.numatopology.pr.out.pb_text.gz b/testdata/perf.data.numatopology.pr.out.pb_text.gz
index af6671d..72cb484 100644
--- a/testdata/perf.data.numatopology.pr.out.pb_text.gz
+++ b/testdata/perf.data.numatopology.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.numatopology.ser.comm.out.pb_text.gz b/testdata/perf.data.numatopology.ser.comm.out.pb_text.gz
index c271f9f..a756898 100644
--- a/testdata/perf.data.numatopology.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.numatopology.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.numatopology.serialized.out.pb_text.gz b/testdata/perf.data.numatopology.serialized.out.pb_text.gz
index 9c49674..72cb484 100644
--- a/testdata/perf.data.numatopology.serialized.out.pb_text.gz
+++ b/testdata/perf.data.numatopology.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.extrabyte.pb_text.gz b/testdata/perf.data.piped.extrabyte.pb_text.gz
index 6cc339a..4a83049 100644
--- a/testdata/perf.data.piped.extrabyte.pb_text.gz
+++ b/testdata/perf.data.piped.extrabyte.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.extrabyte.pr.out.pb_text.gz b/testdata/perf.data.piped.extrabyte.pr.out.pb_text.gz
index c37a576..b5b2c91 100644
--- a/testdata/perf.data.piped.extrabyte.pr.out.pb_text.gz
+++ b/testdata/perf.data.piped.extrabyte.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.extradata.pb_text.gz b/testdata/perf.data.piped.extradata.pb_text.gz
index a54822f..4a83049 100644
--- a/testdata/perf.data.piped.extradata.pb_text.gz
+++ b/testdata/perf.data.piped.extradata.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.extradata.pr.out.pb_text.gz b/testdata/perf.data.piped.extradata.pr.out.pb_text.gz
index 24360fa..b5b2c91 100644
--- a/testdata/perf.data.piped.extradata.pr.out.pb_text.gz
+++ b/testdata/perf.data.piped.extradata.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.host.pb_text.gz b/testdata/perf.data.piped.host.pb_text.gz
index cbfa005..ed94e1b 100644
--- a/testdata/perf.data.piped.host.pb_text.gz
+++ b/testdata/perf.data.piped.host.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.host.pr.out.pb_text.gz b/testdata/perf.data.piped.host.pr.out.pb_text.gz
index c6d6114..ed94e1b 100644
--- a/testdata/perf.data.piped.host.pr.out.pb_text.gz
+++ b/testdata/perf.data.piped.host.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.hw_and_sw.pb_text.gz b/testdata/perf.data.piped.hw_and_sw.pb_text.gz
index 1dfd6b8..d991534 100644
--- a/testdata/perf.data.piped.hw_and_sw.pb_text.gz
+++ b/testdata/perf.data.piped.hw_and_sw.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.hw_and_sw.pr.out.pb_text.gz b/testdata/perf.data.piped.hw_and_sw.pr.out.pb_text.gz
index 5561148..d991534 100644
--- a/testdata/perf.data.piped.hw_and_sw.pr.out.pb_text.gz
+++ b/testdata/perf.data.piped.hw_and_sw.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.target.next.pb_text.gz b/testdata/perf.data.piped.target.next.pb_text.gz
index 55b0fc0..b5b2c91 100644
--- a/testdata/perf.data.piped.target.next.pb_text.gz
+++ b/testdata/perf.data.piped.target.next.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.target.next.pr.out.pb_text.gz b/testdata/perf.data.piped.target.next.pr.out.pb_text.gz
index 2af7704..b5b2c91 100644
--- a/testdata/perf.data.piped.target.next.pr.out.pb_text.gz
+++ b/testdata/perf.data.piped.target.next.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.target.pb_text.gz b/testdata/perf.data.piped.target.pb_text.gz
index 2b842b8..32b74fd 100644
--- a/testdata/perf.data.piped.target.pb_text.gz
+++ b/testdata/perf.data.piped.target.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.target.pr.out.pb_text.gz b/testdata/perf.data.piped.target.pr.out.pb_text.gz
index 79d2ea0..32b74fd 100644
--- a/testdata/perf.data.piped.target.pr.out.pb_text.gz
+++ b/testdata/perf.data.piped.target.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.target.throttled.pb_text.gz b/testdata/perf.data.piped.target.throttled.pb_text.gz
index 7447ff5..fa8330a 100644
--- a/testdata/perf.data.piped.target.throttled.pb_text.gz
+++ b/testdata/perf.data.piped.target.throttled.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.piped.target.throttled.pr.out.pb_text.gz b/testdata/perf.data.piped.target.throttled.pr.out.pb_text.gz
index cb2023c..fa8330a 100644
--- a/testdata/perf.data.piped.target.throttled.pr.out.pb_text.gz
+++ b/testdata/perf.data.piped.target.throttled.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.raw.io.out.pb_text.gz b/testdata/perf.data.raw.io.out.pb_text.gz
index 82b09be..c38feef 100644
--- a/testdata/perf.data.raw.io.out.pb_text.gz
+++ b/testdata/perf.data.raw.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.raw.parse.out.pb_text.gz b/testdata/perf.data.raw.parse.out.pb_text.gz
index 2560071..c38feef 100644
--- a/testdata/perf.data.raw.parse.out.pb_text.gz
+++ b/testdata/perf.data.raw.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.raw.parse.remap.out.pb_text.gz b/testdata/perf.data.raw.parse.remap.out.pb_text.gz
index 6719f7c..a38b55e 100644
--- a/testdata/perf.data.raw.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.raw.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.raw.parse.remap2.out.pb_text.gz b/testdata/perf.data.raw.parse.remap2.out.pb_text.gz
index cca71ac..a38b55e 100644
--- a/testdata/perf.data.raw.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.raw.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.raw.pb_text.gz b/testdata/perf.data.raw.pb_text.gz
index 7489813..c38feef 100644
--- a/testdata/perf.data.raw.pb_text.gz
+++ b/testdata/perf.data.raw.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.raw.pr.out.pb_text.gz b/testdata/perf.data.raw.pr.out.pb_text.gz
index 0a4761c..c38feef 100644
--- a/testdata/perf.data.raw.pr.out.pb_text.gz
+++ b/testdata/perf.data.raw.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.raw.ser.comm.out.pb_text.gz b/testdata/perf.data.raw.ser.comm.out.pb_text.gz
index 84e713b..5a50a62 100644
--- a/testdata/perf.data.raw.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.raw.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.raw.serialized.out.pb_text.gz b/testdata/perf.data.raw.serialized.out.pb_text.gz
index cdd0ff0..c38feef 100644
--- a/testdata/perf.data.raw.serialized.out.pb_text.gz
+++ b/testdata/perf.data.raw.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.remmap.io.out.pb_text.gz b/testdata/perf.data.remmap.io.out.pb_text.gz
index 86b8595..890ad04 100644
--- a/testdata/perf.data.remmap.io.out.pb_text.gz
+++ b/testdata/perf.data.remmap.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.remmap.parse.out.pb_text.gz b/testdata/perf.data.remmap.parse.out.pb_text.gz
index 5bb5e57..890ad04 100644
--- a/testdata/perf.data.remmap.parse.out.pb_text.gz
+++ b/testdata/perf.data.remmap.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.remmap.parse.remap.out.pb_text.gz b/testdata/perf.data.remmap.parse.remap.out.pb_text.gz
index aa6295e..5015e98 100644
--- a/testdata/perf.data.remmap.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.remmap.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.remmap.parse.remap2.out.pb_text.gz b/testdata/perf.data.remmap.parse.remap2.out.pb_text.gz
index 8cf363f..5015e98 100644
--- a/testdata/perf.data.remmap.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.remmap.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.remmap.pb_text.gz b/testdata/perf.data.remmap.pb_text.gz
index dac1629..890ad04 100644
--- a/testdata/perf.data.remmap.pb_text.gz
+++ b/testdata/perf.data.remmap.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.remmap.pr.out.pb_text.gz b/testdata/perf.data.remmap.pr.out.pb_text.gz
index ed13d48..890ad04 100644
--- a/testdata/perf.data.remmap.pr.out.pb_text.gz
+++ b/testdata/perf.data.remmap.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.remmap.ser.comm.out.pb_text.gz b/testdata/perf.data.remmap.ser.comm.out.pb_text.gz
index d76bb32..3315dce 100644
--- a/testdata/perf.data.remmap.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.remmap.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.remmap.serialized.out.pb_text.gz b/testdata/perf.data.remmap.serialized.out.pb_text.gz
index fdcae5a..890ad04 100644
--- a/testdata/perf.data.remmap.serialized.out.pb_text.gz
+++ b/testdata/perf.data.remmap.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.io.out.pb_text.gz b/testdata/perf.data.singleprocess.io.out.pb_text.gz
index 6b41389..a8f91e0 100644
--- a/testdata/perf.data.singleprocess.io.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.next.io.out.pb_text.gz b/testdata/perf.data.singleprocess.next.io.out.pb_text.gz
index 1ba8b35..aa54172 100644
--- a/testdata/perf.data.singleprocess.next.io.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.next.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.next.parse.out.pb_text.gz b/testdata/perf.data.singleprocess.next.parse.out.pb_text.gz
index 0b58309..aa54172 100644
--- a/testdata/perf.data.singleprocess.next.parse.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.next.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.next.parse.remap.out.pb_text.gz b/testdata/perf.data.singleprocess.next.parse.remap.out.pb_text.gz
index 8c43523..fecf28d 100644
--- a/testdata/perf.data.singleprocess.next.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.next.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.next.parse.remap2.out.pb_text.gz b/testdata/perf.data.singleprocess.next.parse.remap2.out.pb_text.gz
index fb50265..fecf28d 100644
--- a/testdata/perf.data.singleprocess.next.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.next.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.next.pb_text.gz b/testdata/perf.data.singleprocess.next.pb_text.gz
index c3e4b55..0bdd1b0 100644
--- a/testdata/perf.data.singleprocess.next.pb_text.gz
+++ b/testdata/perf.data.singleprocess.next.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.next.pr.out.pb_text.gz b/testdata/perf.data.singleprocess.next.pr.out.pb_text.gz
index 60cb6c3..aa54172 100644
--- a/testdata/perf.data.singleprocess.next.pr.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.next.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.next.ser.comm.out.pb_text.gz b/testdata/perf.data.singleprocess.next.ser.comm.out.pb_text.gz
index fd462f3..11ec647 100644
--- a/testdata/perf.data.singleprocess.next.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.next.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.next.serialized.out.pb_text.gz b/testdata/perf.data.singleprocess.next.serialized.out.pb_text.gz
index 5ff775b..575a142 100644
--- a/testdata/perf.data.singleprocess.next.serialized.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.next.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.parse.out.pb_text.gz b/testdata/perf.data.singleprocess.parse.out.pb_text.gz
index 18d77c1..a8f91e0 100644
--- a/testdata/perf.data.singleprocess.parse.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.parse.remap.out.pb_text.gz b/testdata/perf.data.singleprocess.parse.remap.out.pb_text.gz
index 1b09b4d..0ef4c37 100644
--- a/testdata/perf.data.singleprocess.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.parse.remap2.out.pb_text.gz b/testdata/perf.data.singleprocess.parse.remap2.out.pb_text.gz
index 30652ae..0ef4c37 100644
--- a/testdata/perf.data.singleprocess.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.pb_text.gz b/testdata/perf.data.singleprocess.pb_text.gz
index bf91f0c..a8f91e0 100644
--- a/testdata/perf.data.singleprocess.pb_text.gz
+++ b/testdata/perf.data.singleprocess.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.pr.out.pb_text.gz b/testdata/perf.data.singleprocess.pr.out.pb_text.gz
index 0c2758d..a8f91e0 100644
--- a/testdata/perf.data.singleprocess.pr.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.ser.comm.out.pb_text.gz b/testdata/perf.data.singleprocess.ser.comm.out.pb_text.gz
index a49e17f..27b95aa 100644
--- a/testdata/perf.data.singleprocess.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.singleprocess.serialized.out.pb_text.gz b/testdata/perf.data.singleprocess.serialized.out.pb_text.gz
index cf39d31..1fd898d 100644
--- a/testdata/perf.data.singleprocess.serialized.out.pb_text.gz
+++ b/testdata/perf.data.singleprocess.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.io.out.pb_text.gz b/testdata/perf.data.systemwide.0.io.out.pb_text.gz
index a737f3b..3e66f47 100644
--- a/testdata/perf.data.systemwide.0.io.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.next.io.out.pb_text.gz b/testdata/perf.data.systemwide.0.next.io.out.pb_text.gz
index e4e31ee..db7ab06 100644
--- a/testdata/perf.data.systemwide.0.next.io.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.next.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.next.parse.out.pb_text.gz b/testdata/perf.data.systemwide.0.next.parse.out.pb_text.gz
index 388482a..db7ab06 100644
--- a/testdata/perf.data.systemwide.0.next.parse.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.next.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.next.parse.remap.out.pb_text.gz b/testdata/perf.data.systemwide.0.next.parse.remap.out.pb_text.gz
index d625b92..6afb77c 100644
--- a/testdata/perf.data.systemwide.0.next.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.next.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.next.parse.remap2.out.pb_text.gz b/testdata/perf.data.systemwide.0.next.parse.remap2.out.pb_text.gz
index c7e3bfc..6afb77c 100644
--- a/testdata/perf.data.systemwide.0.next.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.next.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.next.pb_text.gz b/testdata/perf.data.systemwide.0.next.pb_text.gz
index 013ebb0..fdb3676 100644
--- a/testdata/perf.data.systemwide.0.next.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.next.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.next.pr.out.pb_text.gz b/testdata/perf.data.systemwide.0.next.pr.out.pb_text.gz
index f86205b..db7ab06 100644
--- a/testdata/perf.data.systemwide.0.next.pr.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.next.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.next.ser.comm.out.pb_text.gz b/testdata/perf.data.systemwide.0.next.ser.comm.out.pb_text.gz
index 6842897..6d0f1b4 100644
--- a/testdata/perf.data.systemwide.0.next.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.next.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.next.serialized.out.pb_text.gz b/testdata/perf.data.systemwide.0.next.serialized.out.pb_text.gz
index 183f95b..db7ab06 100644
--- a/testdata/perf.data.systemwide.0.next.serialized.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.next.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.parse.out.pb_text.gz b/testdata/perf.data.systemwide.0.parse.out.pb_text.gz
index 8c73a21..3e66f47 100644
--- a/testdata/perf.data.systemwide.0.parse.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.parse.remap.out.pb_text.gz b/testdata/perf.data.systemwide.0.parse.remap.out.pb_text.gz
index 3de61a2..4be3d4b 100644
--- a/testdata/perf.data.systemwide.0.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.parse.remap2.out.pb_text.gz b/testdata/perf.data.systemwide.0.parse.remap2.out.pb_text.gz
index 15a23b0..4be3d4b 100644
--- a/testdata/perf.data.systemwide.0.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.pb_text.gz b/testdata/perf.data.systemwide.0.pb_text.gz
index 61b7e63..3e66f47 100644
--- a/testdata/perf.data.systemwide.0.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.pr.out.pb_text.gz b/testdata/perf.data.systemwide.0.pr.out.pb_text.gz
index 2c5f9a0..3e66f47 100644
--- a/testdata/perf.data.systemwide.0.pr.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.ser.comm.out.pb_text.gz b/testdata/perf.data.systemwide.0.ser.comm.out.pb_text.gz
index be15cba..3e43fe1 100644
--- a/testdata/perf.data.systemwide.0.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.0.serialized.out.pb_text.gz b/testdata/perf.data.systemwide.0.serialized.out.pb_text.gz
index 002d2a7..3e66f47 100644
--- a/testdata/perf.data.systemwide.0.serialized.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.0.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.io.out.pb_text.gz b/testdata/perf.data.systemwide.1.io.out.pb_text.gz
index fcf7609..af922ff 100644
--- a/testdata/perf.data.systemwide.1.io.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.next.io.out.pb_text.gz b/testdata/perf.data.systemwide.1.next.io.out.pb_text.gz
index d03ae11..44dfdeb 100644
--- a/testdata/perf.data.systemwide.1.next.io.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.next.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.next.parse.out.pb_text.gz b/testdata/perf.data.systemwide.1.next.parse.out.pb_text.gz
index 3d5e7e9..44dfdeb 100644
--- a/testdata/perf.data.systemwide.1.next.parse.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.next.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.next.parse.remap.out.pb_text.gz b/testdata/perf.data.systemwide.1.next.parse.remap.out.pb_text.gz
index 41f4a64..d6e1533 100644
--- a/testdata/perf.data.systemwide.1.next.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.next.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.next.parse.remap2.out.pb_text.gz b/testdata/perf.data.systemwide.1.next.parse.remap2.out.pb_text.gz
index c833fbc..d6e1533 100644
--- a/testdata/perf.data.systemwide.1.next.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.next.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.next.pb_text.gz b/testdata/perf.data.systemwide.1.next.pb_text.gz
index c8e581a..c181579 100644
--- a/testdata/perf.data.systemwide.1.next.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.next.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.next.pr.out.pb_text.gz b/testdata/perf.data.systemwide.1.next.pr.out.pb_text.gz
index 1aa72d7..44dfdeb 100644
--- a/testdata/perf.data.systemwide.1.next.pr.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.next.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.next.ser.comm.out.pb_text.gz b/testdata/perf.data.systemwide.1.next.ser.comm.out.pb_text.gz
index 77365a3..adaab23 100644
--- a/testdata/perf.data.systemwide.1.next.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.next.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.next.serialized.out.pb_text.gz b/testdata/perf.data.systemwide.1.next.serialized.out.pb_text.gz
index 3f80c21..4774897 100644
--- a/testdata/perf.data.systemwide.1.next.serialized.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.next.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.parse.out.pb_text.gz b/testdata/perf.data.systemwide.1.parse.out.pb_text.gz
index 84c902f..af922ff 100644
--- a/testdata/perf.data.systemwide.1.parse.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.parse.remap.out.pb_text.gz b/testdata/perf.data.systemwide.1.parse.remap.out.pb_text.gz
index d7b2790..7221b83 100644
--- a/testdata/perf.data.systemwide.1.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.parse.remap2.out.pb_text.gz b/testdata/perf.data.systemwide.1.parse.remap2.out.pb_text.gz
index aafc6ed..7221b83 100644
--- a/testdata/perf.data.systemwide.1.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.pb_text.gz b/testdata/perf.data.systemwide.1.pb_text.gz
index 5e55f7c..af922ff 100644
--- a/testdata/perf.data.systemwide.1.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.pr.out.pb_text.gz b/testdata/perf.data.systemwide.1.pr.out.pb_text.gz
index f7aeb49..af922ff 100644
--- a/testdata/perf.data.systemwide.1.pr.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.ser.comm.out.pb_text.gz b/testdata/perf.data.systemwide.1.ser.comm.out.pb_text.gz
index 608e4f6..ac2a0ce 100644
--- a/testdata/perf.data.systemwide.1.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.1.serialized.out.pb_text.gz b/testdata/perf.data.systemwide.1.serialized.out.pb_text.gz
index 2bc07df..d554a8c 100644
--- a/testdata/perf.data.systemwide.1.serialized.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.1.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.io.out.pb_text.gz b/testdata/perf.data.systemwide.5.io.out.pb_text.gz
index 84b8065..3fb67e2 100644
--- a/testdata/perf.data.systemwide.5.io.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.next.io.out.pb_text.gz b/testdata/perf.data.systemwide.5.next.io.out.pb_text.gz
index 00c271e..b0a52fe 100644
--- a/testdata/perf.data.systemwide.5.next.io.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.next.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.next.parse.out.pb_text.gz b/testdata/perf.data.systemwide.5.next.parse.out.pb_text.gz
index 39f9673..b0a52fe 100644
--- a/testdata/perf.data.systemwide.5.next.parse.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.next.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.next.parse.remap.out.pb_text.gz b/testdata/perf.data.systemwide.5.next.parse.remap.out.pb_text.gz
index ce98529..0c17eca 100644
--- a/testdata/perf.data.systemwide.5.next.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.next.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.next.parse.remap2.out.pb_text.gz b/testdata/perf.data.systemwide.5.next.parse.remap2.out.pb_text.gz
index 6e71a5c..0c17eca 100644
--- a/testdata/perf.data.systemwide.5.next.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.next.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.next.pb_text.gz b/testdata/perf.data.systemwide.5.next.pb_text.gz
index 914962f..48d2f0a 100644
--- a/testdata/perf.data.systemwide.5.next.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.next.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.next.pr.out.pb_text.gz b/testdata/perf.data.systemwide.5.next.pr.out.pb_text.gz
index bfd2be5..b0a52fe 100644
--- a/testdata/perf.data.systemwide.5.next.pr.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.next.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.next.ser.comm.out.pb_text.gz b/testdata/perf.data.systemwide.5.next.ser.comm.out.pb_text.gz
index ca2725f..c25256d 100644
--- a/testdata/perf.data.systemwide.5.next.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.next.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.next.serialized.out.pb_text.gz b/testdata/perf.data.systemwide.5.next.serialized.out.pb_text.gz
index e97769c..b0a52fe 100644
--- a/testdata/perf.data.systemwide.5.next.serialized.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.next.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.parse.out.pb_text.gz b/testdata/perf.data.systemwide.5.parse.out.pb_text.gz
index 14fe909..3fb67e2 100644
--- a/testdata/perf.data.systemwide.5.parse.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.parse.remap.out.pb_text.gz b/testdata/perf.data.systemwide.5.parse.remap.out.pb_text.gz
index cc4dd59..7fc8cb4 100644
--- a/testdata/perf.data.systemwide.5.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.parse.remap2.out.pb_text.gz b/testdata/perf.data.systemwide.5.parse.remap2.out.pb_text.gz
index 7bbc9fb..7fc8cb4 100644
--- a/testdata/perf.data.systemwide.5.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.pb_text.gz b/testdata/perf.data.systemwide.5.pb_text.gz
index 10c7c52..3fb67e2 100644
--- a/testdata/perf.data.systemwide.5.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.pr.out.pb_text.gz b/testdata/perf.data.systemwide.5.pr.out.pb_text.gz
index eba2f5c..3fb67e2 100644
--- a/testdata/perf.data.systemwide.5.pr.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.ser.comm.out.pb_text.gz b/testdata/perf.data.systemwide.5.ser.comm.out.pb_text.gz
index 174aee3..ae68007 100644
--- a/testdata/perf.data.systemwide.5.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.systemwide.5.serialized.out.pb_text.gz b/testdata/perf.data.systemwide.5.serialized.out.pb_text.gz
index 1a12f0a..3fb67e2 100644
--- a/testdata/perf.data.systemwide.5.serialized.out.pb_text.gz
+++ b/testdata/perf.data.systemwide.5.serialized.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.throttle.next.io.out.pb_text.gz b/testdata/perf.data.throttle.next.io.out.pb_text.gz
index 98c674f..03560e3 100644
--- a/testdata/perf.data.throttle.next.io.out.pb_text.gz
+++ b/testdata/perf.data.throttle.next.io.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.throttle.next.parse.out.pb_text.gz b/testdata/perf.data.throttle.next.parse.out.pb_text.gz
index b081517..03560e3 100644
--- a/testdata/perf.data.throttle.next.parse.out.pb_text.gz
+++ b/testdata/perf.data.throttle.next.parse.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.throttle.next.parse.remap.out.pb_text.gz b/testdata/perf.data.throttle.next.parse.remap.out.pb_text.gz
index 77010e8..13feb22 100644
--- a/testdata/perf.data.throttle.next.parse.remap.out.pb_text.gz
+++ b/testdata/perf.data.throttle.next.parse.remap.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.throttle.next.parse.remap2.out.pb_text.gz b/testdata/perf.data.throttle.next.parse.remap2.out.pb_text.gz
index 1ef55aa..13feb22 100644
--- a/testdata/perf.data.throttle.next.parse.remap2.out.pb_text.gz
+++ b/testdata/perf.data.throttle.next.parse.remap2.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.throttle.next.pb_text.gz b/testdata/perf.data.throttle.next.pb_text.gz
index 51007aa..dd093d3 100644
--- a/testdata/perf.data.throttle.next.pb_text.gz
+++ b/testdata/perf.data.throttle.next.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.throttle.next.pr.out.pb_text.gz b/testdata/perf.data.throttle.next.pr.out.pb_text.gz
index 24f4b1d..03560e3 100644
--- a/testdata/perf.data.throttle.next.pr.out.pb_text.gz
+++ b/testdata/perf.data.throttle.next.pr.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.throttle.next.ser.comm.out.pb_text.gz b/testdata/perf.data.throttle.next.ser.comm.out.pb_text.gz
index bd562c9..627ee7a 100644
--- a/testdata/perf.data.throttle.next.ser.comm.out.pb_text.gz
+++ b/testdata/perf.data.throttle.next.ser.comm.out.pb_text.gz
Binary files differ
diff --git a/testdata/perf.data.throttle.next.serialized.out.pb_text.gz b/testdata/perf.data.throttle.next.serialized.out.pb_text.gz
index 2121694..e25e61f 100644
--- a/testdata/perf.data.throttle.next.serialized.out.pb_text.gz
+++ b/testdata/perf.data.throttle.next.serialized.out.pb_text.gz
Binary files differ
diff --git a/utils.cc b/utils.cc
index 003c760..7c7a814 100644
--- a/utils.cc
+++ b/utils.cc
@@ -295,4 +295,16 @@
   return true;
 }
 
+void TrimWhitespace(string* str) {
+  const char kWhitespaceCharacters[] = " \t\n\r";
+  size_t end = str->find_last_not_of(kWhitespaceCharacters);
+  if (end != std::string::npos) {
+    size_t start = str->find_first_not_of(kWhitespaceCharacters);
+    *str = str->substr(start, end + 1 - start);
+  } else {
+    // The string contains only whitespace.
+    *str = "";
+  }
+}
+
 }  // namespace quipper
diff --git a/utils.h b/utils.h
index de1ad92..9e767e6 100644
--- a/utils.h
+++ b/utils.h
@@ -76,6 +76,9 @@
 // success, false otherwise.
 bool RunCommandAndGetStdout(const string& command, std::vector<char>* output);
 
+// Trim leading and trailing whitespace from |str|.
+void TrimWhitespace(string* str);
+
 }  // namespace quipper
 
 #endif  // UTILS_H_