Changes in tools/autotool.py [ce55b43:cc92076] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
tools/autotool.py
rce55b43 rcc92076 1 #!/usr/bin/env python 21 #!/usr/bin/env python 2 2 # 3 3 # Copyright (c) 2010 Martin Decky … … 43 43 MAKEFILE = 'Makefile.common' 44 44 HEADER = 'common.h.new' 45 GUARD = ' _AUTOTOOL_COMMON_H_'45 GUARD = 'AUTOTOOL_COMMON_H_' 46 46 47 47 PROBE_SOURCE = 'probe.c' 48 48 PROBE_OUTPUT = 'probe.s' 49 50 PROBE_INT128_SOURCE = 'probe_int128.c' 51 PROBE_INT128_OUTPUT = 'probe_int128.s' 49 52 50 53 PACKAGE_BINUTILS = "usually part of binutils" … … 56 59 COMPILER_WARNING = "The compilation of HelenOS might fail." 57 60 58 PROBE_HEAD = """#define AUTOTOOL_DECLARE(category, tag, name, signedness, base, size, compatible) \\61 PROBE_HEAD = """#define AUTOTOOL_DECLARE(category, subcategory, tag, name, strc, conc, value) \\ 59 62 asm volatile ( \\ 60 "AUTOTOOL_DECLARE\\t" category "\\t" tag "\\t" name "\\t" signedness "\\t" base "\\t%[size_val]\\t%[cmp_val]\\n" \\63 "AUTOTOOL_DECLARE\\t" category "\\t" subcategory "\\t" tag "\\t" name "\\t" strc "\\t" conc "\\t%[val]\\n" \\ 61 64 : \\ 62 : [ size_val] "n" (size), [cmp_val] "n" (compatible) \\65 : [val] "n" (value) \\ 63 66 ) 64 67 … … 67 70 68 71 #define DECLARE_BUILTIN_TYPE(tag, type) \\ 69 AUTOTOOL_DECLARE("unsigned long long int", tag, STRING(type), "unsigned", "long long", sizeof(type), __builtin_types_compatible_p(type, unsigned long long int)); \\ 70 AUTOTOOL_DECLARE("unsigned long int", tag, STRING(type), "unsigned", "long", sizeof(type), __builtin_types_compatible_p(type, unsigned long int)); \\ 71 AUTOTOOL_DECLARE("unsigned int", tag, STRING(type), "unsigned", "int", sizeof(type), __builtin_types_compatible_p(type, unsigned int)); \\ 72 AUTOTOOL_DECLARE("unsigned short int", tag, STRING(type), "unsigned", "short", sizeof(type), __builtin_types_compatible_p(type, unsigned short int)); \\ 73 AUTOTOOL_DECLARE("unsigned char", tag, STRING(type), "unsigned", "char", sizeof(type), __builtin_types_compatible_p(type, unsigned char)); \\ 74 AUTOTOOL_DECLARE("signed long long int", tag, STRING(type), "signed", "long long", sizeof(type), __builtin_types_compatible_p(type, signed long long int)); \\ 75 AUTOTOOL_DECLARE("signed long int", tag, STRING(type), "signed", "long", sizeof(type), __builtin_types_compatible_p(type, signed long int)); \\ 76 AUTOTOOL_DECLARE("signed int", tag, STRING(type), "signed", "int", sizeof(type), __builtin_types_compatible_p(type, signed int)); \\ 77 AUTOTOOL_DECLARE("signed short int", tag, STRING(type), "signed", "short", sizeof(type), __builtin_types_compatible_p(type, signed short int)); \\ 78 AUTOTOOL_DECLARE("signed char", tag, STRING(type), "signed", "char", sizeof(type), __builtin_types_compatible_p(type, signed char)); \\ 79 AUTOTOOL_DECLARE("pointer", tag, STRING(type), "N/A", "pointer", sizeof(type), __builtin_types_compatible_p(type, void*)); \\ 80 AUTOTOOL_DECLARE("long double", tag, STRING(type), "signed", "long double", sizeof(type), __builtin_types_compatible_p(type, long double)); \\ 81 AUTOTOOL_DECLARE("double", tag, STRING(type), "signed", "double", sizeof(type), __builtin_types_compatible_p(type, double)); \\ 82 AUTOTOOL_DECLARE("float", tag, STRING(type), "signed", "float", sizeof(type), __builtin_types_compatible_p(type, float)); 72 AUTOTOOL_DECLARE("builtin_size", "", tag, STRING(type), "", "", sizeof(type)); \\ 73 AUTOTOOL_DECLARE("builtin_sign", "unsigned long long int", tag, STRING(type), "unsigned", "", __builtin_types_compatible_p(type, unsigned long long int)); \\ 74 AUTOTOOL_DECLARE("builtin_sign", "unsigned long int", tag, STRING(type), "unsigned", "", __builtin_types_compatible_p(type, unsigned long int)); \\ 75 AUTOTOOL_DECLARE("builtin_sign", "unsigned int", tag, STRING(type), "unsigned", "", __builtin_types_compatible_p(type, unsigned int)); \\ 76 AUTOTOOL_DECLARE("builtin_sign", "unsigned short int", tag, STRING(type), "unsigned", "", __builtin_types_compatible_p(type, unsigned short int)); \\ 77 AUTOTOOL_DECLARE("builtin_sign", "unsigned char", tag, STRING(type), "unsigned", "", __builtin_types_compatible_p(type, unsigned char)); \\ 78 AUTOTOOL_DECLARE("builtin_sign", "signed long long int", tag, STRING(type), "signed", "", __builtin_types_compatible_p(type, signed long long int)); \\ 79 AUTOTOOL_DECLARE("builtin_sign", "signed long int", tag, STRING(type), "signed", "", __builtin_types_compatible_p(type, signed long int)); \\ 80 AUTOTOOL_DECLARE("builtin_sign", "signed int", tag, STRING(type), "signed", "", __builtin_types_compatible_p(type, signed int)); \\ 81 AUTOTOOL_DECLARE("builtin_sign", "signed short int", tag, STRING(type), "signed", "", __builtin_types_compatible_p(type, signed short int)); \\ 82 AUTOTOOL_DECLARE("builtin_sign", "signed char", tag, STRING(type), "signed", "", __builtin_types_compatible_p(type, signed char)); 83 84 #define DECLARE_INTSIZE(tag, type, strc, conc) \\ 85 AUTOTOOL_DECLARE("intsize", "unsigned", tag, #type, strc, conc, sizeof(unsigned type)); \\ 86 AUTOTOOL_DECLARE("intsize", "signed", tag, #type, strc, conc, sizeof(signed type)); 87 88 #define DECLARE_FLOATSIZE(tag, type) \\ 89 AUTOTOOL_DECLARE("floatsize", "", tag, #type, "", "", sizeof(type)); 90 91 extern int main(int, char *[]); 92 93 int main(int argc, char *argv[]) 94 { 95 #ifdef __SIZE_TYPE__ 96 DECLARE_BUILTIN_TYPE("size", __SIZE_TYPE__); 97 #endif 98 #ifdef __WCHAR_TYPE__ 99 DECLARE_BUILTIN_TYPE("wchar", __WCHAR_TYPE__); 100 #endif 101 #ifdef __WINT_TYPE__ 102 DECLARE_BUILTIN_TYPE("wint", __WINT_TYPE__); 103 #endif 104 """ 105 106 PROBE_TAIL = """} 107 """ 108 109 PROBE_INT128_HEAD = """#define AUTOTOOL_DECLARE(category, subcategory, tag, name, strc, conc, value) \\ 110 asm volatile ( \\ 111 "AUTOTOOL_DECLARE\\t" category "\\t" subcategory "\\t" tag "\\t" name "\\t" strc "\\t" conc "\\t%[val]\\n" \\ 112 : \\ 113 : [val] "n" (value) \\ 114 ) 115 116 #define DECLARE_INTSIZE(tag, type) \\ 117 AUTOTOOL_DECLARE("intsize", "unsigned", tag, #type, "", "", sizeof(unsigned type)); \\ 118 AUTOTOOL_DECLARE("intsize", "signed", tag, #type, "", "", sizeof(signed type)); 83 119 84 120 extern int main(int, char *[]); … … 88 124 """ 89 125 90 PROBE_ TAIL = """}126 PROBE_INT128_TAIL = """} 91 127 """ 92 128 … … 378 414 return int(value, base) 379 415 380 def probe_compiler(common, typesizes):416 def probe_compiler(common, intsizes, floatsizes): 381 417 "Generate, compile and parse probing source" 382 418 … … 386 422 outf.write(PROBE_HEAD) 387 423 388 for typedef in typesizes: 389 if 'def' in typedef: 390 outf.write("#ifdef %s\n" % typedef['def']) 391 outf.write("\tDECLARE_BUILTIN_TYPE(\"%s\", %s);\n" % (typedef['tag'], typedef['type'])) 392 if 'def' in typedef: 393 outf.write("#endif\n") 424 for typedef in intsizes: 425 outf.write("\tDECLARE_INTSIZE(\"%s\", %s, %s, %s);\n" % (typedef['tag'], typedef['type'], typedef['strc'], typedef['conc'])) 426 427 for typedef in floatsizes: 428 outf.write("\tDECLARE_FLOATSIZE(\"%s\", %s);\n" % (typedef['tag'], typedef['type'])) 394 429 395 430 outf.write(PROBE_TAIL) … … 422 457 inf.close() 423 458 424 builtins = {} 459 unsigned_sizes = {} 460 signed_sizes = {} 461 462 unsigned_tags = {} 463 signed_tags = {} 464 465 unsigned_strcs = {} 466 signed_strcs = {} 467 468 unsigned_concs = {} 469 signed_concs = {} 470 471 float_tags = {} 472 473 builtin_sizes = {} 474 builtin_signs = {} 425 475 426 476 for j in range(len(lines)): … … 429 479 if (len(tokens) > 0): 430 480 if (tokens[0] == "AUTOTOOL_DECLARE"): 431 if (len(tokens) < 8):481 if (len(tokens) < 7): 432 482 print_error(["Malformed declaration in \"%s\" on line %s." % (PROBE_OUTPUT, j), COMPILER_FAIL]) 433 483 434 484 category = tokens[1] 435 tag= tokens[2]436 name= tokens[3]437 signedness= tokens[4]438 base= tokens[5]439 size= tokens[6]440 compatible = tokens[7]485 subcategory = tokens[2] 486 tag = tokens[3] 487 name = tokens[4] 488 strc = tokens[5] 489 conc = tokens[6] 490 value = tokens[7] 441 491 442 try: 443 compatible_int = decode_value(compatible) 444 size_int = decode_value(size) 445 except: 446 print_error(["Integer value expected in \"%s\" on line %s." % (PROBE_OUTPUT, j), COMPILER_FAIL]) 492 if (category == "intsize"): 493 try: 494 value_int = decode_value(value) 495 except: 496 print_error(["Integer value expected in \"%s\" on line %s." % (PROBE_OUTPUT, j), COMPILER_FAIL]) 497 498 if (subcategory == "unsigned"): 499 unsigned_sizes[value_int] = name 500 unsigned_tags[tag] = value_int 501 unsigned_strcs[value_int] = strc 502 unsigned_concs[value_int] = conc 503 elif (subcategory == "signed"): 504 signed_sizes[value_int] = name 505 signed_tags[tag] = value_int 506 signed_strcs[value_int] = strc 507 signed_concs[value_int] = conc 508 else: 509 print_error(["Unexpected keyword \"%s\" in \"%s\" on line %s." % (subcategory, PROBE_OUTPUT, j), COMPILER_FAIL]) 447 510 448 if (compatible_int == 1): 449 builtins[tag] = { 450 'tag': tag, 451 'name': name, 452 'sign': signedness, 453 'base': base, 454 'size': size_int, 455 } 456 457 for typedef in typesizes: 458 if not typedef['tag'] in builtins: 459 print_error(['Unable to determine the properties of type %s.' % typedef['tag'], 511 if (category == "floatsize"): 512 try: 513 value_int = decode_value(value) 514 except: 515 print_error(["Integer value expected in \"%s\" on line %s." % (PROBE_OUTPUT, j), COMPILER_FAIL]) 516 517 float_tags[tag] = value_int 518 519 if (category == "builtin_size"): 520 try: 521 value_int = decode_value(value) 522 except: 523 print_error(["Integer value expected in \"%s\" on line %s." % (PROBE_OUTPUT, j), COMPILER_FAIL]) 524 525 builtin_sizes[tag] = {'name': name, 'value': value_int} 526 527 if (category == "builtin_sign"): 528 try: 529 value_int = decode_value(value) 530 except: 531 print_error(["Integer value expected in \"%s\" on line %s." % (PROBE_OUTPUT, j), COMPILER_FAIL]) 532 533 if (value_int == 1): 534 if (not tag in builtin_signs): 535 builtin_signs[tag] = strc; 536 elif (builtin_signs[tag] != strc): 537 print_error(["Inconsistent builtin type detection in \"%s\" on line %s." % (PROBE_OUTPUT, j), COMPILER_FAIL]) 538 539 return {'unsigned_sizes': unsigned_sizes, 'signed_sizes': signed_sizes, 'unsigned_tags': unsigned_tags, 'signed_tags': signed_tags, 'unsigned_strcs': unsigned_strcs, 'signed_strcs': signed_strcs, 'unsigned_concs': unsigned_concs, 'signed_concs': signed_concs, 'float_tags': float_tags, 'builtin_sizes': builtin_sizes, 'builtin_signs': builtin_signs} 540 541 def probe_int128(common): 542 "Generate, compile and parse probing source for 128-bit integers" 543 544 check_common(common, "CC") 545 546 outf = open(PROBE_INT128_SOURCE, 'w') 547 outf.write(PROBE_INT128_HEAD) 548 outf.write("\tDECLARE_INTSIZE(\"INT128\", int __attribute((mode(TI))));\n") 549 outf.write(PROBE_INT128_TAIL) 550 outf.close() 551 552 args = common['CC_AUTOGEN'].split(' ') 553 args.extend(["-S", "-o", PROBE_INT128_OUTPUT, PROBE_INT128_SOURCE]) 554 555 try: 556 sys.stderr.write("Checking whether the compiler has intrinsic support for 128-bit integers ... ") 557 output = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate() 558 except: 559 sys.stderr.write("no\n") 560 return False 561 562 if (not os.path.isfile(PROBE_INT128_OUTPUT)): 563 sys.stderr.write("no\n") 564 return False 565 566 inf = open(PROBE_INT128_OUTPUT, 'r') 567 lines = inf.readlines() 568 inf.close() 569 570 for j in range(len(lines)): 571 tokens = lines[j].strip().split("\t") 572 573 if (len(tokens) > 0): 574 if (tokens[0] == "AUTOTOOL_DECLARE"): 575 if (len(tokens) < 7): 576 print_error(["Malformed declaration in \"%s\" on line %s." % (PROBE_INT128_OUTPUT, j), COMPILER_FAIL]) 577 578 category = tokens[1] 579 subcategory = tokens[2] 580 tag = tokens[3] 581 name = tokens[4] 582 strc = tokens[5] 583 conc = tokens[6] 584 value = tokens[7] 585 586 if (category == "intsize"): 587 try: 588 value_int = decode_value(value) 589 except: 590 print_error(["Integer value expected in \"%s\" on line %s." % (PROBE_INT128_OUTPUT, j), COMPILER_FAIL]) 591 592 if (subcategory == "unsigned"): 593 if (value_int != 16): 594 sys.stderr.write("no\n") 595 return False 596 elif (subcategory == "signed"): 597 if (value_int != 16): 598 sys.stderr.write("no\n") 599 return False 600 else: 601 print_error(["Unexpected keyword \"%s\" in \"%s\" on line %s." % (subcategory, PROBE_INT128_OUTPUT, j), COMPILER_FAIL]) 602 603 sys.stderr.write("yes\n") 604 return True 605 606 def detect_sizes(probe, bytes, inttags, floattags): 607 "Detect correct types for fixed-size types" 608 609 macros = [] 610 typedefs = [] 611 612 for b in bytes: 613 if (not b in probe['unsigned_sizes']): 614 print_error(['Unable to find appropriate unsigned integer type for %u bytes.' % b, 615 COMPILER_FAIL]) 616 617 if (not b in probe['signed_sizes']): 618 print_error(['Unable to find appropriate signed integer type for %u bytes.' % b, 619 COMPILER_FAIL]) 620 621 if (not b in probe['unsigned_strcs']): 622 print_error(['Unable to find appropriate unsigned printf formatter for %u bytes.' % b, 623 COMPILER_FAIL]) 624 625 if (not b in probe['signed_strcs']): 626 print_error(['Unable to find appropriate signed printf formatter for %u bytes.' % b, 627 COMPILER_FAIL]) 628 629 if (not b in probe['unsigned_concs']): 630 print_error(['Unable to find appropriate unsigned literal macro for %u bytes.' % b, 631 COMPILER_FAIL]) 632 633 if (not b in probe['signed_concs']): 634 print_error(['Unable to find appropriate signed literal macro for %u bytes.' % b, 635 COMPILER_FAIL]) 636 637 typedefs.append({'oldtype': "unsigned %s" % probe['unsigned_sizes'][b], 'newtype': "uint%u_t" % (b * 8)}) 638 typedefs.append({'oldtype': "signed %s" % probe['signed_sizes'][b], 'newtype': "int%u_t" % (b * 8)}) 639 640 macros.append({'oldmacro': "unsigned %s" % probe['unsigned_sizes'][b], 'newmacro': "UINT%u_T" % (b * 8)}) 641 macros.append({'oldmacro': "signed %s" % probe['signed_sizes'][b], 'newmacro': "INT%u_T" % (b * 8)}) 642 643 macros.append({'oldmacro': "\"%so\"" % probe['unsigned_strcs'][b], 'newmacro': "PRIo%u" % (b * 8)}) 644 macros.append({'oldmacro': "\"%su\"" % probe['unsigned_strcs'][b], 'newmacro': "PRIu%u" % (b * 8)}) 645 macros.append({'oldmacro': "\"%sx\"" % probe['unsigned_strcs'][b], 'newmacro': "PRIx%u" % (b * 8)}) 646 macros.append({'oldmacro': "\"%sX\"" % probe['unsigned_strcs'][b], 'newmacro': "PRIX%u" % (b * 8)}) 647 macros.append({'oldmacro': "\"%sd\"" % probe['signed_strcs'][b], 'newmacro': "PRId%u" % (b * 8)}) 648 649 name = probe['unsigned_concs'][b] 650 if ((name.startswith('@')) or (name == "")): 651 macros.append({'oldmacro': "c ## U", 'newmacro': "UINT%u_C(c)" % (b * 8)}) 652 else: 653 macros.append({'oldmacro': "c ## U%s" % name, 'newmacro': "UINT%u_C(c)" % (b * 8)}) 654 655 name = probe['unsigned_concs'][b] 656 if ((name.startswith('@')) or (name == "")): 657 macros.append({'oldmacro': "c", 'newmacro': "INT%u_C(c)" % (b * 8)}) 658 else: 659 macros.append({'oldmacro': "c ## %s" % name, 'newmacro': "INT%u_C(c)" % (b * 8)}) 660 661 for tag in inttags: 662 newmacro = "U%s" % tag 663 if (not tag in probe['unsigned_tags']): 664 print_error(['Unable to find appropriate size macro for %s.' % newmacro, 665 COMPILER_FAIL]) 666 667 oldmacro = "UINT%s" % (probe['unsigned_tags'][tag] * 8) 668 macros.append({'oldmacro': "%s_MIN" % oldmacro, 'newmacro': "%s_MIN" % newmacro}) 669 macros.append({'oldmacro': "%s_MAX" % oldmacro, 'newmacro': "%s_MAX" % newmacro}) 670 macros.append({'oldmacro': "1", 'newmacro': 'U%s_SIZE_%s' % (tag, probe['unsigned_tags'][tag] * 8)}) 671 672 newmacro = tag 673 if (not tag in probe['signed_tags']): 674 print_error(['Unable to find appropriate size macro for %s' % newmacro, 675 COMPILER_FAIL]) 676 677 oldmacro = "INT%s" % (probe['signed_tags'][tag] * 8) 678 macros.append({'oldmacro': "%s_MIN" % oldmacro, 'newmacro': "%s_MIN" % newmacro}) 679 macros.append({'oldmacro': "%s_MAX" % oldmacro, 'newmacro': "%s_MAX" % newmacro}) 680 macros.append({'oldmacro': "1", 'newmacro': '%s_SIZE_%s' % (tag, probe['signed_tags'][tag] * 8)}) 681 682 for tag in floattags: 683 if (not tag in probe['float_tags']): 684 print_error(['Unable to find appropriate size macro for %s' % tag, 685 COMPILER_FAIL]) 686 687 macros.append({'oldmacro': "1", 'newmacro': '%s_SIZE_%s' % (tag, probe['float_tags'][tag] * 8)}) 688 689 if (not 'size' in probe['builtin_signs']): 690 print_error(['Unable to determine whether size_t is signed or unsigned.', 460 691 COMPILER_FAIL]) 461 if 'sname' in typedef: 462 builtins[typedef['tag']]['sname'] = typedef['sname'] 463 464 return builtins 465 466 def get_suffix(type): 467 if type['sign'] == 'unsigned': 468 return { 469 "char": "", 470 "short": "", 471 "int": "U", 472 "long": "UL", 473 "long long": "ULL", 474 }[type['base']] 692 693 if (probe['builtin_signs']['size'] != 'unsigned'): 694 print_error(['The type size_t is not unsigned.', 695 COMPILER_FAIL]) 696 697 fnd = True 698 699 if (not 'wchar' in probe['builtin_sizes']): 700 print_warning(['The compiler does not provide the macro __WCHAR_TYPE__', 701 'for defining the compiler-native type wchar_t. We are', 702 'forced to define wchar_t as a hardwired type int32_t.', 703 COMPILER_WARNING]) 704 fnd = False 705 706 if (probe['builtin_sizes']['wchar']['value'] != 4): 707 print_warning(['The compiler provided macro __WCHAR_TYPE__ for defining', 708 'the compiler-native type wchar_t is not compliant with', 709 'HelenOS. We are forced to define wchar_t as a hardwired', 710 'type int32_t.', 711 COMPILER_WARNING]) 712 fnd = False 713 714 if (not fnd): 715 macros.append({'oldmacro': "int32_t", 'newmacro': "wchar_t"}) 475 716 else: 476 return { 477 "char": "", 478 "short": "", 479 "int": "", 480 "long": "L", 481 "long long": "LL", 482 }[type['base']] 483 484 def get_max(type): 485 val = (1 << (type['size']*8 - 1)) 486 if type['sign'] == 'unsigned': 487 val *= 2 488 return val - 1 489 490 def detect_sizes(probe): 491 "Detect properties of builtin types" 492 493 macros = {} 494 495 for type in probe.values(): 496 macros['__SIZEOF_%s__' % type['tag']] = type['size'] 497 498 if ('sname' in type): 499 macros['__%s_TYPE__' % type['sname']] = type['name'] 500 macros['__%s_WIDTH__' % type['sname']] = type['size']*8 501 macros['__%s_%s__' % (type['sname'], type['sign'].upper())] = "1" 502 macros['__%s_C_SUFFIX__' % type['sname']] = get_suffix(type) 503 macros['__%s_MAX__' % type['sname']] = "%d%s" % (get_max(type), get_suffix(type)) 504 505 if (probe['SIZE_T']['sign'] != 'unsigned'): 506 print_error(['The type size_t is not unsigned.', COMPILER_FAIL]) 507 508 return macros 717 macros.append({'oldmacro': "__WCHAR_TYPE__", 'newmacro': "wchar_t"}) 718 719 if (not 'wchar' in probe['builtin_signs']): 720 print_error(['Unable to determine whether wchar_t is signed or unsigned.', 721 COMPILER_FAIL]) 722 723 if (probe['builtin_signs']['wchar'] == 'unsigned'): 724 macros.append({'oldmacro': "1", 'newmacro': 'WCHAR_IS_UNSIGNED'}) 725 if (probe['builtin_signs']['wchar'] == 'signed'): 726 macros.append({'oldmacro': "1", 'newmacro': 'WCHAR_IS_SIGNED'}) 727 728 fnd = True 729 730 if (not 'wint' in probe['builtin_sizes']): 731 print_warning(['The compiler does not provide the macro __WINT_TYPE__', 732 'for defining the compiler-native type wint_t. We are', 733 'forced to define wint_t as a hardwired type int32_t.', 734 COMPILER_WARNING]) 735 fnd = False 736 737 if (probe['builtin_sizes']['wint']['value'] != 4): 738 print_warning(['The compiler provided macro __WINT_TYPE__ for defining', 739 'the compiler-native type wint_t is not compliant with', 740 'HelenOS. We are forced to define wint_t as a hardwired', 741 'type int32_t.', 742 COMPILER_WARNING]) 743 fnd = False 744 745 if (not fnd): 746 macros.append({'oldmacro': "int32_t", 'newmacro': "wint_t"}) 747 else: 748 macros.append({'oldmacro': "__WINT_TYPE__", 'newmacro': "wint_t"}) 749 750 if (not 'wint' in probe['builtin_signs']): 751 print_error(['Unable to determine whether wint_t is signed or unsigned.', 752 COMPILER_FAIL]) 753 754 if (probe['builtin_signs']['wint'] == 'unsigned'): 755 macros.append({'oldmacro': "1", 'newmacro': 'WINT_IS_UNSIGNED'}) 756 if (probe['builtin_signs']['wint'] == 'signed'): 757 macros.append({'oldmacro': "1", 'newmacro': 'WINT_IS_SIGNED'}) 758 759 return {'macros': macros, 'typedefs': typedefs} 509 760 510 761 def create_makefile(mkname, common): … … 526 777 outmk.close() 527 778 528 def create_header(hdname, ma cros):779 def create_header(hdname, maps, int128): 529 780 "Create header output" 530 781 … … 539 790 outhd.write('#define %s\n\n' % GUARD) 540 791 541 for macro in sorted(macros): 542 outhd.write('#ifndef %s\n' % macro) 543 outhd.write('#define %s %s\n' % (macro, macros[macro])) 544 outhd.write('#endif\n\n') 792 for macro in maps['macros']: 793 outhd.write('#define %s %s\n' % (macro['newmacro'], macro['oldmacro'])) 794 795 outhd.write('\n') 796 797 for typedef in maps['typedefs']: 798 outhd.write('typedef %s %s;\n' % (typedef['oldtype'], typedef['newtype'])) 799 800 if (int128): 801 outhd.write('typedef unsigned int __attribute((mode(TI))) uint128_t;\n') 802 outhd.write('typedef signed int __attribute((mode(TI))) int128_t;\n') 545 803 546 804 outhd.write('\n#endif\n') … … 658 916 probe = probe_compiler(common, 659 917 [ 660 {'type': 'long long int', 'tag': 'LONG_LONG', 'sname': 'LLONG' }, 661 {'type': 'long int', 'tag': 'LONG', 'sname': 'LONG' }, 662 {'type': 'int', 'tag': 'INT', 'sname': 'INT' }, 663 {'type': 'short int', 'tag': 'SHORT', 'sname': 'SHRT'}, 664 {'type': 'void*', 'tag': 'POINTER'}, 918 {'type': 'long long int', 'tag': 'LLONG', 'strc': '"ll"', 'conc': '"LL"'}, 919 {'type': 'long int', 'tag': 'LONG', 'strc': '"l"', 'conc': '"L"'}, 920 {'type': 'int', 'tag': 'INT', 'strc': '""', 'conc': '""'}, 921 {'type': 'short int', 'tag': 'SHRT', 'strc': '"h"', 'conc': '"@"'}, 922 {'type': 'char', 'tag': 'CHAR', 'strc': '"hh"', 'conc': '"@@"'} 923 ], 924 [ 665 925 {'type': 'long double', 'tag': 'LONG_DOUBLE'}, 666 926 {'type': 'double', 'tag': 'DOUBLE'}, 667 {'type': 'float', 'tag': 'FLOAT'}, 668 {'type': '__SIZE_TYPE__', 'tag': 'SIZE_T', 'def': '__SIZE_TYPE__', 'sname': 'SIZE' }, 669 {'type': '__PTRDIFF_TYPE__', 'tag': 'PTRDIFF_T', 'def': '__PTRDIFF_TYPE__', 'sname': 'PTRDIFF' }, 670 {'type': '__WINT_TYPE__', 'tag': 'WINT_T', 'def': '__WINT_TYPE__', 'sname': 'WINT' }, 671 {'type': '__WCHAR_TYPE__', 'tag': 'WCHAR_T', 'def': '__WCHAR_TYPE__', 'sname': 'WCHAR' }, 672 {'type': '__INTMAX_TYPE__', 'tag': 'INTMAX_T', 'def': '__INTMAX_TYPE__', 'sname': 'INTMAX' }, 673 {'type': 'unsigned __INTMAX_TYPE__', 'tag': 'UINTMAX_T', 'def': '__INTMAX_TYPE__', 'sname': 'UINTMAX' }, 927 {'type': 'float', 'tag': 'FLOAT'} 674 928 ] 675 929 ) 676 930 677 macros = detect_sizes(probe) 931 int128 = probe_int128(common) 932 933 maps = detect_sizes(probe, [1, 2, 4, 8], ['CHAR', 'SHRT', 'INT', 'LONG', 'LLONG'], ['LONG_DOUBLE', 'DOUBLE', 'FLOAT']) 678 934 679 935 finally: … … 683 939 684 940 create_makefile(MAKEFILE, common) 685 create_header(HEADER, ma cros)941 create_header(HEADER, maps, int128) 686 942 687 943 return 0
Note:
See TracChangeset
for help on using the changeset viewer.