• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2022 The Chromium Authors
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5from __future__ import annotations
6
7from typing import TYPE_CHECKING, cast
8
9from crossbench import helper
10from crossbench.browsers.chromium.chromium import Chromium
11from crossbench.probes.chromium_probe import ChromiumProbe
12from crossbench.probes.probe import ProbeContext
13from crossbench.probes.result_location import ResultLocation
14from crossbench.probes.results import (BrowserProbeResult, LocalProbeResult,
15                                       ProbeResult)
16
17if TYPE_CHECKING:
18  from crossbench.browsers.browser import Browser
19  from crossbench.path import AnyPath
20  from crossbench.runner.run import Run
21
22
23class V8TurbolizerProbe(ChromiumProbe):
24  """
25  Chromium-only Probe for extracting detailed turbofan graphs.
26  Note: This probe can have significant overhead.
27  Tool: https://v8.dev/tools/head/turbolizer
28  """
29  NAME = "v8.turbolizer"
30  RESULT_LOCATION = ResultLocation.BROWSER
31
32  def attach(self, browser: Browser) -> None:
33    super().attach(browser)
34    assert isinstance(browser, Chromium)
35    chromium = cast(Chromium, browser)
36    chromium.flags.set("--no-sandbox")
37    chromium.js_flags.set("--trace-turbo")
38
39  def get_context(self, run: Run) -> V8TurbolizerProbeContext:
40    return V8TurbolizerProbeContext(self, run)
41
42
43class V8TurbolizerProbeContext(ProbeContext[V8TurbolizerProbe]):
44
45  @property
46  def results_dir(self) -> AnyPath:
47    # Put v8.turbolizer files into separate dirs in case we have
48    # multiple isolates
49    turbolizer_log_dir = super().result_path
50    self.browser_platform.mkdir(turbolizer_log_dir, exist_ok=True)
51    return turbolizer_log_dir
52
53  def setup(self) -> None:
54    js_flags = self.session.extra_js_flags
55    js_flags["--trace-turbo-path"] = str(self.results_dir)
56    js_flags["--trace-turbo-cfg-file"] = str(self.results_dir / "cfg.graph")
57
58  def start(self) -> None:
59    pass
60
61  def stop(self) -> None:
62    pass
63
64  def teardown(self) -> ProbeResult:
65    log_dir = self.local_result_path.parent
66    # Copy the files from a potentially remote browser to a the local result
67    # dir.
68    result: BrowserProbeResult = self.browser_result(file=(log_dir,))
69    local_log_dir = result.file
70    assert local_log_dir.is_dir()
71    # Sort files locally after transferring them.
72    log_files = helper.sort_by_file_size(local_log_dir.glob("*"))
73    return LocalProbeResult(file=log_files)
74