Mercurial > hg > CbC > CbC_gcc
comparison contrib/jit-coverage-report.py @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 #! /usr/bin/python | |
2 # | |
3 # Print a report on which libgccjit.so symbols are used in which test | |
4 # cases, and which lack test coverage. Tested with Python 2.7 and 3.2 | |
5 # To be run from the root directory of the source tree. | |
6 # | |
7 # Copyright (C) 2014 Free Software Foundation, Inc. | |
8 # Written by David Malcolm <dmalcolm@redhat.com>. | |
9 # | |
10 # This script is Free Software, and it can be copied, distributed and | |
11 # modified as defined in the GNU General Public License. A copy of | |
12 # its license can be downloaded from http://www.gnu.org/copyleft/gpl.html | |
13 | |
14 from collections import Counter | |
15 import glob | |
16 import re | |
17 import sys | |
18 | |
19 def parse_map_file(path): | |
20 """ | |
21 Parse libgccjit.map, returning the symbols in the API as a list of str. | |
22 """ | |
23 syms = [] | |
24 with open(path) as f: | |
25 for line in f: | |
26 m = re.match('^\s+([a-z_]+);$', line) | |
27 if m: | |
28 syms.append(m.group(1)) | |
29 return syms | |
30 | |
31 def parse_test_case(path): | |
32 """ | |
33 Locate all symbol-like things in a C test case, yielding | |
34 them as a sequence of str. | |
35 """ | |
36 with open(path) as f: | |
37 for line in f: | |
38 for m in re.finditer('([_A-Za-z][_A-Za-z0-9]*)', line): | |
39 yield m.group(1) | |
40 | |
41 def find_test_cases(): | |
42 for path in glob.glob('gcc/testsuite/jit.dg/*.[ch]'): | |
43 yield path | |
44 | |
45 api_syms = parse_map_file('gcc/jit/libgccjit.map') | |
46 | |
47 syms_in_test_cases = {} | |
48 for path in find_test_cases(): | |
49 syms_in_test_cases[path] = list(parse_test_case(path)) | |
50 | |
51 uses = Counter() | |
52 for sym in sorted(api_syms): | |
53 print('symbol: %s' % sym) | |
54 uses[sym] = 0 | |
55 for path in syms_in_test_cases: | |
56 count = syms_in_test_cases[path].count(sym) | |
57 uses[sym] += count | |
58 if count: | |
59 print(' uses in %s: %i' % (path, count)) | |
60 if uses[sym] == 0: | |
61 print(' NEVER USED') | |
62 sys.stdout.write('\n') | |
63 | |
64 layout = '%40s %5s %s' | |
65 print(layout % ('SYMBOL', 'USES', 'HISTOGRAM')) | |
66 for sym, count in uses.most_common(): | |
67 print(layout % (sym, count, '*' * count if count else 'UNUSED')) |