diff options
author | Gabor Horvath <xazax.hun@gmail.com> | 2018-02-28 13:23:10 +0000 |
---|---|---|
committer | Gabor Horvath <xazax.hun@gmail.com> | 2018-02-28 13:23:10 +0000 |
commit | eb0584bee413c5b0f3275e47d6153433c8a3130f (patch) | |
tree | e9f412f0f0fe6c8a291bd02ecadaec4ccbd79b52 /clang/tools/scan-build-py/libscanbuild/report.py | |
parent | 4529aac2de3ffccbf015503681bb5c9712e295b7 (diff) | |
download | bcm5719-llvm-eb0584bee413c5b0f3275e47d6153433c8a3130f.tar.gz bcm5719-llvm-eb0584bee413c5b0f3275e47d6153433c8a3130f.zip |
[analyzer] Support for naive cross translation unit analysis
The aim of this patch is to be minimal to enable incremental development of
the feature on the top of the tree. This patch should be an NFC when the
feature is turned off. It is turned off by default and still considered as
experimental.
Technical details are available in the EuroLLVM Talk:
http://llvm.org/devmtg/2017-03//2017/02/20/accepted-sessions.html#7
Note that the initial prototype was done by A. Sidorin et al.: http://lists.llvm.org/pipermail/cfe-dev/2015-October/045730.html
Contributions to the measurements and the new version of the code: Peter Szecsi, Zoltan Gera, Daniel Krupp, Kareem Khazem.
Differential Revision: https://reviews.llvm.org/D30691
llvm-svn: 326323
Diffstat (limited to 'clang/tools/scan-build-py/libscanbuild/report.py')
-rw-r--r-- | clang/tools/scan-build-py/libscanbuild/report.py | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/clang/tools/scan-build-py/libscanbuild/report.py b/clang/tools/scan-build-py/libscanbuild/report.py index 54b9695d927..b3753c1d9d4 100644 --- a/clang/tools/scan-build-py/libscanbuild/report.py +++ b/clang/tools/scan-build-py/libscanbuild/report.py @@ -13,7 +13,6 @@ import os import os.path import sys import shutil -import itertools import plistlib import glob import json @@ -255,24 +254,29 @@ def read_crashes(output_dir): def read_bugs(output_dir, html): + # type: (str, bool) -> Generator[Dict[str, Any], None, None] """ Generate a unique sequence of bugs from given output directory. Duplicates can be in a project if the same module was compiled multiple times with different compiler options. These would be better to show in the final report (cover) only once. """ - parser = parse_bug_html if html else parse_bug_plist - pattern = '*.html' if html else '*.plist' + def empty(file_name): + return os.stat(file_name).st_size == 0 duplicate = duplicate_check( lambda bug: '{bug_line}.{bug_path_length}:{bug_file}'.format(**bug)) - bugs = itertools.chain.from_iterable( - # parser creates a bug generator not the bug itself - parser(filename) - for filename in glob.iglob(os.path.join(output_dir, pattern))) - - return (bug for bug in bugs if not duplicate(bug)) + # get the right parser for the job. + parser = parse_bug_html if html else parse_bug_plist + # get the input files, which are not empty. + pattern = os.path.join(output_dir, '*.html' if html else '*.plist') + bug_files = (file for file in glob.iglob(pattern) if not empty(file)) + + for bug_file in bug_files: + for bug in parser(bug_file): + if not duplicate(bug): + yield bug def parse_bug_plist(filename): |