]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/xen/interface/foreign/mkheader.py
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / xen / interface / foreign / mkheader.py
1 #!/usr/bin/python
2
3 import sys, re;
4 from structs import unions, structs, defines;
5
6 # command line arguments
7 arch    = sys.argv[1];
8 outfile = sys.argv[2];
9 infiles = sys.argv[3:];
10
11
12 ###########################################################################
13 # configuration #2: architecture information
14
15 inttypes = {};
16 header = {};
17 footer = {};
18
19 # x86_32
20 inttypes["x86_32"] = {
21     "unsigned long" : "uint32_t",
22     "long"          : "uint32_t",
23     "xen_pfn_t"     : "uint32_t",
24 };
25 header["x86_32"] = """
26 #define __i386___X86_32 1
27 #pragma pack(4)
28 """;
29 footer["x86_32"] = """
30 #pragma pack()
31 """;
32
33 # x86_64
34 inttypes["x86_64"] = {
35     "unsigned long" : "__align8__ uint64_t",
36     "long"          : "__align8__ uint64_t",
37     "xen_pfn_t"     : "__align8__ uint64_t",
38 };
39 header["x86_64"] = """
40 #ifdef __GNUC__
41 # define __DECL_REG(name) union { uint64_t r ## name, e ## name; }
42 # define __align8__ __attribute__((aligned (8)))
43 #else
44 # define __DECL_REG(name) uint64_t r ## name
45 # define __align8__ FIXME
46 #endif
47 #define __x86_64___X86_64 1
48 """;
49
50 # ia64
51 inttypes["ia64"] = {
52     "unsigned long" : "__align8__ uint64_t",
53     "long"          : "__align8__ uint64_t",
54     "xen_pfn_t"     : "__align8__ uint64_t",
55     "long double"   : "__align16__ ldouble_t",
56 };
57 header["ia64"] = """
58 #define __align8__ __attribute__((aligned (8)))
59 #define __align16__ __attribute__((aligned (16)))
60 typedef unsigned char ldouble_t[16];
61 """;
62
63
64 ###########################################################################
65 # main
66
67 input  = "";
68 output = "";
69 fileid = re.sub("[-.]", "_", "__FOREIGN_%s__" % outfile.upper());
70
71 # read input header files
72 for name in infiles:
73     f = open(name, "r");
74     input += f.read();
75     f.close();
76
77 # add header
78 output += """
79 /*
80  * public xen defines and struct for %s
81  * generated by %s -- DO NOT EDIT
82  */
83
84 #ifndef %s
85 #define %s 1
86
87 """ % (arch, sys.argv[0], fileid, fileid)
88
89 if arch in header:
90     output += header[arch];
91     output += "\n";
92
93 # add defines to output
94 for line in re.findall("#define[^\n]+", input):
95     for define in defines:
96         regex = "#define\s+%s\\b" % define;
97         match = re.search(regex, line);
98         if None == match:
99             continue;
100         if define.upper()[0] == define[0]:
101             replace = define + "_" + arch.upper();
102         else:
103             replace = define + "_" + arch;
104         regex = "\\b%s\\b" % define;
105         output += re.sub(regex, replace, line) + "\n";
106 output += "\n";
107
108 # delete defines, comments, empty lines
109 input = re.sub("#define[^\n]+\n", "", input);
110 input = re.compile("/\*(.*?)\*/", re.S).sub("", input)
111 input = re.compile("\n\s*\n", re.S).sub("\n", input);
112
113 # add unions to output
114 for union in unions:
115     regex = "union\s+%s\s*\{(.*?)\n\};" % union;
116     match = re.search(regex, input, re.S)
117     if None == match:
118         output += "#define %s_has_no_%s 1\n" % (arch, union);
119     else:
120         output += "union %s_%s {%s\n};\n" % (union, arch, match.group(1));
121     output += "\n";
122
123 # add structs to output
124 for struct in structs:
125     regex = "struct\s+%s\s*\{(.*?)\n\};" % struct;
126     match = re.search(regex, input, re.S)
127     if None == match:
128         output += "#define %s_has_no_%s 1\n" % (arch, struct);
129     else:
130         output += "struct %s_%s {%s\n};\n" % (struct, arch, match.group(1));
131         output += "typedef struct %s_%s %s_%s_t;\n" % (struct, arch, struct, arch);
132     output += "\n";
133
134 # add footer
135 if arch in footer:
136     output += footer[arch];
137     output += "\n";
138 output += "#endif /* %s */\n" % fileid;
139
140 # replace: defines
141 for define in defines:
142     if define.upper()[0] == define[0]:
143         replace = define + "_" + arch.upper();
144     else:
145         replace = define + "_" + arch;
146     output = re.sub("\\b%s\\b" % define, replace, output);
147
148 # replace: unions
149 for union in unions:
150     output = re.sub("\\b(union\s+%s)\\b" % union, "\\1_%s" % arch, output);
151
152 # replace: structs + struct typedefs
153 for struct in structs:
154     output = re.sub("\\b(struct\s+%s)\\b" % struct, "\\1_%s" % arch, output);
155     output = re.sub("\\b(%s)_t\\b" % struct, "\\1_%s_t" % arch, output);
156
157 # replace: integer types
158 integers = list(inttypes[arch].keys());
159 integers.sort(lambda a, b: cmp(len(b),len(a)));
160 for type in integers:
161     output = re.sub("\\b%s\\b" % type, inttypes[arch][type], output);
162
163 # print results
164 f = open(outfile, "w");
165 f.write(output);
166 f.close;
167