# -*- coding: utf-8 -*-
# Copyright 2018 The ChromiumOS 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 compile units."""

from __future__ import print_function

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
