• 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, Optional
8
9from crossbench.probes.chromium_probe import ChromiumProbe
10from crossbench.probes.probe import ProbeContext
11from crossbench.probes.results import LocalProbeResult, ProbeResult
12
13if TYPE_CHECKING:
14  from crossbench.browsers.browser import Browser
15  from crossbench.runner.groups.repetitions import RepetitionsRunGroup
16  from crossbench.runner.groups.stories import StoriesRunGroup
17  from crossbench.runner.run import Run
18
19
20class V8BuiltinsPGOProbe(ChromiumProbe):
21  """
22  Chromium-only Probe to extract V8 builtins PGO data.
23  The resulting data is used to optimize Torque and CSA builtins.
24  """
25  NAME = "v8.builtins.pgo"
26
27  def attach(self, browser: Browser) -> None:
28    assert browser.attributes.is_chromium_based, (
29        "Expected Chromium-based browser.")
30    super().attach(browser)
31    browser.js_flags.set("--allow-natives-syntax")
32
33  def get_context(self, run: Run) -> V8BuiltinsPGOProbeContext:
34    return V8BuiltinsPGOProbeContext(self, run)
35
36  def merge_repetitions(self, group: RepetitionsRunGroup) -> ProbeResult:
37    merged_result_path = group.get_local_probe_result_path(self)
38    result_files = (run.results[self].file for run in group.runs)
39    result_file = self.host_platform.concat_files(
40        inputs=result_files, output=merged_result_path)
41    return LocalProbeResult(file=(result_file,))
42
43  def merge_stories(self, group: StoriesRunGroup) -> ProbeResult:
44    merged_result_path = group.get_local_probe_result_path(self)
45    result_files = (g.results[self].file for g in group.repetitions_groups)
46    result_file = self.host_platform.concat_files(
47        inputs=result_files, output=merged_result_path)
48    return LocalProbeResult(file=(result_file,))
49
50
51class V8BuiltinsPGOProbeContext(ProbeContext[V8BuiltinsPGOProbe]):
52  _pgo_counters: Optional[str] = None
53
54  def setup(self) -> None:
55    pass
56
57  def start(self) -> None:
58    pass
59
60  def stop(self) -> None:
61    with self.run.actions("Extract Builtins PGO DATA") as actions:
62      self._pgo_counters = actions.js(
63          "return %GetAndResetTurboProfilingData();")
64
65  def teardown(self) -> ProbeResult:
66    assert self._pgo_counters is not None and self._pgo_counters, (
67        "Chrome didn't produce any V8 builtins PGO data. "
68        "Please make sure to set the v8_enable_builtins_profiling=true "
69        "gn args.")
70    pgo_file = self.local_result_path
71    with pgo_file.open("a") as f:
72      f.write(self._pgo_counters)
73    return LocalProbeResult(file=(pgo_file,))
74