Merge changes I485a362d,I7a1ba66f into main

* changes:
  Update clang for standalone builds
  make base::Uuid and cmd getopt thread-safe via mutex
diff --git a/Android.bp b/Android.bp
index 73487c9..a4b4894 100644
--- a/Android.bp
+++ b/Android.bp
@@ -11986,6 +11986,7 @@
         "src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/network_packets.sql",
+        "src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/process_metadata.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/screenshots.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/services.sql",
@@ -12028,6 +12029,7 @@
         "src/trace_processor/perfetto_sql/stdlib/sched/thread_state_flattened.sql",
         "src/trace_processor/perfetto_sql/stdlib/slices/flat_slices.sql",
         "src/trace_processor/perfetto_sql/stdlib/slices/slices.sql",
+        "src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql",
         "src/trace_processor/perfetto_sql/stdlib/time/conversion.sql",
     ],
     cmd: "$(location tools/gen_amalgamated_sql.py) --namespace=stdlib --cpp-out=$(out) $(in)",
diff --git a/BUILD b/BUILD
index a60811a..fe8598c 100644
--- a/BUILD
+++ b/BUILD
@@ -2374,6 +2374,7 @@
         "src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/network_packets.sql",
+        "src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/process_metadata.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/screenshots.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/services.sql",
@@ -2486,6 +2487,7 @@
     srcs = [
         "src/trace_processor/perfetto_sql/stdlib/slices/flat_slices.sql",
         "src/trace_processor/perfetto_sql/stdlib/slices/slices.sql",
+        "src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql",
     ],
 )
 
diff --git a/python/generators/sql_processing/docs_parse.py b/python/generators/sql_processing/docs_parse.py
index ea0b90e..6e8cd60 100644
--- a/python/generators/sql_processing/docs_parse.py
+++ b/python/generators/sql_processing/docs_parse.py
@@ -20,9 +20,15 @@
 from typing import Any, Dict, List, Optional, Set, Tuple, NamedTuple
 
 from python.generators.sql_processing.docs_extractor import DocsExtractor
-from python.generators.sql_processing.utils import ALLOWED_PREFIXES, ANY_PATTERN, ARG_DEFINITION_PATTERN, ObjKind
-from python.generators.sql_processing.utils import ARG_ANNOTATION_PATTERN
+from python.generators.sql_processing.utils import ObjKind
+
+from python.generators.sql_processing.utils import ALLOWED_PREFIXES
+from python.generators.sql_processing.utils import OBJECT_NAME_ALLOWLIST
+
 from python.generators.sql_processing.utils import COLUMN_ANNOTATION_PATTERN
+from python.generators.sql_processing.utils import ANY_PATTERN
+from python.generators.sql_processing.utils import ARG_DEFINITION_PATTERN
+from python.generators.sql_processing.utils import ARG_ANNOTATION_PATTERN
 
 
 def is_internal(name: str) -> bool:
@@ -64,6 +70,8 @@
       if prefix == allowed_name_prefix:
         return None
       allowed_prefixes.append(allowed_name_prefix)
+    if path in OBJECT_NAME_ALLOWLIST and name in OBJECT_NAME_ALLOWLIST[path]:
+      return None
   return (
       f'Names of tables/views/functions at path "{path}" should be prefixed '
       f'with one of following names: {", ".join(allowed_prefixes)}')
diff --git a/python/generators/sql_processing/utils.py b/python/generators/sql_processing/utils.py
index 49564dd..ba14110 100644
--- a/python/generators/sql_processing/utils.py
+++ b/python/generators/sql_processing/utils.py
@@ -111,6 +111,12 @@
     'counters': 'counter',
     'chrome/util': 'cr',
     'graphs': 'graph',
+    'slices': 'slice'
+}
+
+# Allows for nonstandard object names.
+OBJECT_NAME_ALLOWLIST = {
+    'slices/with_context.sql': ['process_slice', 'thread_slice']
 }
 
 # Given a regex pattern and a string to match against, returns all the
diff --git a/src/trace_processor/metrics/sql/common/parent_slice.sql b/src/trace_processor/metrics/sql/common/parent_slice.sql
index 1f24720..d5c6f24 100644
--- a/src/trace_processor/metrics/sql/common/parent_slice.sql
+++ b/src/trace_processor/metrics/sql/common/parent_slice.sql
@@ -14,4 +14,4 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
index be50773..29c4b89 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
@@ -31,6 +31,7 @@
     "job_scheduler.sql",
     "monitor_contention.sql",
     "network_packets.sql",
+    "oom_adjuster.sql",
     "process_metadata.sql",
     "screenshots.sql",
     "services.sql",
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql b/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
index 45c6e93..2e68b5f 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
@@ -13,7 +13,7 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 --
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
 
 -- All process starts.
 CREATE PERFETTO VIEW _proc_start
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql b/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
index 14e3a01..9ccdca9 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
@@ -48,6 +48,45 @@
 ORDER BY upid DESC
 LIMIT 1;
 
+-- Translate unfreeze reason from INT to STRING.
+-- See: frameworks/proto_logging/stats/atoms.proto
+CREATE PERFETTO FUNCTION _translate_unfreeze_reason(reason INT)
+RETURNS STRING
+AS
+SELECT
+  CASE
+    WHEN $reason = 0 THEN 'none'
+    WHEN $reason = 1 THEN 'activity'
+    WHEN $reason = 2 THEN 'finish_receiver'
+    WHEN $reason = 3 THEN 'start_receiver'
+    WHEN $reason = 4 THEN 'bind_service'
+    WHEN $reason = 5 THEN 'unbind_service'
+    WHEN $reason = 6 THEN 'start_service'
+    WHEN $reason = 7 THEN 'get_provider'
+    WHEN $reason = 8 THEN 'remove_provider'
+    WHEN $reason = 9 THEN 'ui_visibility'
+    WHEN $reason = 10 THEN 'allowlist'
+    WHEN $reason = 11 THEN 'process_begin'
+    WHEN $reason = 12 THEN 'process_end'
+    WHEN $reason = 13 THEN 'trim_memory'
+    WHEN $reason = 15 THEN 'ping'
+    WHEN $reason = 16 THEN 'file_locks'
+    WHEN $reason = 17 THEN 'file_lock_check_failure'
+    WHEN $reason = 18 THEN 'binder_txns'
+    WHEN $reason = 19 THEN 'feature_flags'
+    WHEN $reason = 20 THEN 'short_fgs_timeout'
+    WHEN $reason = 21 THEN 'system_init'
+    WHEN $reason = 22 THEN 'backup'
+    WHEN $reason = 23 THEN 'shell'
+    WHEN $reason = 24 THEN 'remove_task'
+    WHEN $reason = 25 THEN 'uid_idle'
+    WHEN $reason = 26 THEN 'stop_service'
+    WHEN $reason = 27 THEN 'executing_service'
+    WHEN $reason = 28 THEN 'restriction_change'
+    WHEN $reason = 29 THEN 'component_disabled'
+    ELSE NULL
+  END;
+
 -- All frozen processes and their frozen duration.
 CREATE PERFETTO TABLE android_freezer_events (
   -- Upid of frozen process
@@ -57,19 +96,25 @@
   -- Timestamp process was frozen.
   ts INT,
   -- Duration process was frozen for.
-  dur INT
+  dur INT,
+  -- Unfreeze reason Integer.
+  unfreeze_reason_int INT,
+  -- Unfreeze reason String.
+  unfreeze_reason_str INT
   )
 AS
 WITH
   freeze AS (
     SELECT ts, _extract_freezer_pid(name) AS pid,
-    _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'freeze' AS type
+    _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'freeze' AS type,
+    NULL AS unfreeze_reason
     FROM slice
     WHERE name GLOB 'Freeze *:*'
   ),
   unfreeze AS (
     SELECT ts, _extract_freezer_pid(name) AS pid,
-    _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'unfreeze' AS type
+    _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'unfreeze' AS type,
+    str_split(name, ' ', 2) AS unfreeze_reason
     FROM slice
     WHERE name GLOB 'Unfreeze *:*'
   ),
@@ -84,9 +129,16 @@
       upid,
       pid,
       ts,
-      ifnull(lead(ts) OVER (PARTITION BY upid ORDER BY ts), trace_end()) - ts AS dur
+      ifnull(lead(ts) OVER (PARTITION BY upid ORDER BY ts), trace_end()) - ts AS dur,
+      CAST(lead(unfreeze_reason) OVER (PARTITION BY upid ORDER BY ts) AS INT) AS unfreeze_reason
     FROM merged
   )
-SELECT upid, pid, ts, dur
+SELECT
+  upid,
+  pid,
+  ts,
+  dur,
+  unfreeze_reason AS unfreeze_reason_int,
+  _translate_unfreeze_reason(unfreeze_reason) AS unfreeze_reason_str
 FROM starts
 WHERE starts.type = 'freeze' AND upid IS NOT NULL;
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql b/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
index cb16f28..8481657 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
@@ -14,7 +14,7 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
 
 -- Collect all GC slices. There's typically one enclosing slice but sometimes the
 -- CompactionPhase is outside the nesting and we need to include that.
@@ -43,8 +43,14 @@
   gc_name,
   ts AS gc_ts,
   ts,
-  gc_dur + IIF(compact_name = 'CompactionPhase', compact_dur, 0) AS gc_dur,
-  gc_dur + IIF(compact_name = 'CompactionPhase', compact_dur, 0) AS dur,
+  gc_dur + IIF(
+    compact_name = 'CompactionPhase' OR compact_name = 'Background concurrent copying GC',
+    compact_dur,
+    0) AS gc_dur,
+  gc_dur + IIF(
+    compact_name = 'CompactionPhase' OR compact_name = 'Background concurrent copying GC',
+    compact_dur,
+    0) AS dur,
   utid,
   tid,
   upid,
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql b/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql
new file mode 100644
index 0000000..9c184e5
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql
@@ -0,0 +1,129 @@
+--
+-- Copyright 2024 The Android Open Source Project
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+
+INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE counters.intervals;
+
+-- Converts an oom_adj score Integer to String bucket name.
+CREATE PERFETTO FUNCTION android_oom_adj_score_to_bucket_name(
+  -- oom_adj score.
+  value INT,
+  -- android_app id of the process.
+  android_appid INT)
+-- Returns the oom_adj bucket.
+RETURNS STRING
+AS
+SELECT
+  CASE
+    WHEN $value = -1000 THEN 'native'
+    WHEN $value = -900 THEN 'system'
+    WHEN $value = -800 THEN 'persistent'
+    WHEN $value = -700 THEN 'persistent'
+    WHEN $value = -600 THEN 'logcat'
+    WHEN $value = 0 THEN 'foreground_app'
+    WHEN $value = 50 THEN 'perceptible_foreground_app'
+    WHEN $value BETWEEN 100 AND 199 THEN 'visible_app'
+    WHEN $value BETWEEN 200 AND 224 THEN 'perceptible_app'
+    WHEN $value BETWEEN 225 AND 249 THEN 'perceptible_medium_app'
+    WHEN $value BETWEEN 250 AND 299 THEN 'perceptible_low_app'
+    WHEN $value BETWEEN 300 AND 399 THEN 'backup'
+    WHEN $value BETWEEN 400 AND 499 THEN 'heavy_weight_app'
+    WHEN $value BETWEEN 500 AND 599 THEN 'service'
+    WHEN $value BETWEEN 600 AND 699 THEN 'home_app'
+    WHEN $value BETWEEN 700 AND 799 THEN 'previous_app'
+    WHEN $value BETWEEN 800 AND 899 THEN 'service_b'
+    WHEN $value BETWEEN 900 AND 949 THEN 'cached_app'
+    WHEN $value >= 950 THEN 'cached_app_lmk_first'
+    WHEN $android_appid IS NULL THEN 'unknown'
+    WHEN $android_appid < 10000 THEN 'unknown_native'
+    ELSE 'unknown_app'
+  END;
+
+-- All oom adj state intervals across all processes along with the reason for the state update.
+CREATE PERFETTO TABLE android_oom_adj_intervals (
+  -- Timestamp the oom_adj score of the process changed
+  ts INT,
+  -- Duration until the next oom_adj score change of the process.
+  dur INT,
+  -- oom_adj score of the process.
+  score INT,
+  -- oom_adj bucket of the process.
+  bucket STRING,
+  -- Upid of the process having an oom_adj update.
+  upid INT,
+  -- Name of the process having an oom_adj update.
+  process_name STRING,
+  -- Slice id of the latest oom_adj update in the system_server.
+  oom_adj_id INT,
+  -- Timestamp of the latest oom_adj update in the system_server.
+  oom_adj_ts INT,
+  -- Duration of the latest oom_adj update in the system_server.
+  oom_adj_dur INT,
+  -- Track id of the latest oom_adj update in the system_server
+  oom_adj_track_id INT,
+  -- Thread name of the latest oom_adj update in the system_server.
+  oom_adj_thread_name STRING,
+  -- Reason for the latest oom_adj update in the system_server.
+  oom_adj_reason STRING,
+  -- Trigger for the latest oom_adj update in the system_server.
+  oom_adj_trigger STRING
+  ) AS
+WITH
+  reason AS (
+    SELECT
+      thread_slice.id AS oom_adj_id,
+      thread_slice.ts AS oom_adj_ts,
+      thread_slice.dur AS oom_adj_dur,
+      thread_slice.track_id AS oom_adj_track_id,
+      thread_name AS oom_adj_thread_name,
+      str_split(thread_slice.name, '_', 1) AS oom_adj_reason,
+      slice.name AS oom_adj_trigger,
+      LEAD(thread_slice.ts) OVER (ORDER BY thread_slice.ts) AS oom_adj_next_ts
+    FROM thread_slice
+    JOIN slice ON slice.id = thread_slice.parent_id
+    WHERE thread_slice.name GLOB 'updateOomAdj_*' AND process_name = 'system_server'
+  )
+SELECT
+  ts,
+  dur,
+  value AS score,
+  android_oom_adj_score_to_bucket_name(value, android_appid) AS bucket,
+  process.upid,
+  process.name AS process_name,
+  reason.oom_adj_id,
+  reason.oom_adj_ts,
+  reason.oom_adj_dur,
+  reason.oom_adj_track_id,
+  reason.oom_adj_thread_name,
+  reason.oom_adj_reason,
+  reason.oom_adj_trigger
+FROM
+  counter_leading_intervals
+    !(
+      (
+        SELECT counter.*
+        FROM counter
+        JOIN counter_track track
+          ON track.id = counter.track_id AND track.name = 'oom_score_adj'
+      ))
+      counter
+JOIN process_counter_track track
+  ON counter.track_id = track.id
+JOIN process
+  USING (upid)
+LEFT JOIN reason
+  ON counter.ts BETWEEN oom_adj_ts AND COALESCE(oom_adj_next_ts, trace_end())
+WHERE track.name = 'oom_score_adj';
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/services.sql b/src/trace_processor/perfetto_sql/stdlib/android/services.sql
index e9c1c56..f0e854a 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/services.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/services.sql
@@ -14,7 +14,7 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
 INCLUDE PERFETTO MODULE android.binder;
 INCLUDE PERFETTO MODULE graphs.search;
 
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
index a38c487..e496e7c 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
@@ -13,12 +13,18 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
-INCLUDE PERFETTO MODULE common.slices;
 INCLUDE PERFETTO MODULE android.process_metadata;
 INCLUDE PERFETTO MODULE android.startup.startups_maxsdk28;
 INCLUDE PERFETTO MODULE android.startup.startups_minsdk29;
 INCLUDE PERFETTO MODULE android.startup.startups_minsdk33;
 
+CREATE PERFETTO FUNCTION _slice_count(
+  -- Name of the slices to counted.
+  slice_glob STRING)
+-- Number of slices with the name.
+RETURNS INT AS
+SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;
+
 -- Gather all startup data. Populate by different sdks.
 CREATE PERFETTO TABLE _all_startups AS
 SELECT sdk, startup_id, ts, ts_end, dur, package, startup_type FROM _startups_maxsdk28
@@ -45,9 +51,9 @@
 ) AS
 SELECT startup_id, ts, ts_end, dur, package, startup_type FROM
 _all_startups WHERE ( CASE
-  WHEN slice_count('launchingActivity#*:*') > 0
+  WHEN _slice_count('launchingActivity#*:*') > 0
     THEN sdk = "minsdk33"
-  WHEN slice_count('MetricsLogger:*') > 0
+  WHEN _slice_count('MetricsLogger:*') > 0
     THEN sdk = "minsdk29"
   ELSE sdk = "maxsdk28"
   END);
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
index c8d1443..4b00170 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
@@ -7,7 +7,7 @@
 -- chrome instance. Chrome instance id needs to be recorded, and used here in
 -- combination with navigation id to uniquely identify page load metrics.
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
 
 CREATE PERFETTO VIEW _fcp_metrics AS
 SELECT
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
index 7cad697..dbe0cca 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
@@ -2,6 +2,8 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
+INCLUDE PERFETTO MODULE slices.with_context;
+
 -- Function to retrieve the upid for a surfaceflinger, as these are attributed
 -- to the GPU but are recorded on a different data source (and track group).
 CREATE PERFETTO FUNCTION _get_process_id_for_surfaceflinger()
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
index d85d7c6..5fb66d6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
@@ -4,7 +4,6 @@
 
 INCLUDE PERFETTO MODULE chrome.chrome_scrolls;
 INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
-INCLUDE PERFETTO MODULE common.slices;
 
 -- Selects EventLatency slices that correspond with janks in a scroll. This is
 -- based on the V3 version of scroll jank metrics.
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
index ce20041..4bc9513 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
@@ -2,13 +2,63 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
 
 -- Hardware info is useful when using sql metrics for analysis
 -- in BTP.
 INCLUDE PERFETTO MODULE chrome.metadata;
 INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3_cause;
 
+-- Checks if slice has a descendant with provided name.
+CREATE PERFETTO FUNCTION _has_descendant_slice_with_name(
+  -- Id of the slice to check descendants of.
+  id INT,
+  -- Name of potential descendant slice.
+  descendant_name STRING
+)
+-- Whether `descendant_name` is a name of an descendant slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+  SELECT 1
+  FROM descendant_slice($id)
+  WHERE name = $descendant_name
+  LIMIT 1
+);
+
+-- Finds the end timestamp for a given slice's descendant with a given name.
+-- If there are multiple descendants with a given name, the function will return the
+-- first one, so it's most useful when working with a timeline broken down into phases,
+-- where each subphase can happen only once.
+CREATE PERFETTO FUNCTION _descendant_slice_end(
+  -- Id of the parent slice.
+  parent_id INT,
+  -- Name of the child with the desired end TS.
+  child_name STRING
+)
+-- End timestamp of the child or NULL if it doesn't exist.
+RETURNS INT AS
+SELECT
+  CASE WHEN s.dur
+    IS NOT -1 THEN s.ts + s.dur
+    ELSE NULL
+  END
+FROM descendant_slice($parent_id) s
+WHERE s.name = $child_name
+LIMIT 1;
+
+-- Given a slice id, returns the name of the slice.
+CREATE PERFETTO FUNCTION _slice_name_from_id(
+  -- The slice id which we need the name for.
+  id LONG
+)
+-- The name of slice with the given id.
+RETURNS STRING AS
+SELECT
+  name
+FROM slice
+WHERE $id = id;
+
+
 -- Grabs all gesture updates with respective scroll ids and start/end
 -- timestamps, regardless of being coalesced.
 CREATE PERFETTO TABLE chrome_gesture_scroll_updates(
@@ -135,8 +185,8 @@
   slice.ts,
   slice.id AS event_latency_id,
   slice.dur AS dur,
-  descendant_slice_end(slice.id, "LatchToSwapEnd") AS input_latency_end_ts,
-  descendant_slice_end(slice.id, "SwapEndToPresentationCompositorFrame") AS presentation_timestamp,
+  _descendant_slice_end(slice.id, "LatchToSwapEnd") AS input_latency_end_ts,
+  _descendant_slice_end(slice.id, "SwapEndToPresentationCompositorFrame") AS presentation_timestamp,
   EXTRACT_ARG(arg_set_id, 'event_latency.event_type') AS event_type
 FROM slice
 WHERE name = "EventLatency"
@@ -144,7 +194,7 @@
           "GESTURE_SCROLL_UPDATE",
           "FIRST_GESTURE_SCROLL_UPDATE",
           "INERTIAL_GESTURE_SCROLL_UPDATE")
-      AND has_descendant_slice_with_name(slice.id, "SwapEndToPresentationCompositorFrame");
+      AND _has_descendant_slice_with_name(slice.id, "SwapEndToPresentationCompositorFrame");
 
 -- Join presented gesture scrolls with their respective event
 -- latencies based on |LatchToSwapEnd| timestamp, as it's the
@@ -384,8 +434,8 @@
   scroll_id INT
 ) AS
 SELECT
-  slice_name_from_id(cause_id) AS cause_of_jank,
-  slice_name_from_id(
+  _slice_name_from_id(cause_id) AS cause_of_jank,
+  _slice_name_from_id(
     -- Getting sub-cause
     chrome_get_v3_jank_cause_id(
       -- Here the cause itself is the parent.
@@ -394,7 +444,7 @@
      (SELECT
       id
       FROM slice
-      WHERE name = slice_name_from_id(cause_id)
+      WHERE name = _slice_name_from_id(cause_id)
         AND parent_id = prev_event_latency_id)
     )) AS sub_cause_of_jank,
   delay_since_last_frame,
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
index d746457..16a5246 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
@@ -2,10 +2,51 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
--- Helper functions for scroll_jank_v3 metric computation.
-
-INCLUDE PERFETTO MODULE common.slices;
-
+-- Finds all slices with a direct parent with the given parent_id.
+CREATE PERFETTO FUNCTION _direct_children_slice(
+  -- Id of the parent slice.
+  parent_id LONG)
+RETURNS TABLE(
+  -- Alias for `slice.id`.
+  id LONG,
+  -- Alias for `slice.type`.
+  type STRING,
+  -- Alias for `slice.ts`.
+  ts LONG,
+  -- Alias for `slice.dur`.
+  dur LONG,
+  -- Alias for `slice.category`.
+  category LONG,
+  -- Alias for `slice.name`.
+  name STRING,
+  -- Alias for `slice.track_id`.
+  track_id LONG,
+  -- Alias for `slice.depth`.
+  depth LONG,
+  -- Alias for `slice.parent_id`.
+  parent_id LONG,
+  -- Alias for `slice.arg_set_id`.
+  arg_set_id LONG,
+  -- Alias for `slice.thread_ts`.
+  thread_ts LONG,
+  -- Alias for `slice.thread_dur`.
+  thread_dur LONG
+) AS
+SELECT
+  slice.id,
+  slice.type,
+  slice.ts,
+  slice.dur,
+  slice.category,
+  slice.name,
+  slice.track_id,
+  slice.depth,
+  slice.parent_id,
+  slice.arg_set_id,
+  slice.thread_ts,
+  slice.thread_dur
+FROM slice
+WHERE parent_id = $parent_id;
 
 -- Given two slice Ids A and B, find the maximum difference
 -- between the durations of it's direct children with matching names
@@ -26,12 +67,12 @@
   current_breakdowns AS (
     SELECT
       *
-    FROM direct_children_slice($janky_slice_id)
+    FROM _direct_children_slice($janky_slice_id)
   ),
   prev_breakdowns AS (
     SELECT
       *
-    FROM direct_children_slice($prev_slice_id)
+    FROM _direct_children_slice($prev_slice_id)
   ),
   joint_breakdowns AS (
     SELECT
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
index f1e852b..7e45848 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
@@ -2,7 +2,7 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
 
 -- Access all startups, including those that don't lead to any visible content.
 -- If TimeToFirstVisibleContent is available, then this event will be the
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
index 420ef6b..a177cba 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
@@ -2,7 +2,20 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
-INCLUDE PERFETTO MODULE common.slices;
+-- Checks if slice has an ancestor with provided name.
+CREATE PERFETTO FUNCTION _has_parent_slice_with_name(
+  -- Id of the slice to check parents of.
+  id INT,
+  -- Name of potential ancestor slice.
+  parent_name STRING)
+-- Whether `parent_name` is a name of an ancestor slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+  SELECT 1
+  FROM ancestor_slice($id)
+  WHERE name = $parent_name
+  LIMIT 1
+);
 
 -- Returns the mojo ipc hash for a given task, looking it up from the
 -- argument of descendant ScopedSetIpcHash slice.
@@ -229,11 +242,11 @@
   s1.*,
   -- While the parent slices are too generic to be used by themselves,
   -- they can provide some useful metadata.
-  has_parent_slice_with_name(
+  _has_parent_slice_with_name(
     s1.id,
     "ViewResourceAdapter:captureWithSoftwareDraw"
   ) AS is_software_screenshot,
-  has_parent_slice_with_name(
+  _has_parent_slice_with_name(
     s1.id,
     "ViewResourceAdapter:captureWithHardwareDraw"
   ) AS is_hardware_screenshot
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
index d60992f..76ada01 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
@@ -2,7 +2,7 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
 
 -- Chrome web content interactions (InteractionToFirstPaint), including
 -- associated high-level metrics and properties.
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql
index 84badb6..05b6b21 100644
--- a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql
@@ -13,129 +13,7 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
--- All thread slices with data about thread, thread track and process.
--- Where possible, use available view functions which filter this view.
-CREATE PERFETTO VIEW thread_slice(
-  -- Alias for `slice.id`.
-  id INT,
-  -- Alias for `slice.type`.
-  type STRING,
-  -- Alias for `slice.ts`.
-  ts INT,
-  -- Alias for `slice.dur`.
-  dur INT,
-  -- Alias for `slice.category`.
-  category STRING,
-  -- Alias for `slice.name`.
-  name STRING,
-  -- Alias for `slice.track_id`.
-  track_id INT,
-  -- Alias for `thread_track.name`.
-  track_name STRING,
-  -- Alias for `thread.name`.
-  thread_name STRING,
-  -- Alias for `thread.utid`.
-  utid INT,
-  -- Alias for `thread.tid`
-  tid INT,
-  -- Alias for `process.name`.
-  process_name STRING,
-  -- Alias for `process.upid`.
-  upid INT,
-  -- Alias for `process.pid`.
-  pid INT,
-  -- Alias for `slice.depth`.
-  depth INT,
-  -- Alias for `slice.parent_id`.
-  parent_id INT,
-  -- Alias for `slice.arg_set_id`.
-  arg_set_id INT,
-  -- Alias for `slice.thread_ts`.
-  thread_ts INT,
-  -- Alias for `slice.thread_dur`.
-  thread_dur INT
-) AS
-SELECT
-  slice.id,
-  slice.type,
-  slice.ts,
-  slice.dur,
-  slice.category,
-  slice.name,
-  slice.track_id,
-  thread_track.name AS track_name,
-  thread.name AS thread_name,
-  thread.utid,
-  thread.tid,
-  process.name AS process_name,
-  process.upid,
-  process.pid,
-  slice.depth,
-  slice.parent_id,
-  slice.arg_set_id,
-  slice.thread_ts,
-  slice.thread_dur
-FROM slice
-JOIN thread_track ON slice.track_id = thread_track.id
-JOIN thread USING (utid)
-LEFT JOIN process USING (upid);
-
--- All process slices with data about process track and process.
--- Where possible, use available view functions which filter this view.
-CREATE PERFETTO VIEW process_slice(
-  -- Alias for `slice.id`.
-  id INT,
-  -- Alias for `slice.type`.
-  type STRING,
-  -- Alias for `slice.ts`.
-  ts INT,
-  -- Alias for `slice.dur`.
-  dur INT,
-  -- Alias for `slice.category`.
-  category STRING,
-  -- Alias for `slice.name`.
-  name STRING,
-  -- Alias for `slice.track_id`.
-  track_id INT,
-  -- Alias for `process_track.name`.
-  track_name STRING,
-  -- Alias for `process.name`.
-  process_name STRING,
-  -- Alias for `process.upid`.
-  upid INT,
-  -- Alias for `process.pid`.
-  pid INT,
-  -- Alias for `slice.depth`.
-  depth INT,
-  -- Alias for `slice.parent_id`.
-  parent_id INT,
-  -- Alias for `slice.arg_set_id`.
-  arg_set_id INT,
-  -- Alias for `slice.thread_ts`.
-  thread_ts INT,
-  -- Alias for `slice.thread_dur`.
-  thread_dur INT
-) AS
-SELECT
-  slice.id,
-  slice.type,
-  slice.ts,
-  slice.dur,
-  slice.category,
-  slice.name,
-  slice.track_id,
-  process_track.name AS track_name,
-  process.name AS process_name,
-  process.upid,
-  process.pid,
-  slice.depth,
-  slice.parent_id,
-  slice.arg_set_id,
-  slice.thread_ts,
-  slice.thread_dur
-FROM slice
-JOIN process_track ON slice.track_id = process_track.id
-JOIN process USING (upid);
+INCLUDE PERFETTO MODULE slices.with_context;
 
 -- Checks if slice has an ancestor with provided name.
 CREATE PERFETTO FUNCTION has_parent_slice_with_name(
@@ -168,14 +46,6 @@
   LIMIT 1
 );
 
--- Count slices with specified name.
-CREATE PERFETTO FUNCTION slice_count(
-  -- Name of the slices to counted.
-  slice_glob STRING)
--- Number of slices with the name.
-RETURNS INT AS
-SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;;
-
 -- Finds the end timestamp for a given slice's descendant with a given name.
 -- If there are multiple descendants with a given name, the function will return the
 -- first one, so it's most useful when working with a timeline broken down into phases,
@@ -254,3 +124,10 @@
   name
 FROM slice
 WHERE $id = id;
+
+CREATE PERFETTO FUNCTION slice_count(
+  -- Name of the slices to counted.
+  slice_glob STRING)
+-- Number of slices with the name.
+RETURNS INT AS
+SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;
diff --git a/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql b/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
index 8e74d2f..19f68c2 100644
--- a/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
@@ -14,7 +14,6 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.slices;
 INCLUDE PERFETTO MODULE slices.flat_slices;
 
 -- A 'thread_executing_span' is thread_state span starting with a runnable slice
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
index ac79369..2e5f02f 100644
--- a/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
@@ -18,5 +18,6 @@
   sources = [
     "flat_slices.sql",
     "slices.sql",
+    "with_context.sql",
   ]
 }
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql b/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
index 20383b3..9b08700 100644
--- a/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
@@ -13,8 +13,6 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
-INCLUDE PERFETTO MODULE common.slices;
-
 -- All slices with related process and thread info if available. Unlike
 -- `thread_slice` and `process_slice`, this view contains all slices,
 -- with thread- and process-related columns set to NULL if the slice
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql b/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql
new file mode 100644
index 0000000..6e9ba0d
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql
@@ -0,0 +1,138 @@
+--
+-- Copyright 2024 The Android Open Source Project
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- All thread slices with data about thread, thread track and process.
+-- Where possible, use available view functions which filter this view.
+CREATE PERFETTO VIEW thread_slice(
+  -- Alias for `slice.id`.
+  id INT,
+  -- Alias for `slice.type`.
+  type STRING,
+  -- Alias for `slice.ts`.
+  ts INT,
+  -- Alias for `slice.dur`.
+  dur INT,
+  -- Alias for `slice.category`.
+  category STRING,
+  -- Alias for `slice.name`.
+  name STRING,
+  -- Alias for `slice.track_id`.
+  track_id INT,
+  -- Alias for `thread_track.name`.
+  track_name STRING,
+  -- Alias for `thread.name`.
+  thread_name STRING,
+  -- Alias for `thread.utid`.
+  utid INT,
+  -- Alias for `thread.tid`
+  tid INT,
+  -- Alias for `process.name`.
+  process_name STRING,
+  -- Alias for `process.upid`.
+  upid INT,
+  -- Alias for `process.pid`.
+  pid INT,
+  -- Alias for `slice.depth`.
+  depth INT,
+  -- Alias for `slice.parent_id`.
+  parent_id INT,
+  -- Alias for `slice.arg_set_id`.
+  arg_set_id INT,
+  -- Alias for `slice.thread_ts`.
+  thread_ts INT,
+  -- Alias for `slice.thread_dur`.
+  thread_dur INT
+) AS
+SELECT
+  slice.id,
+  slice.type,
+  slice.ts,
+  slice.dur,
+  slice.category,
+  slice.name,
+  slice.track_id,
+  thread_track.name AS track_name,
+  thread.name AS thread_name,
+  thread.utid,
+  thread.tid,
+  process.name AS process_name,
+  process.upid,
+  process.pid,
+  slice.depth,
+  slice.parent_id,
+  slice.arg_set_id,
+  slice.thread_ts,
+  slice.thread_dur
+FROM slice
+JOIN thread_track ON slice.track_id = thread_track.id
+JOIN thread USING (utid)
+LEFT JOIN process USING (upid);
+
+-- All process slices with data about process track and process.
+-- Where possible, use available view functions which filter this view.
+CREATE PERFETTO VIEW process_slice(
+  -- Alias for `slice.id`.
+  id INT,
+  -- Alias for `slice.type`.
+  type STRING,
+  -- Alias for `slice.ts`.
+  ts INT,
+  -- Alias for `slice.dur`.
+  dur INT,
+  -- Alias for `slice.category`.
+  category STRING,
+  -- Alias for `slice.name`.
+  name STRING,
+  -- Alias for `slice.track_id`.
+  track_id INT,
+  -- Alias for `process_track.name`.
+  track_name STRING,
+  -- Alias for `process.name`.
+  process_name STRING,
+  -- Alias for `process.upid`.
+  upid INT,
+  -- Alias for `process.pid`.
+  pid INT,
+  -- Alias for `slice.depth`.
+  depth INT,
+  -- Alias for `slice.parent_id`.
+  parent_id INT,
+  -- Alias for `slice.arg_set_id`.
+  arg_set_id INT,
+  -- Alias for `slice.thread_ts`.
+  thread_ts INT,
+  -- Alias for `slice.thread_dur`.
+  thread_dur INT
+) AS
+SELECT
+  slice.id,
+  slice.type,
+  slice.ts,
+  slice.dur,
+  slice.category,
+  slice.name,
+  slice.track_id,
+  process_track.name AS track_name,
+  process.name AS process_name,
+  process.upid,
+  process.pid,
+  slice.depth,
+  slice.parent_id,
+  slice.arg_set_id,
+  slice.thread_ts,
+  slice.thread_dur
+FROM slice
+JOIN process_track ON slice.track_id = process_track.id
+JOIN process USING (upid);
\ No newline at end of file
diff --git a/test/data/freezer_trace.atr.sha256 b/test/data/freezer_trace.atr.sha256
new file mode 100644
index 0000000..bbe6a9b
--- /dev/null
+++ b/test/data/freezer_trace.atr.sha256
@@ -0,0 +1 @@
+abbffc92db09d1b7fd3452e9d5e91aebd5a13151660125c6e25776331efccc53
\ No newline at end of file
diff --git a/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py b/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
index c2336ce..70dec5c 100644
--- a/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
+++ b/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
@@ -458,4 +458,76 @@
             }
           }
         }
+        """))
+
+  def test_has_descendant_slice_with_name_true(self):
+    return DiffTestBlueprint(
+        # We need a trace with a large number of non-chrome slices, so that the
+        # reliable range is affected by their filtering.
+        trace=DataPath('chrome_input_with_frame_view.pftrace'),
+        query="""
+        INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+        SELECT
+          _HAS_DESCENDANT_SLICE_WITH_NAME(
+            (SELECT id from slice where dur = 46046000),
+            'SwapEndToPresentationCompositorFrame') AS has_descendant;
+        """,
+        out=Csv("""
+        "has_descendant"
+        1
+        """))
+
+  def test_has_descendant_slice_with_name_false(self):
+    return DiffTestBlueprint(
+        # We need a trace with a large number of non-chrome slices, so that the
+        # reliable range is affected by their filtering.
+        trace=DataPath('chrome_input_with_frame_view.pftrace'),
+        query="""
+        INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+        SELECT
+          _HAS_DESCENDANT_SLICE_WITH_NAME(
+            (SELECT id from slice where dur = 11666000),
+            'SwapEndToPresentationCompositorFrame') AS has_descendant;
+        """,
+        out=Csv("""
+        "has_descendant"
+        0
+        """))
+
+  def test_descendant_slice_null(self):
+    return DiffTestBlueprint(
+        # We need a trace with a large number of non-chrome slices, so that the
+        # reliable range is affected by their filtering.
+        trace=DataPath('chrome_input_with_frame_view.pftrace'),
+        query="""
+        INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+        SELECT
+          _DESCENDANT_SLICE_END(
+            (SELECT id from slice where dur = 11666000),
+            'SwapEndToPresentationCompositorFrame') AS end_ts;
+        """,
+        out=Csv("""
+        "end_ts"
+        "[NULL]"
+        """))
+
+  def test_descendant_slice(self):
+    return DiffTestBlueprint(
+        # We need a trace with a large number of non-chrome slices, so that the
+        # reliable range is affected by their filtering.
+        trace=DataPath('chrome_input_with_frame_view.pftrace'),
+        query="""
+        INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+        SELECT
+          _DESCENDANT_SLICE_END(
+            (SELECT id from slice where dur = 46046000),
+            'SwapEndToPresentationCompositorFrame') AS end_ts;
+        """,
+        out=Csv("""
+        "end_ts"
+        174797566610797
         """))
\ No newline at end of file
diff --git a/test/trace_processor/diff_tests/stdlib/android/tests.py b/test/trace_processor/diff_tests/stdlib/android/tests.py
index ad4a5ed..23ae137 100644
--- a/test/trace_processor/diff_tests/stdlib/android/tests.py
+++ b/test/trace_processor/diff_tests/stdlib/android/tests.py
@@ -1161,14 +1161,21 @@
 
   def test_freezer_events(self):
     return DiffTestBlueprint(
-        trace=DataPath('post_boot_trace.atr'),
+        trace=DataPath('freezer_trace.atr'),
         query="""
         INCLUDE PERFETTO MODULE android.freezer;
-        SELECT pid, ts, dur FROM android_freezer_events ORDER BY ts
+        SELECT pid, ts, dur, unfreeze_reason_int, unfreeze_reason_str FROM android_freezer_events ORDER BY ts
       """,
         out=Csv("""
-        "pid","ts","dur"
-        8361,588092720937,576298685
+        "pid","ts","dur","unfreeze_reason_int","unfreeze_reason_str"
+        6506,91266310231819,94699935803,"[NULL]","[NULL]"
+        3804,91266322277324,94687890298,"[NULL]","[NULL]"
+        3299,91281767065245,78699885147,6,"start_service"
+        5782,91296291190245,64718977377,"[NULL]","[NULL]"
+        6533,91296292403211,64717764411,"[NULL]","[NULL]"
+        4044,91296293188372,64716979250,"[NULL]","[NULL]"
+        4002,91296294215356,64715952266,"[NULL]","[NULL]"
+        3981,91296294804650,64715362972,"[NULL]","[NULL]"
         """))
 
   def test_service_bindings(self):
@@ -1213,3 +1220,38 @@
         0,"com.android.bluetooth","droid.bluetooth",7639,7639,571248973750,9874358,-700,"com.android.bluetooth","binder:7639_2",7672,7639,571871169647,6460322,"android.os.BinderProxy@7482132","android.bluetooth.IBluetooth","com.android.bluetooth/.btservice.AdapterService","[NULL]",4
         -700,"com.android.bluetooth","droid.bluetooth",7639,7639,572342110044,4874276,-700,"com.android.bluetooth","binder:7639_2",7672,7639,572466393291,1404185,"android.os.BinderProxy@ce5a6fc","android.media.browse.MediaBrowserService","com.android.bluetooth/.avrcpcontroller.BluetoothMediaBrowserService","[NULL]",10
       """))
+
+  def test_oom_adjuster_transitions(self):
+    return DiffTestBlueprint(
+        trace=DataPath('sched_wakeup_trace.atr'),
+        query="""
+        INCLUDE PERFETTO MODULE android.oom_adjuster;
+        SELECT
+        ts,
+        dur,
+        score,
+        bucket,
+        process_name,
+        oom_adj_ts,
+        oom_adj_dur,
+        oom_adj_thread_name,
+        oom_adj_reason,
+        oom_adj_trigger
+        FROM android_oom_adj_intervals
+        WHERE oom_adj_reason IS NOT NULL
+        ORDER BY ts
+        LIMIT 10
+      """,
+        out=Csv("""
+        "ts","dur","score","bucket","process_name","oom_adj_ts","oom_adj_dur","oom_adj_thread_name","oom_adj_reason","oom_adj_trigger"
+        1737065264829,701108081,925,"cached_app","com.android.providers.calendar",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737066678827,3470211742,935,"cached_app","com.android.imsserviceentitlement",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737066873002,3470017567,945,"cached_app","com.android.carrierconfig",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737067058812,3469831757,955,"cached_app_lmk_first","com.android.messaging",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737067246975,699224817,955,"cached_app_lmk_first","android.process.acore",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737068421919,3468468650,965,"cached_app_lmk_first","com.android.shell",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737068599673,697908135,965,"cached_app_lmk_first","android.process.media",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737068933602,3467956967,975,"cached_app_lmk_first","com.android.gallery3d",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737069091010,3467799559,975,"cached_app_lmk_first","com.android.packageinstaller",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737069240534,3467650035,985,"cached_app_lmk_first","com.android.managedprovisioning",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+      """))
diff --git a/test/trace_processor/diff_tests/stdlib/slices/tests.py b/test/trace_processor/diff_tests/stdlib/slices/tests.py
index 9b565bb..e3db459 100644
--- a/test/trace_processor/diff_tests/stdlib/slices/tests.py
+++ b/test/trace_processor/diff_tests/stdlib/slices/tests.py
@@ -26,7 +26,7 @@
     return DiffTestBlueprint(
         trace=Path('trace.py'),
         query="""
-        INCLUDE PERFETTO MODULE common.slices;
+        INCLUDE PERFETTO MODULE slices.with_context;
 
         SELECT name, ts, dur, depth, thread_name, tid, process_name, pid
         FROM thread_slice;
@@ -40,7 +40,7 @@
     return DiffTestBlueprint(
         trace=Path('trace.py'),
         query="""
-        INCLUDE PERFETTO MODULE common.slices;
+        INCLUDE PERFETTO MODULE slices.with_context;
 
         SELECT name, ts, dur, depth, process_name, pid
         FROM process_slice;
@@ -67,77 +67,6 @@
       """))
 
   # Common functions
-  def test_has_descendant_slice_with_name_true(self):
-    return DiffTestBlueprint(
-        # We need a trace with a large number of non-chrome slices, so that the
-        # reliable range is affected by their filtering.
-        trace=DataPath('chrome_input_with_frame_view.pftrace'),
-        query="""
-        INCLUDE PERFETTO MODULE common.slices;
-
-        SELECT
-          HAS_DESCENDANT_SLICE_WITH_NAME(
-            (SELECT id from slice where dur = 46046000),
-            'SwapEndToPresentationCompositorFrame') AS has_descendant;
-        """,
-        out=Csv("""
-        "has_descendant"
-        1
-        """))
-
-  def test_has_descendant_slice_with_name_false(self):
-    return DiffTestBlueprint(
-        # We need a trace with a large number of non-chrome slices, so that the
-        # reliable range is affected by their filtering.
-        trace=DataPath('chrome_input_with_frame_view.pftrace'),
-        query="""
-        INCLUDE PERFETTO MODULE common.slices;
-
-        SELECT
-          HAS_DESCENDANT_SLICE_WITH_NAME(
-            (SELECT id from slice where dur = 11666000),
-            'SwapEndToPresentationCompositorFrame') AS has_descendant;
-        """,
-        out=Csv("""
-        "has_descendant"
-        0
-        """))
-
-  def test_descendant_slice_null(self):
-    return DiffTestBlueprint(
-        # We need a trace with a large number of non-chrome slices, so that the
-        # reliable range is affected by their filtering.
-        trace=DataPath('chrome_input_with_frame_view.pftrace'),
-        query="""
-        INCLUDE PERFETTO MODULE common.slices;
-
-        SELECT
-          DESCENDANT_SLICE_END(
-            (SELECT id from slice where dur = 11666000),
-            'SwapEndToPresentationCompositorFrame') AS end_ts;
-        """,
-        out=Csv("""
-        "end_ts"
-        "[NULL]"
-        """))
-
-  def test_descendant_slice(self):
-    return DiffTestBlueprint(
-        # We need a trace with a large number of non-chrome slices, so that the
-        # reliable range is affected by their filtering.
-        trace=DataPath('chrome_input_with_frame_view.pftrace'),
-        query="""
-        INCLUDE PERFETTO MODULE common.slices;
-
-        SELECT
-          DESCENDANT_SLICE_END(
-            (SELECT id from slice where dur = 46046000),
-            'SwapEndToPresentationCompositorFrame') AS end_ts;
-        """,
-        out=Csv("""
-        "end_ts"
-        174797566610797
-        """))
 
   def test_slice_flattened(self):
     return DiffTestBlueprint(
diff --git a/ui/src/core/feature_flags.ts b/ui/src/core/feature_flags.ts
index f00d535..5fec7bb 100644
--- a/ui/src/core/feature_flags.ts
+++ b/ui/src/core/feature_flags.ts
@@ -249,5 +249,5 @@
   id: 'tabsv2',
   name: 'Tabs V2',
   description: 'Use Tabs V2',
-  defaultValue: false,
+  defaultValue: true,
 });