blob: a717d81eb030aa0772e64b1f62e2b65f70d15b81 [file] [log] [blame]
# -*- coding: utf-8 -*-
# Copyright 2018 The ChromiumOS Authors
# 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."""
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