-
Notifications
You must be signed in to change notification settings - Fork 0
/
fly-gen.py
executable file
·63 lines (51 loc) · 2.08 KB
/
fly-gen.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/python3
# Copyright 2019 Evgeny A. Kudryashov.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
import sys
from typing import Set, List
from scripts import Config, Header, Type
from scripts.generators import generate_zero_decls, generate_test_file
from scripts.parser import parse
def collect_types(headers_list: List[Header]) -> Set[Type]:
acc = set()
for header in headers_list:
for func in header.funcs:
if func.ret_type:
acc.add(func.ret_type)
for arg_type in func.args:
acc.add(arg_type)
return acc
if len(sys.argv) < 3:
print('Usage: ./fly-gen.py standards/c99.std main.c')
exit(0)
logging.basicConfig(level=logging.WARNING)
ignored_types = ['void']
ignored_funcs = ['va_arg', 'va_start']
conditional_funcs = ['longjmp', 'abort', 'exit', '_Exit']
conditional_features = {'complex.h': '__STDC_NO_COMPLEX__',
'stdatomic.h': '__STDC_NO_ATOMICS__',
'threads.h': '__STDC_NO_THREADS__'}
# TODO expand into something more meaningful
type_subs = {'real-floating': 'float', 'scalar': 'int',
'C': 'int', 'atomic_type': 'atomic_int',
'restrict': '', '_Noreturn': ''}
config = Config(ignored_funcs, ignored_types, type_subs, conditional_funcs,
conditional_features)
headers = parse(sys.argv[1], config)
all_types = collect_types(headers)
var_decls = generate_zero_decls(list(all_types))
type_idx = {v.type: v for v in var_decls}
with open(sys.argv[2], 'w') as f:
f.write(generate_test_file(headers, type_idx, config))