xref: /aosp_15_r20/external/autotest/client/profilers/pgo/pgo.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
3*9c5db199SXin Li# found in the LICENSE file.
4*9c5db199SXin Li
5*9c5db199SXin Li"""
6*9c5db199SXin LiThis is a profiler class for copying Profile-Guided-Optimization (PGO) data
7*9c5db199SXin Lifiles back to the host. When Chrome is built with -fprofile-generate, it dumps
8*9c5db199SXin Liits PGO data in a directory that this test copies back to test.profdir.
9*9c5db199SXin Li
10*9c5db199SXin LiThe PGO data is found where the build happens in the chroot, which is hardcoded
11*9c5db199SXin Lias the source_dir below.
12*9c5db199SXin Li"""
13*9c5db199SXin Li
14*9c5db199SXin Liimport logging
15*9c5db199SXin Liimport os
16*9c5db199SXin Liimport shutil
17*9c5db199SXin Liimport tarfile
18*9c5db199SXin Li
19*9c5db199SXin Lifrom autotest_lib.client.bin import profiler
20*9c5db199SXin Lifrom autotest_lib.client.common_lib import error
21*9c5db199SXin Lifrom autotest_lib.client.cros import cros_ui
22*9c5db199SXin Li
23*9c5db199SXin Li
24*9c5db199SXin Liclass pgo(profiler.profiler):
25*9c5db199SXin Li    """The pgo profiler collects PGO data for Chrome."""
26*9c5db199SXin Li    version = 1
27*9c5db199SXin Li
28*9c5db199SXin Li    def initialize(self, source_dir='/tmp/pgo/chrome'):
29*9c5db199SXin Li        self._source_dir = source_dir
30*9c5db199SXin Li
31*9c5db199SXin Li
32*9c5db199SXin Li    def start(self, test):
33*9c5db199SXin Li        # Remove the .gcda files first.
34*9c5db199SXin Li        if os.path.exists(self._source_dir):
35*9c5db199SXin Li            shutil.rmtree(self._source_dir)
36*9c5db199SXin Li
37*9c5db199SXin Li
38*9c5db199SXin Li    def stop(self, test):
39*9c5db199SXin Li        if not cros_ui.stop_and_wait_for_chrome_to_exit(timeout_secs=40):
40*9c5db199SXin Li            raise error.TestError('Could not stop Chrome')
41*9c5db199SXin Li        if os.path.isdir(self._source_dir):
42*9c5db199SXin Li            tar = tarfile.open(name=os.path.join(test.profdir, 'pgo.tar.bz2'),
43*9c5db199SXin Li                               mode='w:bz2')
44*9c5db199SXin Li            tar.add(self._source_dir, arcname='chrome', recursive=True)
45*9c5db199SXin Li            tar.close()
46*9c5db199SXin Li            versionfile = '/opt/google/chrome/profilelocation'
47*9c5db199SXin Li            if os.path.isfile(versionfile):
48*9c5db199SXin Li               shutil.copyfile(versionfile,
49*9c5db199SXin Li                               os.path.join(test.profdir, 'profiledestination'))
50*9c5db199SXin Li        else:
51*9c5db199SXin Li            logging.error('PGO dir: %s not found', self._source_dir)
52*9c5db199SXin Li        cros_ui.start(wait_for_login_prompt=False)
53