1 /* Encoding of types for Objective C.
2 Copyright (C) 1993, 1995, 1996, 1997, 1998, 2000, 2002, 2004, 2009
3 Free Software Foundation, Inc.
4 Contributed by Kresten Krab Thorup
5 Bitfield support by Ovidiu Predescu
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 Under Section 7 of GPL version 3, you are granted additional
20 permissions described in the GCC Runtime Library Exception, version
21 3.1, as published by the Free Software Foundation.
23 You should have received a copy of the GNU General Public License and
24 a copy of the GCC Runtime Library Exception along with this program;
25 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
26 <http://www.gnu.org/licenses/>. */
28 /* FIXME: This file has no business including tm.h. */
30 /* FIXME: This file contains functions that will abort the entire
31 program if they fail. Is that really needed ? */
33 #include "objc-private/common.h"
34 #include "objc-private/error.h"
36 #include "coretypes.h"
38 #include "objc/runtime.h"
39 #include "objc-private/module-abi-8.h" /* For struct objc_method */
45 ({ typeof (X) __x = (X), __y = (Y); \
46 (__x > __y ? __x : __y); })
50 ({ typeof (X) __x = (X), __y = (Y); \
51 (__x < __y ? __x : __y); })
55 ({ typeof (V) __v = (V); typeof (A) __a = (A); \
56 __a * ((__v+__a - 1)/__a); })
59 /* Various hacks for objc_layout_record. These are used by the target
62 #define TREE_CODE(TYPE) *(TYPE)
63 #define TREE_TYPE(TREE) (TREE)
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
70 #define REAL_TYPE _C_DBL
72 #define VECTOR_TYPE _C_VECTOR
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++ != '=') \
80 #define DECL_MODE(TYPE) *(TYPE)
81 #define TYPE_MODE(TYPE) *(TYPE)
85 #define strip_array_types(TYPE) ({const char *_field = (TYPE); \
86 while (*_field == _C_ARY_B)\
88 while (isdigit ((unsigned char)*++_field))\
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. */
97 #define BITS_PER_UNIT 8
99 #undef STRUCTURE_SIZE_BOUNDARY
100 #define STRUCTURE_SIZE_BOUNDARY (BITS_PER_UNIT * sizeof (struct{char a;}))
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
106 #define target_flags not_target_flags
107 static int __attribute__ ((__unused__)) not_target_flags = 0;
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)
114 /* Furthermore, some (powerpc) targets also use TARGET_ALIGN_NATURAL
115 in their alignment macros. Currently[4.5/6], rs6000.h points this
116 to a static variable, initialized by target overrides. This is reset
117 in linux64.h but not in darwin64.h. The macro is not used by *86*. */
119 #if __MACH__ && __LP64__
120 # undef TARGET_ALIGN_NATURAL
121 # define TARGET_ALIGN_NATURAL 1
124 /* FIXME: while this file has no business including tm.h, this
125 definitely has no business defining this macro but it
126 is only way around without really rewritting this file,
127 should look after the branch of 3.4 to fix this.
128 FIXME1: It's also out of date, darwin no longer has the same alignment
129 'special' as aix - this is probably the origin of the m32 breakage. */
130 #define rs6000_special_round_type_align(STRUCT, COMPUTED, SPECIFIED) \
131 ({ const char *_fields = TYPE_FIELDS (STRUCT); \
133 && TYPE_MODE (strip_array_types (TREE_TYPE (_fields))) == DFmode) \
134 ? MAX (MAX (COMPUTED, SPECIFIED), 64) \
135 : MAX (COMPUTED, SPECIFIED));})
136 /* FIXME: The word 'fixme' is insufficient to explain the wrong-ness
137 of this next macro definition. */
138 #define darwin_rs6000_special_round_type_align(S,C,S2) \
139 rs6000_special_round_type_align(S,C,S2)
142 /* Skip a variable name, enclosed in quotes ("). */
145 objc_skip_variable_name (const char *type)
147 /* Skip the variable name if any. */
150 /* FIXME: How do we know we won't read beyond the end of the
151 string. Here and in the rest of the file! */
154 /* Skip to the next '"'. */
165 objc_sizeof_type (const char *type)
167 type = objc_skip_variable_name (type);
171 return sizeof (_Bool);
179 return sizeof (Class);
187 return sizeof (char);
191 return sizeof (unsigned char);
195 return sizeof (short);
199 return sizeof (unsigned short);
207 return sizeof (unsigned int);
211 return sizeof (long);
215 return sizeof (unsigned long);
219 return sizeof (long long);
223 return sizeof (unsigned long long);
227 return sizeof (float);
231 return sizeof (double);
235 return sizeof (long double);
239 return sizeof (void);
245 return sizeof (char *);
250 int len = atoi (type + 1);
251 while (isdigit ((unsigned char)*++type))
253 return len * objc_aligned_size (type);
264 /* The size in bytes is the following number. */
265 int size = atoi (type);
272 /* The GNU encoding of bitfields is: b 'position' 'type'
275 int startByte, endByte;
277 position = atoi (type + 1);
278 while (isdigit ((unsigned char)*++type))
280 size = atoi (type + 1);
282 startByte = position / BITS_PER_UNIT;
283 endByte = (position + size) / BITS_PER_UNIT;
284 return endByte - startByte;
290 struct objc_struct_layout layout;
293 objc_layout_structure (type, &layout);
294 while (objc_layout_structure_next_member (&layout))
296 objc_layout_finish_structure (&layout, &size, NULL);
303 type++; /* Skip after the 'j'. */
307 return sizeof (_Complex char);
311 return sizeof (_Complex unsigned char);
315 return sizeof (_Complex short);
319 return sizeof (_Complex unsigned short);
323 return sizeof (_Complex int);
327 return sizeof (_Complex unsigned int);
331 return sizeof (_Complex long);
335 return sizeof (_Complex unsigned long);
339 return sizeof (_Complex long long);
343 return sizeof (_Complex unsigned long long);
347 return sizeof (_Complex float);
351 return sizeof (_Complex double);
355 return sizeof (_Complex long double);
360 /* FIXME: Is this so bad that we have to abort the
361 entire program ? (it applies to all the other
362 _objc_abort calls in this file).
364 _objc_abort ("unknown complex type %s\n", type);
372 _objc_abort ("unknown type %s\n", type);
379 objc_alignof_type (const char *type)
381 type = objc_skip_variable_name (type);
385 return __alignof__ (_Bool);
389 return __alignof__ (id);
393 return __alignof__ (Class);
397 return __alignof__ (SEL);
401 return __alignof__ (char);
405 return __alignof__ (unsigned char);
409 return __alignof__ (short);
413 return __alignof__ (unsigned short);
417 return __alignof__ (int);
421 return __alignof__ (unsigned int);
425 return __alignof__ (long);
429 return __alignof__ (unsigned long);
433 return __alignof__ (long long);
437 return __alignof__ (unsigned long long);
441 return __alignof__ (float);
445 return __alignof__ (double);
449 return __alignof__ (long double);
455 return __alignof__ (char *);
459 while (isdigit ((unsigned char)*++type))
461 return objc_alignof_type (type);
471 while (isdigit ((unsigned char)*type))
477 /* The alignment in bytes is the following number. */
483 struct objc_struct_layout layout;
486 objc_layout_structure (type, &layout);
487 while (objc_layout_structure_next_member (&layout))
489 objc_layout_finish_structure (&layout, NULL, &align);
497 type++; /* Skip after the 'j'. */
501 return __alignof__ (_Complex char);
505 return __alignof__ (_Complex unsigned char);
509 return __alignof__ (_Complex short);
513 return __alignof__ (_Complex unsigned short);
517 return __alignof__ (_Complex int);
521 return __alignof__ (_Complex unsigned int);
525 return __alignof__ (_Complex long);
529 return __alignof__ (_Complex unsigned long);
533 return __alignof__ (_Complex long long);
537 return __alignof__ (_Complex unsigned long long);
541 return __alignof__ (_Complex float);
545 return __alignof__ (_Complex double);
549 return __alignof__ (_Complex long double);
554 _objc_abort ("unknown complex type %s\n", type);
562 _objc_abort ("unknown type %s\n", type);
569 objc_aligned_size (const char *type)
573 type = objc_skip_variable_name (type);
574 size = objc_sizeof_type (type);
575 align = objc_alignof_type (type);
577 return ROUND (size, align);
581 objc_promoted_size (const char *type)
585 type = objc_skip_variable_name (type);
586 size = objc_sizeof_type (type);
587 wordsize = sizeof (void *);
589 return ROUND (size, wordsize);
594 objc_skip_type_qualifiers (const char *type)
596 while (*type == _C_CONST
600 || *type == _C_BYCOPY
602 || *type == _C_ONEWAY
603 || *type == _C_GCINVISIBLE)
612 objc_skip_typespec (const char *type)
614 type = objc_skip_variable_name (type);
615 type = objc_skip_type_qualifiers (type);
620 /* An id may be annotated by the actual type if it is known
621 with the @"ClassName" syntax */
627 while (*++type != '"')
632 /* The following are one character type codes */
661 /* skip digits, typespec and closing ']' */
662 while (isdigit ((unsigned char)*++type))
664 type = objc_skip_typespec (type);
665 if (*type == _C_ARY_E)
669 _objc_abort ("bad array type %s\n", type);
678 /* Skip digits (size) */
679 while (isdigit ((unsigned char)*type))
683 /* Skip digits (alignment) */
684 while (isdigit ((unsigned char)*type))
687 type = objc_skip_typespec (type);
688 /* Skip closing ']'. */
689 if (*type == _C_ARY_E)
693 _objc_abort ("bad vector type %s\n", type);
698 /* The GNU encoding of bitfields is: b 'position' 'type'
700 while (isdigit ((unsigned char)*++type))
701 ; /* skip position */
702 while (isdigit ((unsigned char)*++type))
703 ; /* skip type and size */
707 /* skip name, and elements until closing '}' */
709 while (*type != _C_STRUCT_E && *type++ != '=')
711 while (*type != _C_STRUCT_E)
713 type = objc_skip_typespec (type);
718 /* skip name, and elements until closing ')' */
720 while (*type != _C_UNION_E && *type++ != '=')
722 while (*type != _C_UNION_E)
724 type = objc_skip_typespec (type);
729 /* Just skip the following typespec */
731 return objc_skip_typespec (++type);
735 _objc_abort ("unknown type %s\n", type);
743 objc_skip_offset (const char *type)
745 /* The offset is prepended by a '+' if the argument is passed in
746 registers. PS: The compiler stopped generating this '+' in
751 /* Some people claim that on some platforms, where the stack grows
752 backwards, the compiler generates negative offsets (??). Skip a
753 '-' for such a negative offset. */
757 /* Skip the digits that represent the offset. */
758 while (isdigit ((unsigned char) *type))
765 objc_skip_argspec (const char *type)
767 type = objc_skip_typespec (type);
768 type = objc_skip_offset (type);
773 method_getNumberOfArguments (struct objc_method *method)
780 const char *type = method->method_types;
783 type = objc_skip_argspec (type);
789 /* This could only happen if method_types is invalid; in
790 that case, return 0. */
795 /* Remove the return type. */
802 method_get_number_of_arguments (struct objc_method *mth)
804 return method_getNumberOfArguments (mth);
807 /* Return the size of the argument block needed on the stack to invoke
808 the method MTH. This may be zero, if all arguments are passed in
811 method_get_sizeof_arguments (struct objc_method *mth)
813 const char *type = objc_skip_typespec (mth->method_types);
818 Return a pointer to the next argument of ARGFRAME. type points to
819 the last argument. Typical use of this look like:
823 for (datum = method_get_first_argument (method, argframe, &type);
824 datum; datum = method_get_next_argument (argframe, &type))
826 unsigned flags = objc_get_type_qualifiers (type);
827 type = objc_skip_type_qualifiers (type);
829 [portal encodeData: datum ofType: type];
832 if ((flags & _F_IN) == _F_IN)
833 [portal encodeData: *(char **) datum ofType: ++type];
840 method_get_next_argument (arglist_t argframe, const char **type)
842 const char *t = objc_skip_argspec (*type);
848 t = objc_skip_typespec (t);
851 return argframe->arg_regs + atoi (++t);
853 return argframe->arg_ptr + atoi (t);
856 /* Return a pointer to the value of the first argument of the method
857 described in M with the given argumentframe ARGFRAME. The type
858 is returned in TYPE. type must be passed to successive calls of
859 method_get_next_argument. */
861 method_get_first_argument (struct objc_method *m,
865 *type = m->method_types;
866 return method_get_next_argument (argframe, type);
869 /* Return a pointer to the ARGth argument of the method
870 M from the frame ARGFRAME. The type of the argument
871 is returned in the value-result argument TYPE. */
873 method_get_nth_argument (struct objc_method *m,
874 arglist_t argframe, int arg,
877 const char *t = objc_skip_argspec (m->method_types);
879 if (arg > method_get_number_of_arguments (m))
883 t = objc_skip_argspec (t);
886 t = objc_skip_typespec (t);
889 return argframe->arg_regs + atoi (++t);
891 return argframe->arg_ptr + atoi (t);
895 objc_get_type_qualifiers (const char *type)
903 case _C_CONST: res |= _F_CONST; break;
904 case _C_IN: res |= _F_IN; break;
905 case _C_INOUT: res |= _F_INOUT; break;
906 case _C_OUT: res |= _F_OUT; break;
907 case _C_BYCOPY: res |= _F_BYCOPY; break;
908 case _C_BYREF: res |= _F_BYREF; break;
909 case _C_ONEWAY: res |= _F_ONEWAY; break;
910 case _C_GCINVISIBLE: res |= _F_GCINVISIBLE; break;
917 /* The following three functions can be used to determine how a
918 structure is laid out by the compiler. For example:
920 struct objc_struct_layout layout;
923 objc_layout_structure (type, &layout);
924 while (objc_layout_structure_next_member (&layout))
929 objc_layout_structure_get_info (&layout, &position, &align, &type);
930 printf ("element %d has offset %d, alignment %d\n",
931 i++, position, align);
934 These functions are used by objc_sizeof_type and objc_alignof_type
935 functions to compute the size and alignment of structures. The
936 previous method of computing the size and alignment of a structure
937 was not working on some architectures, particulary on AIX, and in
938 the presence of bitfields inside the structure. */
940 objc_layout_structure (const char *type,
941 struct objc_struct_layout *layout)
945 if (*type != _C_UNION_B && *type != _C_STRUCT_B)
947 _objc_abort ("record (or union) type expected in objc_layout_structure, got %s\n",
952 layout->original_type = type;
954 /* Skip "<name>=" if any. Avoid embedded structures and unions. */
956 while (*ntype != _C_STRUCT_E && *ntype != _C_STRUCT_B && *ntype != _C_UNION_B
960 /* If there's a "<name>=", ntype - 1 points to '='; skip the the name */
961 if (*(ntype - 1) == '=')
965 layout->prev_type = NULL;
966 layout->record_size = 0;
967 layout->record_align = BITS_PER_UNIT;
969 layout->record_align = MAX (layout->record_align, STRUCTURE_SIZE_BOUNDARY);
973 objc_layout_structure_next_member (struct objc_struct_layout *layout)
975 register int desired_align = 0;
977 /* The following are used only if the field is a bitfield */
978 register const char *bfld_type = 0;
979 register int bfld_type_align = 0, bfld_field_size = 0;
981 /* The current type without the type qualifiers */
983 BOOL unionp = layout->original_type[-1] == _C_UNION_B;
985 /* Add the size of the previous field to the size of the record. */
986 if (layout->prev_type)
988 type = objc_skip_type_qualifiers (layout->prev_type);
990 layout->record_size = MAX (layout->record_size,
991 objc_sizeof_type (type) * BITS_PER_UNIT);
993 else if (*type != _C_BFLD)
994 layout->record_size += objc_sizeof_type (type) * BITS_PER_UNIT;
996 /* Get the bitfield's type */
997 for (bfld_type = type + 1;
998 isdigit ((unsigned char)*bfld_type);
1002 bfld_type_align = objc_alignof_type (bfld_type) * BITS_PER_UNIT;
1003 bfld_field_size = atoi (objc_skip_typespec (bfld_type));
1004 layout->record_size += bfld_field_size;
1008 if ((unionp && *layout->type == _C_UNION_E)
1009 || (!unionp && *layout->type == _C_STRUCT_E))
1012 /* Skip the variable name if any */
1013 layout->type = objc_skip_variable_name (layout->type);
1014 type = objc_skip_type_qualifiers (layout->type);
1016 if (*type != _C_BFLD)
1017 desired_align = objc_alignof_type (type) * BITS_PER_UNIT;
1021 /* Skip the bitfield's offset */
1022 for (bfld_type = type + 1;
1023 isdigit ((unsigned char) *bfld_type);
1027 bfld_type_align = objc_alignof_type (bfld_type) * BITS_PER_UNIT;
1028 bfld_field_size = atoi (objc_skip_typespec (bfld_type));
1031 /* The following won't work for vectors. */
1032 #ifdef BIGGEST_FIELD_ALIGNMENT
1033 desired_align = MIN (desired_align, BIGGEST_FIELD_ALIGNMENT);
1035 #ifdef ADJUST_FIELD_ALIGN
1036 desired_align = ADJUST_FIELD_ALIGN (type, desired_align);
1039 /* Record must have at least as much alignment as any field.
1040 Otherwise, the alignment of the field within the record
1042 #ifndef PCC_BITFIELD_TYPE_MATTERS
1043 layout->record_align = MAX (layout->record_align, desired_align);
1044 #else /* PCC_BITFIELD_TYPE_MATTERS */
1045 if (*type == _C_BFLD)
1047 /* For these machines, a zero-length field does not
1048 affect the alignment of the structure as a whole.
1049 It does, however, affect the alignment of the next field
1050 within the structure. */
1051 if (bfld_field_size)
1052 layout->record_align = MAX (layout->record_align, desired_align);
1054 desired_align = objc_alignof_type (bfld_type) * BITS_PER_UNIT;
1056 /* A named bit field of declared type `int'
1057 forces the entire structure to have `int' alignment.
1058 Q1: How is encoded this thing and how to check for it?
1059 Q2: How to determine maximum_field_alignment at runtime? */
1061 /* if (DECL_NAME (field) != 0) */
1063 int type_align = bfld_type_align;
1065 if (maximum_field_alignment != 0)
1066 type_align = MIN (type_align, maximum_field_alignment);
1067 else if (DECL_PACKED (field))
1068 type_align = MIN (type_align, BITS_PER_UNIT);
1071 layout->record_align = MAX (layout->record_align, type_align);
1075 layout->record_align = MAX (layout->record_align, desired_align);
1076 #endif /* PCC_BITFIELD_TYPE_MATTERS */
1078 /* Does this field automatically have alignment it needs
1079 by virtue of the fields that precede it and the record's
1082 if (*type == _C_BFLD)
1083 layout->record_size = atoi (type + 1);
1084 else if (layout->record_size % desired_align != 0)
1086 /* No, we need to skip space before this field.
1087 Bump the cumulative size to multiple of field alignment. */
1088 layout->record_size = ROUND (layout->record_size, desired_align);
1091 /* Jump to the next field in record. */
1093 layout->prev_type = layout->type;
1094 layout->type = objc_skip_typespec (layout->type); /* skip component */
1099 void objc_layout_finish_structure (struct objc_struct_layout *layout,
1101 unsigned int *align)
1103 BOOL unionp = layout->original_type[-1] == _C_UNION_B;
1105 && ((!unionp && *layout->type == _C_STRUCT_E)
1106 || (unionp && *layout->type == _C_UNION_E)))
1108 /* Work out the alignment of the record as one expression and store
1109 in the record type. Round it up to a multiple of the record's
1111 #if defined (ROUND_TYPE_ALIGN) && ! defined (__sparc__)
1112 layout->record_align = ROUND_TYPE_ALIGN (layout->original_type-1,
1114 layout->record_align);
1116 layout->record_align = MAX (1, layout->record_align);
1119 #ifdef ROUND_TYPE_SIZE
1120 layout->record_size = ROUND_TYPE_SIZE (layout->original_type,
1121 layout->record_size,
1122 layout->record_align);
1124 /* Round the size up to be a multiple of the required alignment */
1125 layout->record_size = ROUND (layout->record_size, layout->record_align);
1128 layout->type = NULL;
1131 *size = layout->record_size / BITS_PER_UNIT;
1133 *align = layout->record_align / BITS_PER_UNIT;
1136 void objc_layout_structure_get_info (struct objc_struct_layout *layout,
1137 unsigned int *offset,
1138 unsigned int *align,
1142 *offset = layout->record_size / BITS_PER_UNIT;
1144 *align = layout->record_align / BITS_PER_UNIT;
1146 *type = layout->prev_type;