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