1 /* Encoding of types for Objective C. 2 Copyright (C) 1993-2015 Free Software Foundation, Inc. 3 Contributed by Kresten Krab Thorup 4 Bitfield support by Ovidiu Predescu 5 6 This file is part of GCC. 7 8 GCC is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3, or (at your option) 11 any later version. 12 13 GCC is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 Under Section 7 of GPL version 3, you are granted additional 19 permissions described in the GCC Runtime Library Exception, version 20 3.1, as published by the Free Software Foundation. 21 22 You should have received a copy of the GNU General Public License and 23 a copy of the GCC Runtime Library Exception along with this program; 24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 25 <http://www.gnu.org/licenses/>. */ 26 27 /* FIXME: This file has no business including tm.h. */ 28 29 /* FIXME: This file contains functions that will abort the entire 30 program if they fail. Is that really needed ? */ 31 32 #include "objc-private/common.h" 33 #include "objc-private/error.h" 34 #include "tconfig.h" 35 #include "coretypes.h" 36 #include "tm.h" 37 #include "objc/runtime.h" 38 #include "objc-private/module-abi-8.h" /* For struct objc_method */ 39 #include <stdlib.h> 40 #include <ctype.h> 41 #include <string.h> /* For memcpy. */ 42 43 #undef MAX 44 #define MAX(X, Y) \ 45 ({ typeof (X) __x = (X), __y = (Y); \ 46 (__x > __y ? __x : __y); }) 47 48 #undef MIN 49 #define MIN(X, Y) \ 50 ({ typeof (X) __x = (X), __y = (Y); \ 51 (__x < __y ? __x : __y); }) 52 53 #undef ROUND 54 #define ROUND(V, A) \ 55 ({ typeof (V) __v = (V); typeof (A) __a = (A); \ 56 __a * ((__v+__a - 1)/__a); }) 57 58 59 /* Various hacks for objc_layout_record. These are used by the target 60 macros. */ 61 62 #define TREE_CODE(TYPE) *(TYPE) 63 #define TREE_TYPE(TREE) (TREE) 64 65 #define RECORD_TYPE _C_STRUCT_B 66 #define UNION_TYPE _C_UNION_B 67 #define QUAL_UNION_TYPE _C_UNION_B 68 #define ARRAY_TYPE _C_ARY_B 69 70 #define REAL_TYPE _C_DBL 71 72 #define VECTOR_TYPE _C_VECTOR 73 74 #define TYPE_FIELDS(TYPE) ({const char *_field = (TYPE)+1; \ 75 while (*_field != _C_STRUCT_E && *_field != _C_STRUCT_B \ 76 && *_field != _C_UNION_B && *_field++ != '=') \ 77 /* do nothing */; \ 78 _field;}) 79 80 #define DECL_MODE(TYPE) *(TYPE) 81 #define TYPE_MODE(TYPE) *(TYPE) 82 83 #define DFmode _C_DBL 84 85 #define strip_array_types(TYPE) ({const char *_field = (TYPE); \ 86 while (*_field == _C_ARY_B)\ 87 {\ 88 while (isdigit ((unsigned char)*++_field))\ 89 ;\ 90 }\ 91 _field;}) 92 93 /* Some ports (eg ARM) allow the structure size boundary to be 94 selected at compile-time. We override the normal definition with 95 one that has a constant value for this compilation. */ 96 #ifndef BITS_PER_UNIT 97 #define BITS_PER_UNIT 8 98 #endif 99 #undef STRUCTURE_SIZE_BOUNDARY 100 #define STRUCTURE_SIZE_BOUNDARY (BITS_PER_UNIT * sizeof (struct{char a;})) 101 102 /* Some ROUND_TYPE_ALIGN macros use TARGET_foo, and consequently 103 target_flags. Define a dummy entry here to so we don't die. 104 We have to rename it because target_flags may already have been 105 declared extern. */ 106 #define target_flags not_target_flags 107 static int __attribute__ ((__unused__)) not_target_flags = 0; 108 109 /* Some ROUND_TYPE_ALIGN use ALTIVEC_VECTOR_MODE (rs6000 darwin). 110 Define a dummy ALTIVEC_VECTOR_MODE so it will not die. */ 111 #undef ALTIVEC_VECTOR_MODE 112 #define ALTIVEC_VECTOR_MODE(MODE) (0) 113 114 /* Replace TARGET_VSX, TARGET_ALTIVEC, and TARGET_64BIT with constants based on 115 the current switches, rather than looking in the options structure. */ 116 #ifdef _ARCH_PPC 117 #undef TARGET_VSX 118 #undef TARGET_ALTIVEC 119 #undef TARGET_64BIT 120 121 #ifdef __VSX__ 122 #define TARGET_VSX 1 123 #else 124 #define TARGET_VSX 0 125 #endif 126 127 #ifdef __ALTIVEC__ 128 #define TARGET_ALTIVEC 1 129 #else 130 #define TARGET_ALTIVEC 0 131 #endif 132 133 #ifdef _ARCH_PPC64 134 #define TARGET_64BIT 1 135 #else 136 #define TARGET_64BIT 0 137 #endif 138 #endif 139 140 /* Furthermore, some (powerpc) targets also use TARGET_ALIGN_NATURAL 141 in their alignment macros. Currently[4.5/6], rs6000.h points this 142 to a static variable, initialized by target overrides. This is reset 143 in linux64.h but not in darwin64.h. The macro is not used by *86*. */ 144 145 #if __MACH__ 146 # if __LP64__ 147 # undef TARGET_ALIGN_NATURAL 148 # define TARGET_ALIGN_NATURAL 1 149 # endif 150 151 /* On Darwin32, we need to recurse until we find the starting stuct type. */ 152 static int 153 _darwin_rs6000_special_round_type_align (const char *struc, int comp, int spec) 154 { 155 const char *_stp , *_fields = TYPE_FIELDS (struc); 156 if (!_fields) 157 return MAX (comp, spec); 158 _stp = strip_array_types (_fields); 159 if (TYPE_MODE(_stp) == _C_COMPLEX) 160 _stp++; 161 switch (TYPE_MODE(_stp)) 162 { 163 case RECORD_TYPE: 164 case UNION_TYPE: 165 return MAX (MAX (comp, spec), objc_alignof_type (_stp) * BITS_PER_UNIT); 166 break; 167 case DFmode: 168 case _C_LNG_LNG: 169 case _C_ULNG_LNG: 170 return MAX (MAX (comp, spec), 64); 171 break; 172 173 default: 174 return MAX (comp, spec); 175 break; 176 } 177 } 178 179 /* See comment below. */ 180 #define darwin_rs6000_special_round_type_align(S,C,S2) \ 181 (_darwin_rs6000_special_round_type_align ((char*)(S), (int)(C), (int)(S2))) 182 #endif 183 184 /* FIXME: while this file has no business including tm.h, this 185 definitely has no business defining this macro but it 186 is only way around without really rewritting this file, 187 should look after the branch of 3.4 to fix this. */ 188 #define rs6000_special_round_type_align(STRUCT, COMPUTED, SPECIFIED) \ 189 ({ const char *_fields = TYPE_FIELDS (STRUCT); \ 190 ((_fields != 0 \ 191 && TYPE_MODE (strip_array_types (TREE_TYPE (_fields))) == DFmode) \ 192 ? MAX (MAX (COMPUTED, SPECIFIED), 64) \ 193 : MAX (COMPUTED, SPECIFIED));}) 194 195 #define rs6000_special_adjust_field_align_p(FIELD, COMPUTED) 0 196 197 /* Skip a variable name, enclosed in quotes ("). */ 198 static inline 199 const char * 200 objc_skip_variable_name (const char *type) 201 { 202 /* Skip the variable name if any. */ 203 if (*type == '"') 204 { 205 /* FIXME: How do we know we won't read beyond the end of the 206 string. Here and in the rest of the file! */ 207 /* Skip '"'. */ 208 type++; 209 /* Skip to the next '"'. */ 210 while (*type != '"') 211 type++; 212 /* Skip '"'. */ 213 type++; 214 } 215 216 return type; 217 } 218 219 int 220 objc_sizeof_type (const char *type) 221 { 222 type = objc_skip_variable_name (type); 223 224 switch (*type) { 225 case _C_BOOL: 226 return sizeof (_Bool); 227 break; 228 229 case _C_ID: 230 return sizeof (id); 231 break; 232 233 case _C_CLASS: 234 return sizeof (Class); 235 break; 236 237 case _C_SEL: 238 return sizeof (SEL); 239 break; 240 241 case _C_CHR: 242 return sizeof (char); 243 break; 244 245 case _C_UCHR: 246 return sizeof (unsigned char); 247 break; 248 249 case _C_SHT: 250 return sizeof (short); 251 break; 252 253 case _C_USHT: 254 return sizeof (unsigned short); 255 break; 256 257 case _C_INT: 258 return sizeof (int); 259 break; 260 261 case _C_UINT: 262 return sizeof (unsigned int); 263 break; 264 265 case _C_LNG: 266 return sizeof (long); 267 break; 268 269 case _C_ULNG: 270 return sizeof (unsigned long); 271 break; 272 273 case _C_LNG_LNG: 274 return sizeof (long long); 275 break; 276 277 case _C_ULNG_LNG: 278 return sizeof (unsigned long long); 279 break; 280 281 case _C_FLT: 282 return sizeof (float); 283 break; 284 285 case _C_DBL: 286 return sizeof (double); 287 break; 288 289 case _C_LNG_DBL: 290 return sizeof (long double); 291 break; 292 293 case _C_VOID: 294 return sizeof (void); 295 break; 296 297 case _C_PTR: 298 case _C_ATOM: 299 case _C_CHARPTR: 300 return sizeof (char *); 301 break; 302 303 case _C_ARY_B: 304 { 305 int len = atoi (type + 1); 306 while (isdigit ((unsigned char)*++type)) 307 ; 308 return len * objc_aligned_size (type); 309 } 310 break; 311 312 case _C_VECTOR: 313 { 314 /* Skip the '!'. */ 315 type++; 316 /* Skip the '['. */ 317 type++; 318 319 /* The size in bytes is the following number. */ 320 int size = atoi (type); 321 return size; 322 } 323 break; 324 325 case _C_BFLD: 326 { 327 /* The GNU encoding of bitfields is: b 'position' 'type' 328 'size'. */ 329 int position, size; 330 int startByte, endByte; 331 332 position = atoi (type + 1); 333 while (isdigit ((unsigned char)*++type)) 334 ; 335 size = atoi (type + 1); 336 337 startByte = position / BITS_PER_UNIT; 338 endByte = (position + size) / BITS_PER_UNIT; 339 return endByte - startByte; 340 } 341 342 case _C_UNION_B: 343 case _C_STRUCT_B: 344 { 345 struct objc_struct_layout layout; 346 unsigned int size; 347 348 objc_layout_structure (type, &layout); 349 while (objc_layout_structure_next_member (&layout)) 350 /* do nothing */ ; 351 objc_layout_finish_structure (&layout, &size, NULL); 352 353 return size; 354 } 355 356 case _C_COMPLEX: 357 { 358 type++; /* Skip after the 'j'. */ 359 switch (*type) 360 { 361 case _C_CHR: 362 return sizeof (_Complex char); 363 break; 364 365 case _C_UCHR: 366 return sizeof (_Complex unsigned char); 367 break; 368 369 case _C_SHT: 370 return sizeof (_Complex short); 371 break; 372 373 case _C_USHT: 374 return sizeof (_Complex unsigned short); 375 break; 376 377 case _C_INT: 378 return sizeof (_Complex int); 379 break; 380 381 case _C_UINT: 382 return sizeof (_Complex unsigned int); 383 break; 384 385 case _C_LNG: 386 return sizeof (_Complex long); 387 break; 388 389 case _C_ULNG: 390 return sizeof (_Complex unsigned long); 391 break; 392 393 case _C_LNG_LNG: 394 return sizeof (_Complex long long); 395 break; 396 397 case _C_ULNG_LNG: 398 return sizeof (_Complex unsigned long long); 399 break; 400 401 case _C_FLT: 402 return sizeof (_Complex float); 403 break; 404 405 case _C_DBL: 406 return sizeof (_Complex double); 407 break; 408 409 case _C_LNG_DBL: 410 return sizeof (_Complex long double); 411 break; 412 413 default: 414 { 415 /* FIXME: Is this so bad that we have to abort the 416 entire program ? (it applies to all the other 417 _objc_abort calls in this file). 418 */ 419 _objc_abort ("unknown complex type %s\n", type); 420 return 0; 421 } 422 } 423 } 424 425 default: 426 { 427 _objc_abort ("unknown type %s\n", type); 428 return 0; 429 } 430 } 431 } 432 433 int 434 objc_alignof_type (const char *type) 435 { 436 type = objc_skip_variable_name (type); 437 438 switch (*type) { 439 case _C_BOOL: 440 return __alignof__ (_Bool); 441 break; 442 443 case _C_ID: 444 return __alignof__ (id); 445 break; 446 447 case _C_CLASS: 448 return __alignof__ (Class); 449 break; 450 451 case _C_SEL: 452 return __alignof__ (SEL); 453 break; 454 455 case _C_CHR: 456 return __alignof__ (char); 457 break; 458 459 case _C_UCHR: 460 return __alignof__ (unsigned char); 461 break; 462 463 case _C_SHT: 464 return __alignof__ (short); 465 break; 466 467 case _C_USHT: 468 return __alignof__ (unsigned short); 469 break; 470 471 case _C_INT: 472 return __alignof__ (int); 473 break; 474 475 case _C_UINT: 476 return __alignof__ (unsigned int); 477 break; 478 479 case _C_LNG: 480 return __alignof__ (long); 481 break; 482 483 case _C_ULNG: 484 return __alignof__ (unsigned long); 485 break; 486 487 case _C_LNG_LNG: 488 return __alignof__ (long long); 489 break; 490 491 case _C_ULNG_LNG: 492 return __alignof__ (unsigned long long); 493 break; 494 495 case _C_FLT: 496 return __alignof__ (float); 497 break; 498 499 case _C_DBL: 500 return __alignof__ (double); 501 break; 502 503 case _C_LNG_DBL: 504 return __alignof__ (long double); 505 break; 506 507 case _C_PTR: 508 case _C_ATOM: 509 case _C_CHARPTR: 510 return __alignof__ (char *); 511 break; 512 513 case _C_ARY_B: 514 while (isdigit ((unsigned char)*++type)) 515 /* do nothing */; 516 return objc_alignof_type (type); 517 518 case _C_VECTOR: 519 { 520 /* Skip the '!'. */ 521 type++; 522 /* Skip the '['. */ 523 type++; 524 525 /* Skip the size. */ 526 while (isdigit ((unsigned char)*type)) 527 type++; 528 529 /* Skip the ','. */ 530 type++; 531 532 /* The alignment in bytes is the following number. */ 533 return atoi (type); 534 } 535 case _C_STRUCT_B: 536 case _C_UNION_B: 537 { 538 struct objc_struct_layout layout; 539 unsigned int align; 540 541 objc_layout_structure (type, &layout); 542 while (objc_layout_structure_next_member (&layout)) 543 /* do nothing */; 544 objc_layout_finish_structure (&layout, NULL, &align); 545 546 return align; 547 } 548 549 550 case _C_COMPLEX: 551 { 552 type++; /* Skip after the 'j'. */ 553 switch (*type) 554 { 555 case _C_CHR: 556 return __alignof__ (_Complex char); 557 break; 558 559 case _C_UCHR: 560 return __alignof__ (_Complex unsigned char); 561 break; 562 563 case _C_SHT: 564 return __alignof__ (_Complex short); 565 break; 566 567 case _C_USHT: 568 return __alignof__ (_Complex unsigned short); 569 break; 570 571 case _C_INT: 572 return __alignof__ (_Complex int); 573 break; 574 575 case _C_UINT: 576 return __alignof__ (_Complex unsigned int); 577 break; 578 579 case _C_LNG: 580 return __alignof__ (_Complex long); 581 break; 582 583 case _C_ULNG: 584 return __alignof__ (_Complex unsigned long); 585 break; 586 587 case _C_LNG_LNG: 588 return __alignof__ (_Complex long long); 589 break; 590 591 case _C_ULNG_LNG: 592 return __alignof__ (_Complex unsigned long long); 593 break; 594 595 case _C_FLT: 596 return __alignof__ (_Complex float); 597 break; 598 599 case _C_DBL: 600 return __alignof__ (_Complex double); 601 break; 602 603 case _C_LNG_DBL: 604 return __alignof__ (_Complex long double); 605 break; 606 607 default: 608 { 609 _objc_abort ("unknown complex type %s\n", type); 610 return 0; 611 } 612 } 613 } 614 615 default: 616 { 617 _objc_abort ("unknown type %s\n", type); 618 return 0; 619 } 620 } 621 } 622 623 int 624 objc_aligned_size (const char *type) 625 { 626 int size, align; 627 628 type = objc_skip_variable_name (type); 629 size = objc_sizeof_type (type); 630 align = objc_alignof_type (type); 631 632 return ROUND (size, align); 633 } 634 635 int 636 objc_promoted_size (const char *type) 637 { 638 int size, wordsize; 639 640 type = objc_skip_variable_name (type); 641 size = objc_sizeof_type (type); 642 wordsize = sizeof (void *); 643 644 return ROUND (size, wordsize); 645 } 646 647 /* 648 Skip type qualifiers. These may eventually precede typespecs 649 occurring in method prototype encodings. 650 */ 651 652 const char * 653 objc_skip_type_qualifiers (const char *type) 654 { 655 while (*type == _C_CONST 656 || *type == _C_IN 657 || *type == _C_INOUT 658 || *type == _C_OUT 659 || *type == _C_BYCOPY 660 || *type == _C_BYREF 661 || *type == _C_ONEWAY 662 || *type == _C_GCINVISIBLE) 663 { 664 type += 1; 665 } 666 return type; 667 } 668 669 const char * 670 objc_skip_typespec (const char *type) 671 { 672 type = objc_skip_variable_name (type); 673 type = objc_skip_type_qualifiers (type); 674 675 switch (*type) { 676 677 case _C_ID: 678 /* An id may be annotated by the actual type if it is known 679 with the @"ClassName" syntax */ 680 681 if (*++type != '"') 682 return type; 683 else 684 { 685 while (*++type != '"') 686 /* do nothing */; 687 return type + 1; 688 } 689 690 /* The following are one character type codes */ 691 case _C_CLASS: 692 case _C_SEL: 693 case _C_CHR: 694 case _C_UCHR: 695 case _C_CHARPTR: 696 case _C_ATOM: 697 case _C_SHT: 698 case _C_USHT: 699 case _C_INT: 700 case _C_UINT: 701 case _C_LNG: 702 case _C_BOOL: 703 case _C_ULNG: 704 case _C_LNG_LNG: 705 case _C_ULNG_LNG: 706 case _C_FLT: 707 case _C_DBL: 708 case _C_LNG_DBL: 709 case _C_VOID: 710 case _C_UNDEF: 711 return ++type; 712 break; 713 714 case _C_COMPLEX: 715 return type + 2; 716 break; 717 718 case _C_ARY_B: 719 /* skip digits, typespec and closing ']' */ 720 while (isdigit ((unsigned char)*++type)) 721 ; 722 type = objc_skip_typespec (type); 723 if (*type == _C_ARY_E) 724 return ++type; 725 else 726 { 727 _objc_abort ("bad array type %s\n", type); 728 return 0; 729 } 730 731 case _C_VECTOR: 732 /* Skip '!' */ 733 type++; 734 /* Skip '[' */ 735 type++; 736 /* Skip digits (size) */ 737 while (isdigit ((unsigned char)*type)) 738 type++; 739 /* Skip ',' */ 740 type++; 741 /* Skip digits (alignment) */ 742 while (isdigit ((unsigned char)*type)) 743 type++; 744 /* Skip typespec. */ 745 type = objc_skip_typespec (type); 746 /* Skip closing ']'. */ 747 if (*type == _C_ARY_E) 748 return ++type; 749 else 750 { 751 _objc_abort ("bad vector type %s\n", type); 752 return 0; 753 } 754 755 case _C_BFLD: 756 /* The GNU encoding of bitfields is: b 'position' 'type' 757 'size'. */ 758 while (isdigit ((unsigned char)*++type)) 759 ; /* skip position */ 760 while (isdigit ((unsigned char)*++type)) 761 ; /* skip type and size */ 762 return type; 763 764 case _C_STRUCT_B: 765 /* skip name, and elements until closing '}' */ 766 767 while (*type != _C_STRUCT_E && *type++ != '=') 768 ; 769 while (*type != _C_STRUCT_E) 770 { 771 type = objc_skip_typespec (type); 772 } 773 return ++type; 774 775 case _C_UNION_B: 776 /* skip name, and elements until closing ')' */ 777 778 while (*type != _C_UNION_E && *type++ != '=') 779 ; 780 while (*type != _C_UNION_E) 781 { 782 type = objc_skip_typespec (type); 783 } 784 return ++type; 785 786 case _C_PTR: 787 /* Just skip the following typespec */ 788 789 return objc_skip_typespec (++type); 790 791 default: 792 { 793 _objc_abort ("unknown type %s\n", type); 794 return 0; 795 } 796 } 797 } 798 799 /* 800 Skip an offset as part of a method encoding. This is prepended by a 801 '+' if the argument is passed in registers. 802 */ 803 const char * 804 objc_skip_offset (const char *type) 805 { 806 /* The offset is prepended by a '+' if the argument is passed in 807 registers. PS: The compiler stopped generating this '+' in 808 version 3.4. */ 809 if (*type == '+') 810 type++; 811 812 /* Some people claim that on some platforms, where the stack grows 813 backwards, the compiler generates negative offsets (??). Skip a 814 '-' for such a negative offset. */ 815 if (*type == '-') 816 type++; 817 818 /* Skip the digits that represent the offset. */ 819 while (isdigit ((unsigned char) *type)) 820 type++; 821 822 return type; 823 } 824 825 const char * 826 objc_skip_argspec (const char *type) 827 { 828 type = objc_skip_typespec (type); 829 type = objc_skip_offset (type); 830 return type; 831 } 832 833 char * 834 method_copyReturnType (struct objc_method *method) 835 { 836 if (method == NULL) 837 return 0; 838 else 839 { 840 char *returnValue; 841 size_t returnValueSize; 842 843 /* Determine returnValueSize. */ 844 { 845 /* Find the end of the first argument. We want to return the 846 first argument spec, plus 1 byte for the \0 at the end. */ 847 const char *type = method->method_types; 848 if (*type == '\0') 849 return NULL; 850 type = objc_skip_argspec (type); 851 returnValueSize = type - method->method_types + 1; 852 } 853 854 /* Copy the first argument into returnValue. */ 855 returnValue = malloc (sizeof (char) * returnValueSize); 856 memcpy (returnValue, method->method_types, returnValueSize); 857 returnValue[returnValueSize - 1] = '\0'; 858 859 return returnValue; 860 } 861 } 862 863 char * 864 method_copyArgumentType (struct objc_method * method, unsigned int argumentNumber) 865 { 866 if (method == NULL) 867 return 0; 868 else 869 { 870 char *returnValue; 871 const char *returnValueStart; 872 size_t returnValueSize; 873 874 /* Determine returnValueStart and returnValueSize. */ 875 { 876 const char *type = method->method_types; 877 878 /* Skip the first argument (return type). */ 879 type = objc_skip_argspec (type); 880 881 /* Now keep skipping arguments until we get to 882 argumentNumber. */ 883 while (argumentNumber > 0) 884 { 885 /* We are supposed to skip an argument, but the string is 886 finished. This means we were asked for a non-existing 887 argument. */ 888 if (*type == '\0') 889 return NULL; 890 891 type = objc_skip_argspec (type); 892 argumentNumber--; 893 } 894 895 /* If the argument does not exist, return NULL. */ 896 if (*type == '\0') 897 return NULL; 898 899 returnValueStart = type; 900 type = objc_skip_argspec (type); 901 returnValueSize = type - returnValueStart + 1; 902 } 903 904 /* Copy the argument into returnValue. */ 905 returnValue = malloc (sizeof (char) * returnValueSize); 906 memcpy (returnValue, returnValueStart, returnValueSize); 907 returnValue[returnValueSize - 1] = '\0'; 908 909 return returnValue; 910 } 911 } 912 913 void method_getReturnType (struct objc_method * method, char *returnValue, 914 size_t returnValueSize) 915 { 916 if (returnValue == NULL || returnValueSize == 0) 917 return; 918 919 /* Zero the string; we'll then write the argument type at the 920 beginning of it, if needed. */ 921 memset (returnValue, 0, returnValueSize); 922 923 if (method == NULL) 924 return; 925 else 926 { 927 size_t argumentTypeSize; 928 929 /* Determine argumentTypeSize. */ 930 { 931 /* Find the end of the first argument. We want to return the 932 first argument spec. */ 933 const char *type = method->method_types; 934 if (*type == '\0') 935 return; 936 type = objc_skip_argspec (type); 937 argumentTypeSize = type - method->method_types; 938 if (argumentTypeSize > returnValueSize) 939 argumentTypeSize = returnValueSize; 940 } 941 /* Copy the argument at the beginning of the string. */ 942 memcpy (returnValue, method->method_types, argumentTypeSize); 943 } 944 } 945 946 void method_getArgumentType (struct objc_method * method, unsigned int argumentNumber, 947 char *returnValue, size_t returnValueSize) 948 { 949 if (returnValue == NULL || returnValueSize == 0) 950 return; 951 952 /* Zero the string; we'll then write the argument type at the 953 beginning of it, if needed. */ 954 memset (returnValue, 0, returnValueSize); 955 956 if (method == NULL) 957 return; 958 else 959 { 960 const char *returnValueStart; 961 size_t argumentTypeSize; 962 963 /* Determine returnValueStart and argumentTypeSize. */ 964 { 965 const char *type = method->method_types; 966 967 /* Skip the first argument (return type). */ 968 type = objc_skip_argspec (type); 969 970 /* Now keep skipping arguments until we get to 971 argumentNumber. */ 972 while (argumentNumber > 0) 973 { 974 /* We are supposed to skip an argument, but the string is 975 finished. This means we were asked for a non-existing 976 argument. */ 977 if (*type == '\0') 978 return; 979 980 type = objc_skip_argspec (type); 981 argumentNumber--; 982 } 983 984 /* If the argument does not exist, it's game over. */ 985 if (*type == '\0') 986 return; 987 988 returnValueStart = type; 989 type = objc_skip_argspec (type); 990 argumentTypeSize = type - returnValueStart; 991 if (argumentTypeSize > returnValueSize) 992 argumentTypeSize = returnValueSize; 993 } 994 /* Copy the argument at the beginning of the string. */ 995 memcpy (returnValue, returnValueStart, argumentTypeSize); 996 } 997 } 998 999 unsigned int 1000 method_getNumberOfArguments (struct objc_method *method) 1001 { 1002 if (method == NULL) 1003 return 0; 1004 else 1005 { 1006 unsigned int i = 0; 1007 const char *type = method->method_types; 1008 while (*type) 1009 { 1010 type = objc_skip_argspec (type); 1011 i += 1; 1012 } 1013 1014 if (i == 0) 1015 { 1016 /* This could only happen if method_types is invalid; in 1017 that case, return 0. */ 1018 return 0; 1019 } 1020 else 1021 { 1022 /* Remove the return type. */ 1023 return (i - 1); 1024 } 1025 } 1026 } 1027 1028 unsigned 1029 objc_get_type_qualifiers (const char *type) 1030 { 1031 unsigned res = 0; 1032 BOOL flag = YES; 1033 1034 while (flag) 1035 switch (*type++) 1036 { 1037 case _C_CONST: res |= _F_CONST; break; 1038 case _C_IN: res |= _F_IN; break; 1039 case _C_INOUT: res |= _F_INOUT; break; 1040 case _C_OUT: res |= _F_OUT; break; 1041 case _C_BYCOPY: res |= _F_BYCOPY; break; 1042 case _C_BYREF: res |= _F_BYREF; break; 1043 case _C_ONEWAY: res |= _F_ONEWAY; break; 1044 case _C_GCINVISIBLE: res |= _F_GCINVISIBLE; break; 1045 default: flag = NO; 1046 } 1047 1048 return res; 1049 } 1050 1051 /* The following three functions can be used to determine how a 1052 structure is laid out by the compiler. For example: 1053 1054 struct objc_struct_layout layout; 1055 int i; 1056 1057 objc_layout_structure (type, &layout); 1058 while (objc_layout_structure_next_member (&layout)) 1059 { 1060 int position, align; 1061 const char *type; 1062 1063 objc_layout_structure_get_info (&layout, &position, &align, &type); 1064 printf ("element %d has offset %d, alignment %d\n", 1065 i++, position, align); 1066 } 1067 1068 These functions are used by objc_sizeof_type and objc_alignof_type 1069 functions to compute the size and alignment of structures. The 1070 previous method of computing the size and alignment of a structure 1071 was not working on some architectures, particularly on AIX, and in 1072 the presence of bitfields inside the structure. */ 1073 void 1074 objc_layout_structure (const char *type, 1075 struct objc_struct_layout *layout) 1076 { 1077 const char *ntype; 1078 1079 if (*type != _C_UNION_B && *type != _C_STRUCT_B) 1080 { 1081 _objc_abort ("record (or union) type expected in objc_layout_structure, got %s\n", 1082 type); 1083 } 1084 1085 type ++; 1086 layout->original_type = type; 1087 1088 /* Skip "<name>=" if any. Avoid embedded structures and unions. */ 1089 ntype = type; 1090 while (*ntype != _C_STRUCT_E && *ntype != _C_STRUCT_B && *ntype != _C_UNION_B 1091 && *ntype++ != '=') 1092 /* do nothing */; 1093 1094 /* If there's a "<name>=", ntype - 1 points to '='; skip the the name */ 1095 if (*(ntype - 1) == '=') 1096 type = ntype; 1097 1098 layout->type = type; 1099 layout->prev_type = NULL; 1100 layout->record_size = 0; 1101 layout->record_align = BITS_PER_UNIT; 1102 1103 layout->record_align = MAX (layout->record_align, STRUCTURE_SIZE_BOUNDARY); 1104 } 1105 1106 BOOL 1107 objc_layout_structure_next_member (struct objc_struct_layout *layout) 1108 { 1109 register int desired_align = 0; 1110 1111 /* The following are used only if the field is a bitfield */ 1112 register const char *bfld_type = 0; 1113 register int bfld_type_align = 0, bfld_field_size = 0; 1114 1115 /* The current type without the type qualifiers */ 1116 const char *type; 1117 BOOL unionp = layout->original_type[-1] == _C_UNION_B; 1118 1119 /* Add the size of the previous field to the size of the record. */ 1120 if (layout->prev_type) 1121 { 1122 type = objc_skip_type_qualifiers (layout->prev_type); 1123 if (unionp) 1124 layout->record_size = MAX (layout->record_size, 1125 objc_sizeof_type (type) * BITS_PER_UNIT); 1126 1127 else if (*type != _C_BFLD) 1128 layout->record_size += objc_sizeof_type (type) * BITS_PER_UNIT; 1129 else { 1130 /* Get the bitfield's type */ 1131 for (bfld_type = type + 1; 1132 isdigit ((unsigned char)*bfld_type); 1133 bfld_type++) 1134 /* do nothing */; 1135 1136 bfld_type_align = objc_alignof_type (bfld_type) * BITS_PER_UNIT; 1137 bfld_field_size = atoi (objc_skip_typespec (bfld_type)); 1138 layout->record_size += bfld_field_size; 1139 } 1140 } 1141 1142 if ((unionp && *layout->type == _C_UNION_E) 1143 || (!unionp && *layout->type == _C_STRUCT_E)) 1144 return NO; 1145 1146 /* Skip the variable name if any */ 1147 layout->type = objc_skip_variable_name (layout->type); 1148 type = objc_skip_type_qualifiers (layout->type); 1149 1150 if (*type != _C_BFLD) 1151 desired_align = objc_alignof_type (type) * BITS_PER_UNIT; 1152 else 1153 { 1154 desired_align = 1; 1155 /* Skip the bitfield's offset */ 1156 for (bfld_type = type + 1; 1157 isdigit ((unsigned char) *bfld_type); 1158 bfld_type++) 1159 /* do nothing */; 1160 1161 bfld_type_align = objc_alignof_type (bfld_type) * BITS_PER_UNIT; 1162 bfld_field_size = atoi (objc_skip_typespec (bfld_type)); 1163 } 1164 1165 /* The following won't work for vectors. */ 1166 #ifdef BIGGEST_FIELD_ALIGNMENT 1167 desired_align = MIN (desired_align, BIGGEST_FIELD_ALIGNMENT); 1168 #endif 1169 #ifdef ADJUST_FIELD_ALIGN 1170 desired_align = ADJUST_FIELD_ALIGN (type, desired_align); 1171 #endif 1172 1173 /* Record must have at least as much alignment as any field. 1174 Otherwise, the alignment of the field within the record 1175 is meaningless. */ 1176 #ifndef PCC_BITFIELD_TYPE_MATTERS 1177 layout->record_align = MAX (layout->record_align, desired_align); 1178 #else /* PCC_BITFIELD_TYPE_MATTERS */ 1179 if (*type == _C_BFLD) 1180 { 1181 /* For these machines, a zero-length field does not 1182 affect the alignment of the structure as a whole. 1183 It does, however, affect the alignment of the next field 1184 within the structure. */ 1185 if (bfld_field_size) 1186 layout->record_align = MAX (layout->record_align, desired_align); 1187 else 1188 desired_align = objc_alignof_type (bfld_type) * BITS_PER_UNIT; 1189 1190 /* A named bit field of declared type `int' 1191 forces the entire structure to have `int' alignment. 1192 Q1: How is encoded this thing and how to check for it? 1193 Q2: How to determine maximum_field_alignment at runtime? */ 1194 1195 /* if (DECL_NAME (field) != 0) */ 1196 { 1197 int type_align = bfld_type_align; 1198 #if 0 1199 if (maximum_field_alignment != 0) 1200 type_align = MIN (type_align, maximum_field_alignment); 1201 else if (DECL_PACKED (field)) 1202 type_align = MIN (type_align, BITS_PER_UNIT); 1203 #endif 1204 1205 layout->record_align = MAX (layout->record_align, type_align); 1206 } 1207 } 1208 else 1209 layout->record_align = MAX (layout->record_align, desired_align); 1210 #endif /* PCC_BITFIELD_TYPE_MATTERS */ 1211 1212 /* Does this field automatically have alignment it needs 1213 by virtue of the fields that precede it and the record's 1214 own alignment? */ 1215 1216 if (*type == _C_BFLD) 1217 layout->record_size = atoi (type + 1); 1218 else if (layout->record_size % desired_align != 0) 1219 { 1220 /* No, we need to skip space before this field. 1221 Bump the cumulative size to multiple of field alignment. */ 1222 layout->record_size = ROUND (layout->record_size, desired_align); 1223 } 1224 1225 /* Jump to the next field in record. */ 1226 1227 layout->prev_type = layout->type; 1228 layout->type = objc_skip_typespec (layout->type); /* skip component */ 1229 1230 return YES; 1231 } 1232 1233 void objc_layout_finish_structure (struct objc_struct_layout *layout, 1234 unsigned int *size, 1235 unsigned int *align) 1236 { 1237 BOOL unionp = layout->original_type[-1] == _C_UNION_B; 1238 if (layout->type 1239 && ((!unionp && *layout->type == _C_STRUCT_E) 1240 || (unionp && *layout->type == _C_UNION_E))) 1241 { 1242 /* Work out the alignment of the record as one expression and store 1243 in the record type. Round it up to a multiple of the record's 1244 alignment. */ 1245 #if defined (ROUND_TYPE_ALIGN) && ! defined (__sparc__) 1246 layout->record_align = ROUND_TYPE_ALIGN (layout->original_type-1, 1247 1, 1248 layout->record_align); 1249 #else 1250 layout->record_align = MAX (1, layout->record_align); 1251 #endif 1252 1253 #ifdef ROUND_TYPE_SIZE 1254 layout->record_size = ROUND_TYPE_SIZE (layout->original_type, 1255 layout->record_size, 1256 layout->record_align); 1257 #else 1258 /* Round the size up to be a multiple of the required alignment */ 1259 layout->record_size = ROUND (layout->record_size, layout->record_align); 1260 #endif 1261 1262 layout->type = NULL; 1263 } 1264 if (size) 1265 *size = layout->record_size / BITS_PER_UNIT; 1266 if (align) 1267 *align = layout->record_align / BITS_PER_UNIT; 1268 } 1269 1270 void objc_layout_structure_get_info (struct objc_struct_layout *layout, 1271 unsigned int *offset, 1272 unsigned int *align, 1273 const char **type) 1274 { 1275 if (offset) 1276 *offset = layout->record_size / BITS_PER_UNIT; 1277 if (align) 1278 *align = layout->record_align / BITS_PER_UNIT; 1279 if (type) 1280 *type = layout->prev_type; 1281 } 1282