- Timestamp:
- 2010-07-12T10:53:30Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- bd11d3e
- Parents:
- c40e6ef (diff), bee2d4c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- tools
- Files:
-
- 1 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
tools/autotool.py
rc40e6ef rbd48f4c 54 54 COMPILER_FAIL = "The compiler is probably not capable to compile HelenOS." 55 55 56 PROBE_HEAD = """#define AUTOTOOL_DECLARE(category, subcategory, name, value) \\56 PROBE_HEAD = """#define AUTOTOOL_DECLARE(category, subcategory, tag, name, value) \\ 57 57 asm volatile ( \\ 58 "AUTOTOOL_DECLARE\\t" category "\\t" subcategory "\\t" name "\\t%[val]\\n" \\58 "AUTOTOOL_DECLARE\\t" category "\\t" subcategory "\\t" tag "\\t" name "\\t%[val]\\n" \\ 59 59 : \\ 60 60 : [val] "n" (value) \\ 61 61 ) 62 62 63 #define DECLARE_INTSIZE(t ype) \\64 AUTOTOOL_DECLARE("intsize", "unsigned", #type, sizeof(unsigned type)); \\65 AUTOTOOL_DECLARE("intsize", "signed", #type, sizeof(signed type))63 #define DECLARE_INTSIZE(tag, type) \\ 64 AUTOTOOL_DECLARE("intsize", "unsigned", tag, #type, sizeof(unsigned type)); \\ 65 AUTOTOOL_DECLARE("intsize", "signed", tag, #type, sizeof(signed type)) 66 66 67 67 int main(int argc, char *argv[]) … … 195 195 196 196 for typedef in sizes: 197 outf.write("\tDECLARE_INTSIZE( %s);\n" % typedef)197 outf.write("\tDECLARE_INTSIZE(\"%s\", %s);\n" % (typedef['tag'], typedef['type'])) 198 198 199 199 outf.write(PROBE_TAIL) … … 228 228 signed_sizes = {} 229 229 230 unsigned_tags = {} 231 signed_tags = {} 232 230 233 for j in range(len(lines)): 231 234 tokens = lines[j].strip().split("\t") … … 238 241 category = tokens[1] 239 242 subcategory = tokens[2] 240 name = tokens[3] 241 value = tokens[4] 243 tag = tokens[3] 244 name = tokens[4] 245 value = tokens[5] 242 246 243 247 if (category == "intsize"): … … 258 262 if (subcategory == "unsigned"): 259 263 unsigned_sizes[name] = value_int 264 unsigned_tags[tag] = value_int 260 265 elif (subcategory == "signed"): 261 266 signed_sizes[name] = value_int 267 signed_tags[tag] = value_int 262 268 else: 263 269 print_error(["Unexpected keyword \"%s\" in \"%s\" on line %s." % (subcategory, PROBE_OUTPUT, j), COMPILER_FAIL]) 264 270 265 return {'unsigned_sizes' : unsigned_sizes, 'signed_sizes' : signed_sizes }266 267 def detect_uints( unsigned_sizes, signed_sizes, bytes):271 return {'unsigned_sizes' : unsigned_sizes, 'signed_sizes' : signed_sizes, 'unsigned_tags': unsigned_tags, 'signed_tags': signed_tags} 272 273 def detect_uints(probe, bytes): 268 274 "Detect correct types for fixed-size integer types" 269 275 276 macros = [] 270 277 typedefs = [] 271 278 … … 274 281 newtype = "uint%s_t" % (b * 8) 275 282 276 for name, value in unsigned_sizes.items():283 for name, value in probe['unsigned_sizes'].items(): 277 284 if (value == b): 278 285 oldtype = "unsigned %s" % name … … 289 296 newtype = "int%s_t" % (b * 8) 290 297 291 for name, value in signed_sizes.items():298 for name, value in probe['signed_sizes'].items(): 292 299 if (value == b): 293 300 oldtype = "signed %s" % name … … 300 307 COMPILER_FAIL]) 301 308 302 return typedefs 309 for tag in ['CHAR', 'SHORT', 'INT', 'LONG', 'LLONG']: 310 fnd = False; 311 newmacro = "U%s" % tag 312 313 for name, value in probe['unsigned_tags'].items(): 314 if (name == tag): 315 oldmacro = "UINT%s" % (value * 8) 316 macros.append({'oldmacro': "%s_MIN" % oldmacro, 'newmacro': "%s_MIN" % newmacro}) 317 macros.append({'oldmacro': "%s_MAX" % oldmacro, 'newmacro': "%s_MAX" % newmacro}) 318 fnd = True 319 break 320 321 if (not fnd): 322 print_error(['Unable to find appropriate size macro for %s' % newmacro, 323 COMPILER_FAIL]) 324 325 fnd = False; 326 newmacro = tag 327 328 for name, value in probe['signed_tags'].items(): 329 if (name == tag): 330 oldmacro = "INT%s" % (value * 8) 331 macros.append({'oldmacro': "%s_MIN" % oldmacro, 'newmacro': "%s_MIN" % newmacro}) 332 macros.append({'oldmacro': "%s_MAX" % oldmacro, 'newmacro': "%s_MAX" % newmacro}) 333 fnd = True 334 break 335 336 if (not fnd): 337 print_error(['Unable to find appropriate size macro for %s' % newmacro, 338 COMPILER_FAIL]) 339 340 return {'macros': macros, 'typedefs': typedefs} 303 341 304 342 def create_makefile(mkname, common): … … 316 354 outmk.close() 317 355 318 def create_header(hdname, typedefs):356 def create_header(hdname, maps): 319 357 "Create header output" 320 358 … … 328 366 outhd.write('#define %s\n\n' % GUARD) 329 367 330 for typedef in typedefs: 368 for macro in maps['macros']: 369 outhd.write('#define %s %s\n' % (macro['newmacro'], macro['oldmacro'])) 370 371 outhd.write('\n') 372 373 for typedef in maps['typedefs']: 331 374 outhd.write('typedef %s %s;\n' % (typedef['oldtype'], typedef['newtype'])) 332 375 … … 465 508 probe = probe_compiler(common, 466 509 [ 467 "char",468 "short int",469 "int",470 "long int",471 "long long int",510 {'type': 'char', 'tag': 'CHAR'}, 511 {'type': 'short int', 'tag': 'SHORT'}, 512 {'type': 'int', 'tag': 'INT'}, 513 {'type': 'long int', 'tag': 'LONG'}, 514 {'type': 'long long int', 'tag': 'LLONG'} 472 515 ] 473 516 ) 474 517 475 typedefs = detect_uints(probe['unsigned_sizes'], probe['signed_sizes'], [1, 2, 4, 8])518 maps = detect_uints(probe, [1, 2, 4, 8]) 476 519 477 520 finally: … … 479 522 480 523 create_makefile(MAKEFILE, common) 481 create_header(HEADER, typedefs)524 create_header(HEADER, maps) 482 525 483 526 return 0 -
tools/checkers/vcc.py
rc40e6ef rbd48f4c 36 36 import subprocess 37 37 import jobfile 38 import re 38 39 39 40 jobs = [ 40 "kernel/kernel.job", 41 "uspace/srv/clip/clip.job" 41 "kernel/kernel.job" 42 42 ] 43 44 re_attribute = re.compile("__attribute__\s*\(\(.*\)\)") 45 re_va_list = re.compile("__builtin_va_list") 46 47 specification = "" 43 48 44 49 def usage(prname): 45 50 "Print usage syntax" 46 print prname + " <ROOT> "51 print prname + " <ROOT> [VCC_PATH]" 47 52 48 53 def cygpath(upath): … … 54 59 "Preprocess source using GCC preprocessor and compatibility tweaks" 55 60 61 global specification 62 56 63 args = ['gcc', '-E'] 57 64 args.extend(options.split()) 58 args. append(srcfname)65 args.extend(['-DCONFIG_VERIFY_VCC=1', srcfname]) 59 66 60 67 # Change working directory … … 66 73 67 74 tmpf = file(tmpfname, "w") 75 tmpf.write(specification) 68 76 69 77 for line in preproc.splitlines(): 78 70 79 # Ignore preprocessor directives 80 71 81 if (line.startswith('#')): 72 82 continue 73 83 84 # Remove __attribute__((.*)) GCC extension 85 86 line = re.sub(re_attribute, "", line) 87 88 # Ignore unsupported __builtin_va_list type 89 # (a better solution replacing __builrin_va_list with 90 # an emulated implementation is needed) 91 92 line = re.sub(re_va_list, "void *", line) 93 74 94 tmpf.write("%s\n" % line) 75 95 … … 80 100 return True 81 101 82 def vcc( root, job):102 def vcc(vcc_path, root, job): 83 103 "Run Vcc on a jobfile" 84 104 … … 120 140 tmpfqname = os.path.join(base, tmpfname) 121 141 142 vccfname = "%s.i" % srcfname 143 vccfqname = os.path.join(base, vccfname); 144 122 145 # Only C files are interesting for us 123 146 if (tool != "cc"): … … 130 153 131 154 # Run Vcc 132 133 retval = subprocess.Popen(['vcc', cygpath(tmpfqname)]).wait() 134 135 # Cleanup 155 print " -- %s --" % srcfname 156 retval = subprocess.Popen([vcc_path, '/pointersize:32', '/newsyntax', cygpath(tmpfqname)]).wait() 157 158 if (retval != 0): 159 return False 160 161 # Cleanup, but only if verification was successful 162 # (to be able to examine the preprocessed file) 136 163 137 164 if (os.path.isfile(tmpfqname)): 138 165 os.remove(tmpfqname) 139 140 if (retval != 0): 141 return False 166 os.remove(vccfqname) 142 167 143 168 return True 144 169 145 170 def main(): 171 global specification 172 146 173 if (len(sys.argv) < 2): 147 174 usage(sys.argv[0]) … … 149 176 150 177 rootdir = os.path.abspath(sys.argv[1]) 178 if (len(sys.argv) > 2): 179 vcc_path = sys.argv[2] 180 else: 181 vcc_path = "/cygdrive/c/Program Files (x86)/Microsoft Research/Vcc/Binaries/vcc" 182 183 if (not os.path.isfile(vcc_path)): 184 print "%s is not a binary." % vcc_path 185 print "Please supply the full Cygwin path to Vcc as the second argument." 186 return 187 151 188 config = os.path.join(rootdir, "HelenOS.config") 152 189 … … 156 193 return 157 194 195 specpath = os.path.join(rootdir, "tools/checkers/vcc.h") 196 if (not os.path.isfile(specpath)): 197 print "%s not found." % config 198 return 199 200 specfile = file(specpath, "r") 201 specification = specfile.read() 202 specfile.close() 203 158 204 for job in jobs: 159 if (not vcc( rootdir, job)):205 if (not vcc(vcc_path, rootdir, job)): 160 206 print 161 207 print "Failed job: %s" % job
Note:
See TracChangeset
for help on using the changeset viewer.