~ubuntu-branches/ubuntu/utopic/xen/utopic

« back to all changes in this revision

Viewing changes to tools/include/xen-foreign/mkheader.py

  • Committer: Bazaar Package Importer
  • Author(s): Bastian Blank
  • Date: 2010-05-06 15:47:38 UTC
  • mto: (1.3.1) (15.1.1 sid) (4.1.1 experimental)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20100506154738-agoz0rlafrh1fnq7
Tags: upstream-4.0.0
ImportĀ upstreamĀ versionĀ 4.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
 
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 = 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