source: mainline/tools/autogen.py@ 81f0940

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 81f0940 was 81f0940, checked in by Jakub Jermar <jakub@…>, 11 years ago

autogen.py: Generate stricter code.

  • Property mode set to 100755
File size: 2.6 KB
Line 
1#!/usr/bin/env python
2
3import sys
4import json
5import re
6
7def usage():
8 print("%s - Automated structure and offsets generator" % sys.argv[0])
9 print("%s file.ag probe|generate struct.ag" % sys.argv[0])
10 sys.exit()
11
12def generate_includes(struct):
13 code = ""
14 for i in range(len(struct['includes'])):
15 code = code + "#include %s\n" % struct['includes'][i]
16 return code.strip()
17
18def generate_struct(struct):
19 code = "typedef struct %s {\n" % struct['name']
20 for i in range(len(struct['members'])):
21 member = struct['members'][i]
22 code = code + "\t%s %s;\n" % (member['type'], member['name'])
23 code = code + "} %s_t;" % struct['name']
24 return code
25
26def generate_probes(struct):
27 code = ""
28 for i in range(len(struct['members'])):
29 member = struct['members'][i]
30 code = code + ("\temit_constant(OFFSET_%s, offsetof(%s_t, %s));\n" %
31 (member['name'].upper(), struct['name'], member['name']))
32 return code
33
34def probe(struct):
35 name = struct['name']
36 typename = struct['name'] + "_t"
37
38 code = """
39%s
40
41#define str(s) #s
42#define emit_constant(n, v) \
43 asm volatile ("EMITTED_CONSTANT " str(n) \" = %%0\" :: \"i\" (v))
44#define offsetof(t, m) ((size_t) &(((t *) 0)->m))
45
46%s
47
48int main()
49{
50%s
51 emit_constant(%s_SIZE, sizeof(%s));
52 return 0;
53}
54 """ % (generate_includes(struct), generate_struct(struct),
55 generate_probes(struct), name.upper(), typename)
56
57 return code
58
59def generate_defines(pairs):
60 code = ""
61 for pair in pairs:
62 code = code + "#define %s %s\n" % (pair[0], pair[1])
63 return code.strip()
64
65def generate(struct, lines):
66 code = """
67/*****************************************************************************
68 * AUTO-GENERATED FILE, DO NOT EDIT!!!
69 * Generated by: tools/autogen.py
70 * Generated from: %s
71 *****************************************************************************/
72
73#ifndef AUTOGEN_%s_H
74#define AUTOGEN_%s_H
75
76#ifndef __ASM__
77%s
78#endif
79
80%s
81
82#ifndef __ASM__
83%s
84#endif
85
86#endif
87 """ % (sys.argv[2], struct['name'].upper(), struct['name'].upper(),
88 generate_includes(struct), generate_defines(lines),
89 generate_struct(struct))
90
91 return code
92
93def filter_pairs(lines):
94 pattern = re.compile("^\tEMITTED_CONSTANT ([A-Z_]*) = \$([0-9]*)$");
95 pairs = []
96 for line in lines:
97 res = pattern.match(line)
98 if res == None:
99 continue
100 pairs = pairs + [res.group(1, 2)]
101 return pairs
102
103
104def run():
105 if len(sys.argv) != 3:
106 usage()
107
108 with open(sys.argv[2], "rb") as fp:
109 struct = json.load(fp)
110
111 if sys.argv[1] == "probe":
112 code = probe(struct)
113 print(code)
114 elif sys.argv[1] == "generate":
115 lines = sys.stdin.readlines()
116 pairs = filter_pairs(lines)
117 code = generate(struct, pairs)
118 print(code)
119 else:
120 usage()
121
122run()
123
Note: See TracBrowser for help on using the repository browser.