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