r238926 - [utils] Add exact check to check_cfc.py dash_s_no_change.
Russell Gallop
russell.gallop at gmail.com
Wed Jun 3 07:33:57 PDT 2015
Author: russell_gallop
Date: Wed Jun 3 09:33:57 2015
New Revision: 238926
URL: http://llvm.org/viewvc/llvm-project?rev=238926&view=rev
Log:
[utils] Add exact check to check_cfc.py dash_s_no_change.
Files compiled with -via-file-asm should be byte for byte identical. This
change improves the checking on dash_s_no_change to detect non-code
differences. If there is a difference, the check goes on to compare code and
debug to try and be more informative.
Modified:
cfe/trunk/utils/check_cfc/check_cfc.py
cfe/trunk/utils/check_cfc/obj_diff.py
Modified: cfe/trunk/utils/check_cfc/check_cfc.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/check_cfc/check_cfc.py?rev=238926&r1=238925&r2=238926&view=diff
==============================================================================
--- cfe/trunk/utils/check_cfc/check_cfc.py (original)
+++ cfe/trunk/utils/check_cfc/check_cfc.py Wed Jun 3 09:33:57 2015
@@ -282,12 +282,24 @@ class dash_s_no_change(WrapperCheck):
run_step(alternate_command, my_env,
"Error compiling with -via-file-asm")
- # Compare disassembly (returns first diff if differs)
- difference = obj_diff.compare_object_files(self._output_file_a,
- output_file_b)
- if difference:
- raise WrapperCheckException(
- "Code difference detected with -S\n{}".format(difference))
+ # Compare if object files are exactly the same
+ exactly_equal = obj_diff.compare_exact(self._output_file_a, output_file_b)
+ if not exactly_equal:
+ # Compare disassembly (returns first diff if differs)
+ difference = obj_diff.compare_object_files(self._output_file_a,
+ output_file_b)
+ if difference:
+ raise WrapperCheckException(
+ "Code difference detected with -S\n{}".format(difference))
+
+ # Code is identical, compare debug info
+ dbgdifference = obj_diff.compare_debug_info(self._output_file_a,
+ output_file_b)
+ if dbgdifference:
+ raise WrapperCheckException(
+ "Debug info difference detected with -S\n{}".format(dbgdifference))
+
+ raise WrapperCheckException("Object files not identical with -S\n")
# Clean up temp file if comparison okay
os.remove(output_file_b)
Modified: cfe/trunk/utils/check_cfc/obj_diff.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/check_cfc/obj_diff.py?rev=238926&r1=238925&r2=238926&view=diff
==============================================================================
--- cfe/trunk/utils/check_cfc/obj_diff.py (original)
+++ cfe/trunk/utils/check_cfc/obj_diff.py Wed Jun 3 09:33:57 2015
@@ -4,6 +4,7 @@ from __future__ import print_function
import argparse
import difflib
+import filecmp
import os
import subprocess
import sys
@@ -26,6 +27,15 @@ def disassemble(objfile):
sys.exit(1)
return filter(keep_line, out.split(os.linesep))
+def dump_debug(objfile):
+ """Dump all of the debug info from a file."""
+ p = subprocess.Popen([disassembler, '-WliaprmfsoRt', objfile], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ (out, err) = p.communicate()
+ if p.returncode or err:
+ print("Dump debug failed: {}".format(objfile))
+ sys.exit(1)
+ return filter(keep_line, out.split(os.linesep))
+
def first_diff(a, b, fromfile, tofile):
"""Returns the first few lines of a difference, if there is one. Python
diff can be very slow with large objects and the most interesting changes
@@ -63,6 +73,22 @@ def compare_object_files(objfilea, objfi
disb = disassemble(objfileb)
return first_diff(disa, disb, objfilea, objfileb)
+def compare_debug_info(objfilea, objfileb):
+ """Compare debug info of two different files.
+ Allowing unavoidable differences, such as filenames.
+ Return the first difference if the debug info differs, or None.
+ If there are differences in the code, there will almost certainly be differences in the debug info too.
+ """
+ dbga = dump_debug(objfilea)
+ dbgb = dump_debug(objfileb)
+ return first_diff(dbga, dbgb, objfilea, objfileb)
+
+def compare_exact(objfilea, objfileb):
+ """Byte for byte comparison between object files.
+ Returns True if equal, False otherwise.
+ """
+ return filecmp.cmp(objfilea, objfileb)
+
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('objfilea', nargs=1)
More information about the cfe-commits
mailing list