# -*- coding: utf-8 -*- # 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. """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