# 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.

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
    Return:
        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'))
    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
