processor: Export thread instruction counts to JSON

Adds support for exporting thread instruction counts from imported
TrackEvent traces.

Bug: 130786269
Change-Id: I5367af57632e1efbb5951a5dccb59b340b5d4ad6
diff --git a/src/trace_processor/export_json_unittest.cc b/src/trace_processor/export_json_unittest.cc
index e79e722..fef2f3f 100644
--- a/src/trace_processor/export_json_unittest.cc
+++ b/src/trace_processor/export_json_unittest.cc
@@ -61,6 +61,8 @@
   const int64_t kDuration = 10000;
   const int64_t kThreadTimestamp = 20000000;
   const int64_t kThreadDuration = 20000;
+  const int64_t kThreadInstructionCount = 30000000;
+  const int64_t kThreadInstructionDelta = 30000;
   const int64_t kThreadID = 100;
   const char* kCategory = "cat";
   const char* kName = "name";
@@ -71,8 +73,9 @@
   StringId name_id = storage.InternString(base::StringView(kName));
   storage.mutable_nestable_slices()->AddSlice(
       kTimestamp, kDuration, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0);
-  storage.mutable_thread_slices()->AddThreadSlice(0, kThreadTimestamp,
-                                                  kThreadDuration, 0, 0);
+  storage.mutable_thread_slices()->AddThreadSlice(
+      0, kThreadTimestamp, kThreadDuration, kThreadInstructionCount,
+      kThreadInstructionDelta);
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -91,6 +94,8 @@
   EXPECT_EQ(event["dur"].asInt64(), kDuration / 1000);
   EXPECT_EQ(event["tts"].asInt64(), kThreadTimestamp / 1000);
   EXPECT_EQ(event["tdur"].asInt64(), kThreadDuration / 1000);
+  EXPECT_EQ(event["ticount"].asInt64(), kThreadInstructionCount);
+  EXPECT_EQ(event["tidelta"].asInt64(), kThreadInstructionDelta);
   EXPECT_EQ(event["tid"].asUInt(), kThreadID);
   EXPECT_EQ(event["cat"].asString(), kCategory);
   EXPECT_EQ(event["name"].asString(), kName);
@@ -101,6 +106,8 @@
   const int64_t kDuration = -1;
   const int64_t kThreadTimestamp = 20000000;
   const int64_t kThreadDuration = -1;
+  const int64_t kThreadInstructionCount = 30000000;
+  const int64_t kThreadInstructionDelta = -1;
   const int64_t kThreadID = 100;
   const char* kCategory = "cat";
   const char* kName = "name";
@@ -111,8 +118,9 @@
   StringId name_id = storage.InternString(base::StringView(kName));
   storage.mutable_nestable_slices()->AddSlice(
       kTimestamp, kDuration, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0);
-  storage.mutable_thread_slices()->AddThreadSlice(0, kThreadTimestamp,
-                                                  kThreadDuration, 0, 0);
+  storage.mutable_thread_slices()->AddThreadSlice(
+      0, kThreadTimestamp, kThreadDuration, kThreadInstructionCount,
+      kThreadInstructionDelta);
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -131,6 +139,8 @@
   EXPECT_FALSE(event.isMember("dur"));
   EXPECT_EQ(event["tts"].asInt64(), kThreadTimestamp / 1000);
   EXPECT_FALSE(event.isMember("tdur"));
+  EXPECT_EQ(event["ticount"].asInt64(), kThreadInstructionCount);
+  EXPECT_FALSE(event.isMember("tidelta"));
   EXPECT_EQ(event["tid"].asUInt(), kThreadID);
   EXPECT_EQ(event["cat"].asString(), kCategory);
   EXPECT_EQ(event["name"].asString(), kName);