processor: Support RefType in SliceTracker + TrackEvent instant scopes

Adds support for tracking slice stacks for different RefTypes to
SliceTracker and uses this new support to implement handling of instant
event scopes from TrackEvent::LegacyEvent.

Bug: 130786981
Change-Id: I84205b63da0a489ed66b8f416c8bf96628076099
diff --git a/src/trace_processor/proto_trace_parser.cc b/src/trace_processor/proto_trace_parser.cc
index b1c5a50..4849ffd 100644
--- a/src/trace_processor/proto_trace_parser.cc
+++ b/src/trace_processor/proto_trace_parser.cc
@@ -1451,30 +1451,54 @@
     }
   };
 
+  using LegacyEvent = protos::pbzero::TrackEvent::LegacyEvent;
+
   int32_t phase = legacy_event.phase();
   switch (static_cast<char>(phase)) {
     case 'B': {  // TRACE_EVENT_PHASE_BEGIN.
-      slice_tracker->Begin(ts, utid, category_id, name_id, args_callback);
+      slice_tracker->Begin(ts, utid, RefType::kRefUtid, category_id, name_id,
+                           args_callback);
       break;
     }
     case 'E': {  // TRACE_EVENT_PHASE_END.
-      slice_tracker->End(ts, utid, category_id, name_id, args_callback);
+      slice_tracker->End(ts, utid, RefType::kRefUtid, category_id, name_id,
+                         args_callback);
       break;
     }
     case 'X': {  // TRACE_EVENT_PHASE_COMPLETE.
       auto duration_ns = legacy_event.duration_us() * 1000;
       if (duration_ns < 0)
         return;
-      slice_tracker->Scoped(ts, utid, category_id, name_id, duration_ns,
-                            args_callback);
+      slice_tracker->Scoped(ts, utid, RefType::kRefUtid, category_id, name_id,
+                            duration_ns, args_callback);
       break;
     }
+    case 'i':
     case 'I': {  // TRACE_EVENT_PHASE_INSTANT.
       // Handle instant events as slices with zero duration, so that they end
       // up nested underneath their parent slices.
       int64_t duration_ns = 0;
-      slice_tracker->Scoped(ts, utid, category_id, name_id, duration_ns,
-                            args_callback);
+
+      switch (legacy_event.instant_event_scope()) {
+        case LegacyEvent::SCOPE_UNSPECIFIED:
+        case LegacyEvent::SCOPE_THREAD:
+          slice_tracker->Scoped(ts, utid, RefType::kRefUtid, category_id,
+                                name_id, duration_ns, args_callback);
+          break;
+        case LegacyEvent::SCOPE_GLOBAL:
+          slice_tracker->Scoped(ts, /*ref=*/0, RefType::kRefNoRef, category_id,
+                                name_id, duration_ns, args_callback);
+          break;
+        case LegacyEvent::SCOPE_PROCESS:
+          slice_tracker->Scoped(ts, procs->GetOrCreateProcess(pid),
+                                RefType::kRefUpid, category_id, name_id,
+                                duration_ns, args_callback);
+          break;
+        default:
+          PERFETTO_FATAL("Unknown instant event scope: %u",
+                         legacy_event.instant_event_scope());
+          break;
+      }
       break;
     }
     case 'M': {  // TRACE_EVENT_PHASE_METADATA (process and thread names).
@@ -1742,8 +1766,8 @@
       sprintf(fallback, "Event %d", eid);
       name_id = context_->storage->InternString(fallback);
     }
-    context_->slice_tracker->Scoped(ts, utid, cat_id, name_id,
-                                    event.event_duration_ns());
+    context_->slice_tracker->Scoped(ts, utid, RefType::kRefUtid, cat_id,
+                                    name_id, event.event_duration_ns());
   } else if (event.has_counter_id()) {
     auto cid = event.counter_id();
     if (cid < metatrace::COUNTERS_MAX) {