1181624Skmacy#!/usr/bin/python 2181624Skmacy 3181624Skmacyimport sys, re; 4183375Skmacyfrom structs import unions, structs, defines; 5181624Skmacy 6181624Skmacy# command line arguments 7181624Skmacyarch = sys.argv[1]; 8181624Skmacyoutfile = sys.argv[2]; 9181624Skmacyinfiles = sys.argv[3:]; 10181624Skmacy 11181624Skmacy 12181624Skmacy########################################################################### 13181624Skmacy# configuration #2: architecture information 14181624Skmacy 15181624Skmacyinttypes = {}; 16181624Skmacyheader = {}; 17181624Skmacyfooter = {}; 18181624Skmacy 19181624Skmacy# x86_32 20181624Skmacyinttypes["x86_32"] = { 21181624Skmacy "unsigned long" : "uint32_t", 22181624Skmacy "long" : "uint32_t", 23181624Skmacy "xen_pfn_t" : "uint32_t", 24181624Skmacy}; 25181624Skmacyheader["x86_32"] = """ 26181624Skmacy#define __i386___X86_32 1 27181624Skmacy#pragma pack(4) 28181624Skmacy"""; 29181624Skmacyfooter["x86_32"] = """ 30181624Skmacy#pragma pack() 31181624Skmacy"""; 32181624Skmacy 33181624Skmacy# x86_64 34181624Skmacyinttypes["x86_64"] = { 35181624Skmacy "unsigned long" : "__align8__ uint64_t", 36181624Skmacy "long" : "__align8__ uint64_t", 37181624Skmacy "xen_pfn_t" : "__align8__ uint64_t", 38181624Skmacy}; 39181624Skmacyheader["x86_64"] = """ 40181624Skmacy#ifdef __GNUC__ 41181624Skmacy# define __DECL_REG(name) union { uint64_t r ## name, e ## name; } 42181624Skmacy# define __align8__ __attribute__((aligned (8))) 43181624Skmacy#else 44181624Skmacy# define __DECL_REG(name) uint64_t r ## name 45181624Skmacy# define __align8__ FIXME 46181624Skmacy#endif 47181624Skmacy#define __x86_64___X86_64 1 48181624Skmacy"""; 49181624Skmacy 50181624Skmacy# ia64 51181624Skmacyinttypes["ia64"] = { 52181624Skmacy "unsigned long" : "__align8__ uint64_t", 53181624Skmacy "long" : "__align8__ uint64_t", 54181624Skmacy "xen_pfn_t" : "__align8__ uint64_t", 55181624Skmacy "long double" : "__align16__ ldouble_t", 56181624Skmacy}; 57181624Skmacyheader["ia64"] = """ 58181624Skmacy#define __align8__ __attribute__((aligned (8))) 59181624Skmacy#define __align16__ __attribute__((aligned (16))) 60181624Skmacytypedef unsigned char ldouble_t[16]; 61181624Skmacy"""; 62181624Skmacy 63181624Skmacy 64181624Skmacy########################################################################### 65181624Skmacy# main 66181624Skmacy 67181624Skmacyinput = ""; 68181624Skmacyoutput = ""; 69181624Skmacyfileid = re.sub("[-.]", "_", "__FOREIGN_%s__" % outfile.upper()); 70181624Skmacy 71181624Skmacy# read input header files 72181624Skmacyfor name in infiles: 73181624Skmacy f = open(name, "r"); 74181624Skmacy input += f.read(); 75181624Skmacy f.close(); 76181624Skmacy 77181624Skmacy# add header 78181624Skmacyoutput += """ 79181624Skmacy/* 80181624Skmacy * public xen defines and struct for %s 81181624Skmacy * generated by %s -- DO NOT EDIT 82181624Skmacy */ 83181624Skmacy 84181624Skmacy#ifndef %s 85181624Skmacy#define %s 1 86181624Skmacy 87181624Skmacy""" % (arch, sys.argv[0], fileid, fileid) 88181624Skmacy 89181624Skmacyif arch in header: 90181624Skmacy output += header[arch]; 91181624Skmacy output += "\n"; 92181624Skmacy 93181624Skmacy# add defines to output 94181624Skmacyfor line in re.findall("#define[^\n]+", input): 95181624Skmacy for define in defines: 96181624Skmacy regex = "#define\s+%s\\b" % define; 97181624Skmacy match = re.search(regex, line); 98181624Skmacy if None == match: 99181624Skmacy continue; 100181624Skmacy if define.upper()[0] == define[0]: 101181624Skmacy replace = define + "_" + arch.upper(); 102181624Skmacy else: 103181624Skmacy replace = define + "_" + arch; 104181624Skmacy regex = "\\b%s\\b" % define; 105181624Skmacy output += re.sub(regex, replace, line) + "\n"; 106181624Skmacyoutput += "\n"; 107181624Skmacy 108181624Skmacy# delete defines, comments, empty lines 109181624Skmacyinput = re.sub("#define[^\n]+\n", "", input); 110181624Skmacyinput = re.compile("/\*(.*?)\*/", re.S).sub("", input) 111181624Skmacyinput = re.compile("\n\s*\n", re.S).sub("\n", input); 112181624Skmacy 113183375Skmacy# add unions to output 114183375Skmacyfor union in unions: 115183375Skmacy regex = "union\s+%s\s*\{(.*?)\n\};" % union; 116183375Skmacy match = re.search(regex, input, re.S) 117183375Skmacy if None == match: 118183375Skmacy output += "#define %s_has_no_%s 1\n" % (arch, union); 119183375Skmacy else: 120183375Skmacy output += "union %s_%s {%s\n};\n" % (union, arch, match.group(1)); 121183375Skmacy output += "\n"; 122183375Skmacy 123181624Skmacy# add structs to output 124181624Skmacyfor struct in structs: 125181624Skmacy regex = "struct\s+%s\s*\{(.*?)\n\};" % struct; 126181624Skmacy match = re.search(regex, input, re.S) 127181624Skmacy if None == match: 128181624Skmacy output += "#define %s_has_no_%s 1\n" % (arch, struct); 129181624Skmacy else: 130181624Skmacy output += "struct %s_%s {%s\n};\n" % (struct, arch, match.group(1)); 131181624Skmacy output += "typedef struct %s_%s %s_%s_t;\n" % (struct, arch, struct, arch); 132181624Skmacy output += "\n"; 133181624Skmacy 134181624Skmacy# add footer 135181624Skmacyif arch in footer: 136181624Skmacy output += footer[arch]; 137181624Skmacy output += "\n"; 138181624Skmacyoutput += "#endif /* %s */\n" % fileid; 139181624Skmacy 140181624Skmacy# replace: defines 141181624Skmacyfor define in defines: 142181624Skmacy if define.upper()[0] == define[0]: 143181624Skmacy replace = define + "_" + arch.upper(); 144181624Skmacy else: 145181624Skmacy replace = define + "_" + arch; 146181624Skmacy output = re.sub("\\b%s\\b" % define, replace, output); 147181624Skmacy 148183375Skmacy# replace: unions 149183375Skmacyfor union in unions: 150183375Skmacy output = re.sub("\\b(union\s+%s)\\b" % union, "\\1_%s" % arch, output); 151183375Skmacy 152181624Skmacy# replace: structs + struct typedefs 153181624Skmacyfor struct in structs: 154181624Skmacy output = re.sub("\\b(struct\s+%s)\\b" % struct, "\\1_%s" % arch, output); 155181624Skmacy output = re.sub("\\b(%s)_t\\b" % struct, "\\1_%s_t" % arch, output); 156181624Skmacy 157181624Skmacy# replace: integer types 158241833Seadlerintegers = list(inttypes[arch].keys()); 159181624Skmacyintegers.sort(lambda a, b: cmp(len(b),len(a))); 160181624Skmacyfor type in integers: 161181624Skmacy output = re.sub("\\b%s\\b" % type, inttypes[arch][type], output); 162181624Skmacy 163181624Skmacy# print results 164181624Skmacyf = open(outfile, "w"); 165181624Skmacyf.write(output); 166181624Skmacyf.close; 167181624Skmacy 168