Lgtm On Jun 2, 2015 1:31 PM, "Russell Gallop" <[email protected]> wrote:
> 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/ >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
