# -*- 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 compile units."""


import os
import subprocess

import check_ngcc


cu_checks = [check_ngcc.not_by_gcc]


def check_compile_unit(dso_path, producer, comp_path):
    """check all compiler flags used to build the compile unit.

    Args:
      dso_path: path to the elf/dso.
      producer: DW_AT_producer contains the compiler command line.
      comp_path: DW_AT_comp_dir + DW_AT_name.

    Returns:
      A set of failed tests.
    """
    failed = set()
    for c in cu_checks:
        if not c(dso_path, producer, comp_path):
            failed.add(c.__module__)

    return failed


def check_compile_units(dso_path):
    """check all compile units in the given dso.

    Args:
      dso_path: path to the dso.

    Returns:
      True if everything looks fine otherwise False.
    """

    failed = set()
    producer = ""
    comp_path = ""

    readelf = subprocess.Popen(
        ["llvm-dwarfdump", "--recurse-depth=0", dso_path],
        stdout=subprocess.PIPE,
        stderr=open(os.devnull, "w"),
        encoding="utf-8",
    )
    for l in readelf.stdout:
        if "DW_TAG_compile_unit" in l:
            if producer:
                failed = failed.union(
                    check_compile_unit(dso_path, producer, comp_path)
                )
            producer = ""
            comp_path = ""
        elif "DW_AT_producer" in l:
            producer = l
        elif "DW_AT_name" in l:
            comp_path = os.path.join(comp_path, l.split(":")[-1].strip())
        elif "DW_AT_comp_dir" in l:
            comp_path = os.path.join(l.split(":")[-1].strip(), comp_path)
    if producer:
        failed = failed.union(check_compile_unit(dso_path, producer, comp_path))

    if failed:
        print("%s failed check: %s" % (dso_path, " ".join(failed)))
        return False

    return True
