[PATCH] [utils] Add exact check to check_cfc.py dash_s_no_change

Russell Gallop russell.gallop at gmail.com
Tue Jun 2 09:40:15 PDT 2015


Hi rafael, echristo,

Files compiled with -via-file-asm should be byte for byte identical to those compiled in the same way without that option. This change adds an exact check to check_cfc.py to spot non-code differences. If there is a difference, the check then compares code and debug to try and report more detail on the check failure.

This could be helpful in finding bugs like this one: https://llvm.org/bugs/show_bug.cgi?id=14524

Running the llvm-test-suite there are dash_s_no_change check failures (as of r238815) but not failures in check_cfc.py or new failures introduced by this change. I will report bugs for these check failures.

Please let me know if okay to commit?

http://reviews.llvm.org/D10188

Files:
  utils/check_cfc/check_cfc.py
  utils/check_cfc/obj_diff.py

Index: utils/check_cfc/check_cfc.py
===================================================================
--- utils/check_cfc/check_cfc.py
+++ utils/check_cfc/check_cfc.py
@@ -282,12 +282,24 @@
         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)
Index: utils/check_cfc/obj_diff.py
===================================================================
--- utils/check_cfc/obj_diff.py
+++ utils/check_cfc/obj_diff.py
@@ -4,6 +4,7 @@
 
 import argparse
 import difflib
+import filecmp
 import os
 import subprocess
 import sys
@@ -26,6 +27,15 @@
         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 @@
     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)

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10188.26966.patch
Type: text/x-patch
Size: 3571 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150602/d9a533b7/attachment.bin>


More information about the cfe-commits mailing list