diff options
Diffstat (limited to 'clang-r353983/share/opt-viewer/opt-diff.py')
| -rwxr-xr-x | clang-r353983/share/opt-viewer/opt-diff.py | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/clang-r353983/share/opt-viewer/opt-diff.py b/clang-r353983/share/opt-viewer/opt-diff.py new file mode 100755 index 00000000..36e81a5d --- /dev/null +++ b/clang-r353983/share/opt-viewer/opt-diff.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python + +from __future__ import print_function + +desc = '''Generate the difference of two YAML files into a new YAML file (works on +pair of directories too). A new attribute 'Added' is set to True or False +depending whether the entry is added or removed from the first input to the +next. + +The tools requires PyYAML.''' + +import yaml +# Try to use the C parser. +try: + from yaml import CLoader as Loader +except ImportError: + from yaml import Loader + +import optrecord +import argparse +from collections import defaultdict + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=desc) + parser.add_argument( + 'yaml_dir_or_file_1', + help='An optimization record file or a directory searched for optimization ' + 'record files that are used as the old version for the comparison') + parser.add_argument( + 'yaml_dir_or_file_2', + help='An optimization record file or a directory searched for optimization ' + 'record files that are used as the new version for the comparison') + parser.add_argument( + '--jobs', + '-j', + default=None, + type=int, + help='Max job count (defaults to %(default)s, the current CPU count)') + parser.add_argument( + '--max-size', + '-m', + default=100000, + type=int, + help='Maximum number of remarks stored in an output file') + parser.add_argument( + '--no-progress-indicator', + '-n', + action='store_true', + default=False, + help='Do not display any indicator of how many YAML files were read.') + parser.add_argument('--output', '-o', default='diff{}.opt.yaml') + args = parser.parse_args() + + files1 = optrecord.find_opt_files(args.yaml_dir_or_file_1) + files2 = optrecord.find_opt_files(args.yaml_dir_or_file_2) + + print_progress = not args.no_progress_indicator + all_remarks1, _, _ = optrecord.gather_results(files1, args.jobs, print_progress) + all_remarks2, _, _ = optrecord.gather_results(files2, args.jobs, print_progress) + + added = set(all_remarks2.values()) - set(all_remarks1.values()) + removed = set(all_remarks1.values()) - set(all_remarks2.values()) + + for r in added: + r.Added = True + for r in removed: + r.Added = False + + result = list(added | removed) + for r in result: + r.recover_yaml_structure() + + for i in range(0, len(result), args.max_size): + with open(args.output.format(i / args.max_size), 'w') as stream: + yaml.dump_all(result[i:i + args.max_size], stream) |
