aboutsummaryrefslogtreecommitdiff
path: root/debug_info_test/check_cus.py
diff options
context:
space:
mode:
Diffstat (limited to 'debug_info_test/check_cus.py')
-rw-r--r--debug_info_test/check_cus.py67
1 files changed, 67 insertions, 0 deletions
diff --git a/debug_info_test/check_cus.py b/debug_info_test/check_cus.py
new file mode 100644
index 00000000..f68fe9cb
--- /dev/null
+++ b/debug_info_test/check_cus.py
@@ -0,0 +1,67 @@
+# 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.
+
+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
+ Return:
+ True if everything looks fine otherwise False.
+ """
+
+ failed = set()
+ producer = ''
+ comp_path = ''
+
+ readelf = subprocess.Popen(['readelf', '--debug-dump=info',
+ '--dwarf-depth=1', dso_path],
+ stdout=subprocess.PIPE,
+ stderr=open(os.devnull, 'w'))
+ 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