aboutsummaryrefslogtreecommitdiff
path: root/debug_info_test/check_icf.py
blob: a46968e771470b856d3de2127e108e2ce74a0624 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# -*- coding: utf-8 -*-
# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""check whether chrome was built with identical code folding."""

from __future__ import print_function

import os
import re
import subprocess


def check_identical_code_folding(dso_path):
  """check whether chrome was built with identical code folding.

  Args:
    dso_path: path to the dso.

  Returns:
    False if the dso is chrome and it was not built with icf,
    True otherwise.
  """

  if not dso_path.endswith('/chrome.debug'):
    return True

  # Run 'nm' on the chrome binary and read the output.
  nm = subprocess.Popen(['nm', dso_path],
                        stdout=subprocess.PIPE,
                        stderr=open(os.devnull, 'w'),
                        encoding='utf-8')
  nm_output, _ = nm.communicate()

  # Search for addresses of text symbols.
  text_addresses = re.findall('^[0-9a-f]+[ ]+[tT] ', nm_output, re.MULTILINE)

  # Calculate number of text symbols in chrome binary.
  num_text_addresses = len(text_addresses)

  # Calculate number of unique text symbols in chrome binary.
  num_unique_text_addresses = len(set(text_addresses))

  # Check that the number of duplicate symbols is at least 10,000.
  #   - https://crbug.com/813272#c18
  if num_text_addresses - num_unique_text_addresses >= 10000:
    return True

  print('%s was not built with ICF' % dso_path)
  print('    num_text_addresses = %d' % num_text_addresses)
  print('    num_unique_text_addresses = %d' % num_unique_text_addresses)
  return False