intel/compiler: Be more conservative about subgroup sizes in GL
[mesa.git] / bin / symbols-check.py
1 #!/usr/bin/env python
2
3 import argparse
4 import subprocess
5 import os
6
7 # This list contains symbols that _might_ be exported for some platforms
8 PLATFORM_SYMBOLS = [
9 '__bss_end__',
10 '__bss_start__',
11 '__bss_start',
12 '__end__',
13 '_bss_end__',
14 '_edata',
15 '_end',
16 '_fini',
17 '_init',
18 ]
19
20
21 def get_symbols(nm, lib):
22 '''
23 List all the (non platform-specific) symbols exported by the library
24 '''
25 symbols = []
26 output = subprocess.check_output([nm, '--format=bsd', '-D', '--defined-only', lib],
27 stderr=open(os.devnull, 'w')).decode("ascii")
28 for line in output.splitlines():
29 (_, _, symbol_name) = line.split()
30 symbols.append(symbol_name)
31 return symbols
32
33
34 def main():
35 parser = argparse.ArgumentParser()
36 parser.add_argument('--symbols-file',
37 action='store',
38 required=True,
39 help='path to file containing symbols')
40 parser.add_argument('--lib',
41 action='store',
42 required=True,
43 help='path to library')
44 parser.add_argument('--nm',
45 action='store',
46 required=True,
47 help='path to binary (or name in $PATH)')
48 args = parser.parse_args()
49
50 lib_symbols = get_symbols(args.nm, args.lib)
51 mandatory_symbols = []
52 optional_symbols = []
53 with open(args.symbols_file) as symbols_file:
54 qualifier_optional = '(optional)'
55 for line in symbols_file.readlines():
56
57 # Strip comments
58 line = line.split('#')[0]
59 line = line.strip()
60 if not line:
61 continue
62
63 # Line format:
64 # [qualifier] symbol
65 qualifier = None
66 symbol = None
67
68 fields = line.split()
69 if len(fields) == 1:
70 symbol = fields[0]
71 elif len(fields) == 2:
72 qualifier = fields[0]
73 symbol = fields[1]
74 else:
75 print(args.symbols_file + ': invalid format: ' + line)
76 exit(1)
77
78 # The only supported qualifier is 'optional', which means the
79 # symbol doesn't have to be exported by the library
80 if qualifier and not qualifier == qualifier_optional:
81 print(args.symbols_file + ': invalid qualifier: ' + qualifier)
82 exit(1)
83
84 if qualifier == qualifier_optional:
85 optional_symbols.append(symbol)
86 else:
87 mandatory_symbols.append(symbol)
88
89 unknown_symbols = []
90 for symbol in lib_symbols:
91 if symbol in mandatory_symbols:
92 continue
93 if symbol in optional_symbols:
94 continue
95 if symbol in PLATFORM_SYMBOLS:
96 continue
97 unknown_symbols.append(symbol)
98
99 missing_symbols = [
100 sym for sym in mandatory_symbols if sym not in lib_symbols
101 ]
102
103 for symbol in unknown_symbols:
104 print(args.lib + ': unknown symbol exported: ' + symbol)
105
106 for symbol in missing_symbols:
107 print(args.lib + ': missing symbol: ' + symbol)
108
109 if unknown_symbols or missing_symbols:
110 exit(1)
111 exit(0)
112
113
114 if __name__ == '__main__':
115 main()