The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/xen/interface/foreign/mkheader.py

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 

Cache object: 265613cd00eb004e71861191bf8e1dae


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.