#
# Copyright (C) 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the 'License');
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an 'AS IS' BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import glob
import os
import re
import subprocess


def GetFromTxt(txt_file):
    symbols = set()
    f = open(txt_file, 'r')
    for line in f.read().splitlines():
        symbols.add(line)
    f.close()
    return symbols


def GetFromElf(elf_file, sym_type='--dyn-syms'):
    # pylint: disable=line-too-long
    # Example readelf output:
    #     264: 0001623c         4 FUNC        GLOBAL DEFAULT        8 cabsf
    #     266: 00016244         4 FUNC        GLOBAL DEFAULT        8 dremf
    #     267: 00019018         4 OBJECT    GLOBAL DEFAULT     11 __fe_dfl_env
    #     268: 00000000         0 FUNC        GLOBAL DEFAULT    UND __aeabi_dcmplt

    r = re.compile(
        r' +\d+: [0-9a-f]+ +\d+ (I?FUNC|OBJECT) +\S+ +\S+ +\d+ (\S+)')

    symbols = set()

    output = subprocess.check_output(['readelf', sym_type, '-W', elf_file],
            text=True)
    for line in output.split('\n'):
        if ' HIDDEN ' in line or ' UND ' in line:
            continue
        m = r.match(line)
        if m:
            symbol = m.group(2)
            symbol = re.sub('@.*', '', symbol)
            symbols.add(symbol)

    return symbols


def GetFromAndroidStaticLib(files):
    out_dir = os.environ['ANDROID_PRODUCT_OUT']
    lib_dir = os.path.join(out_dir, 'obj')

    results = set()
    for f in files:
        static_lib_dir = os.path.join(
            lib_dir,
            'STATIC_LIBRARIES',
            '{}_intermediates'.format(os.path.splitext(f)[0]))
        results |= GetFromElf(
            os.path.join(static_lib_dir, f),
            sym_type='--syms')
    return results


def GetFromAndroidSo(files):
    out_dir = os.environ['ANDROID_PRODUCT_OUT']
    lib_dir = os.path.join(out_dir, 'system/lib64')
    if not os.path.isdir(lib_dir):
        lib_dir = os.path.join(out_dir, 'system/lib')

    lib_dir = os.path.join(out_dir, 'apex/com.android.runtime/lib64/bionic/')
    if not os.path.isdir(lib_dir):
        lib_dir = os.path.join(out_dir, 'apex/com.android.runtime/lib/bionic/')

    results = set()
    for f in files:
        results |= GetFromElf(os.path.join(lib_dir, f))
    return results


def GetFromSystemSo(files):
    lib_dir = '/lib/x86_64-linux-gnu'
    results = set()
    for f in files:
        results |= GetFromElf(glob.glob(os.path.join(lib_dir, f))[-1])
    return results
