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 ?
34 #include "objc-private/common.h"
35 #include "objc-private/error.h"
37 #include "coretypes.h"
39 #include "objc/objc-api.h"
40 #include "objc/encoding.h"
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 return the size of an object specified by type
146 objc_sizeof_type (const char *type
)
148 /* Skip the variable name if any */
151 /* FIXME: How do we know we won't read beyond the end of the
152 string. Here and in the rest of the file! */
153 for (type
++; *type
++ != '"';)
159 return sizeof (_Bool
);
167 return sizeof (Class
);
175 return sizeof (char);
179 return sizeof (unsigned char);
183 return sizeof (short);
187 return sizeof (unsigned short);
195 return sizeof (unsigned int);
199 return sizeof (long);
203 return sizeof (unsigned long);
207 return sizeof (long long);
211 return sizeof (unsigned long long);
215 return sizeof (float);
219 return sizeof (double);
223 return sizeof (long double);
227 return sizeof (void);
233 return sizeof (char *);
238 int len
= atoi (type
+ 1);
239 while (isdigit ((unsigned char)*++type
))
241 return len
* objc_aligned_size (type
);
252 /* The size in bytes is the following number. */
253 int size
= atoi (type
);
260 /* The new encoding of bitfields is: b 'position' 'type' 'size' */
262 int startByte
, endByte
;
264 position
= atoi (type
+ 1);
265 while (isdigit ((unsigned char)*++type
))
267 size
= atoi (type
+ 1);
269 startByte
= position
/ BITS_PER_UNIT
;
270 endByte
= (position
+ size
) / BITS_PER_UNIT
;
271 return endByte
- startByte
;
277 struct objc_struct_layout layout
;
280 objc_layout_structure (type
, &layout
);
281 while (objc_layout_structure_next_member (&layout
))
283 objc_layout_finish_structure (&layout
, &size
, NULL
);
290 type
++; /* Skip after the 'j'. */
294 return sizeof (_Complex
char);
298 return sizeof (_Complex
unsigned char);
302 return sizeof (_Complex
short);
306 return sizeof (_Complex
unsigned short);
310 return sizeof (_Complex
int);
314 return sizeof (_Complex
unsigned int);
318 return sizeof (_Complex
long);
322 return sizeof (_Complex
unsigned long);
326 return sizeof (_Complex
long long);
330 return sizeof (_Complex
unsigned long long);
334 return sizeof (_Complex
float);
338 return sizeof (_Complex
double);
342 return sizeof (_Complex
long double);
347 /* FIXME: Is this so bad that we have to abort the
348 entire program ? (it applies to all the other
349 _objc_abort calls in this file).
351 _objc_abort ("unknown complex type %s\n", type
);
359 _objc_abort ("unknown type %s\n", type
);
367 Return the alignment of an object specified by type
371 objc_alignof_type (const char *type
)
373 /* Skip the variable name if any */
376 for (type
++; *type
++ != '"';)
381 return __alignof__ (_Bool
);
385 return __alignof__ (id
);
389 return __alignof__ (Class
);
393 return __alignof__ (SEL
);
397 return __alignof__ (char);
401 return __alignof__ (unsigned char);
405 return __alignof__ (short);
409 return __alignof__ (unsigned short);
413 return __alignof__ (int);
417 return __alignof__ (unsigned int);
421 return __alignof__ (long);
425 return __alignof__ (unsigned long);
429 return __alignof__ (long long);
433 return __alignof__ (unsigned long long);
437 return __alignof__ (float);
441 return __alignof__ (double);
445 return __alignof__ (long double);
451 return __alignof__ (char *);
455 while (isdigit ((unsigned char)*++type
))
457 return objc_alignof_type (type
);
467 while (isdigit ((unsigned char)*type
))
473 /* The alignment in bytes is the following number. */
479 struct objc_struct_layout layout
;
482 objc_layout_structure (type
, &layout
);
483 while (objc_layout_structure_next_member (&layout
))
485 objc_layout_finish_structure (&layout
, NULL
, &align
);
493 type
++; /* Skip after the 'j'. */
497 return __alignof__ (_Complex
char);
501 return __alignof__ (_Complex
unsigned char);
505 return __alignof__ (_Complex
short);
509 return __alignof__ (_Complex
unsigned short);
513 return __alignof__ (_Complex
int);
517 return __alignof__ (_Complex
unsigned int);
521 return __alignof__ (_Complex
long);
525 return __alignof__ (_Complex
unsigned long);
529 return __alignof__ (_Complex
long long);
533 return __alignof__ (_Complex
unsigned long long);
537 return __alignof__ (_Complex
float);
541 return __alignof__ (_Complex
double);
545 return __alignof__ (_Complex
long double);
550 _objc_abort ("unknown complex type %s\n", type
);
558 _objc_abort ("unknown type %s\n", type
);
565 The aligned size if the size rounded up to the nearest alignment.
569 objc_aligned_size (const char *type
)
573 /* Skip the variable name */
576 for (type
++; *type
++ != '"';)
580 size
= objc_sizeof_type (type
);
581 align
= objc_alignof_type (type
);
583 return ROUND (size
, align
);
587 The size rounded up to the nearest integral of the wordsize, taken
588 to be the size of a void *.
592 objc_promoted_size (const char *type
)
596 /* Skip the variable name */
599 for (type
++; *type
++ != '"';)
603 size
= objc_sizeof_type (type
);
604 wordsize
= sizeof (void *);
606 return ROUND (size
, wordsize
);
610 Skip type qualifiers. These may eventually precede typespecs
611 occurring in method prototype encodings.
615 objc_skip_type_qualifiers (const char *type
)
617 while (*type
== _C_CONST
621 || *type
== _C_BYCOPY
623 || *type
== _C_ONEWAY
624 || *type
== _C_GCINVISIBLE
)
633 Skip one typespec element. If the typespec is prepended by type
634 qualifiers, these are skipped as well.
638 objc_skip_typespec (const char *type
)
640 /* Skip the variable name if any */
643 for (type
++; *type
++ != '"';)
647 type
= objc_skip_type_qualifiers (type
);
652 /* An id may be annotated by the actual type if it is known
653 with the @"ClassName" syntax */
659 while (*++type
!= '"')
664 /* The following are one character type codes */
693 /* skip digits, typespec and closing ']' */
694 while (isdigit ((unsigned char)*++type
))
696 type
= objc_skip_typespec (type
);
697 if (*type
== _C_ARY_E
)
701 _objc_abort ("bad array type %s\n", type
);
710 /* Skip digits (size) */
711 while (isdigit ((unsigned char)*type
))
715 /* Skip digits (alignment) */
716 while (isdigit ((unsigned char)*type
))
719 type
= objc_skip_typespec (type
);
720 /* Skip closing ']'. */
721 if (*type
== _C_ARY_E
)
725 _objc_abort ("bad vector type %s\n", type
);
730 /* The new encoding of bitfields is: b 'position' 'type' 'size' */
731 while (isdigit ((unsigned char)*++type
))
732 ; /* skip position */
733 while (isdigit ((unsigned char)*++type
))
734 ; /* skip type and size */
738 /* skip name, and elements until closing '}' */
740 while (*type
!= _C_STRUCT_E
&& *type
++ != '=')
742 while (*type
!= _C_STRUCT_E
)
744 type
= objc_skip_typespec (type
);
749 /* skip name, and elements until closing ')' */
751 while (*type
!= _C_UNION_E
&& *type
++ != '=')
753 while (*type
!= _C_UNION_E
)
755 type
= objc_skip_typespec (type
);
760 /* Just skip the following typespec */
762 return objc_skip_typespec (++type
);
766 _objc_abort ("unknown type %s\n", type
);
773 Skip an offset as part of a method encoding. This is prepended by a
774 '+' if the argument is passed in registers.
776 FIXME: The compiler never generates '+'.
779 objc_skip_offset (const char *type
)
783 while (isdigit ((unsigned char) *++type
))
789 Skip an argument specification of a method encoding.
792 objc_skip_argspec (const char *type
)
794 type
= objc_skip_typespec (type
);
795 type
= objc_skip_offset (type
);
800 Return the number of arguments that the method MTH expects.
801 Note that all methods need two implicit arguments `self' and
805 method_get_number_of_arguments (struct objc_method
*mth
)
808 const char *type
= mth
->method_types
;
811 type
= objc_skip_argspec (type
);
818 Return the size of the argument block needed on the stack to invoke
819 the method MTH. This may be zero, if all arguments are passed in
824 method_get_sizeof_arguments (struct objc_method
*mth
)
826 const char *type
= objc_skip_typespec (mth
->method_types
);
831 Return a pointer to the next argument of ARGFRAME. type points to
832 the last argument. Typical use of this look like:
836 for (datum = method_get_first_argument (method, argframe, &type);
837 datum; datum = method_get_next_argument (argframe, &type))
839 unsigned flags = objc_get_type_qualifiers (type);
840 type = objc_skip_type_qualifiers (type);
842 [portal encodeData: datum ofType: type];
845 if ((flags & _F_IN) == _F_IN)
846 [portal encodeData: *(char **) datum ofType: ++type];
853 method_get_next_argument (arglist_t argframe
, const char **type
)
855 const char *t
= objc_skip_argspec (*type
);
861 t
= objc_skip_typespec (t
);
864 return argframe
->arg_regs
+ atoi (++t
);
866 return argframe
->arg_ptr
+ atoi (t
);
870 Return a pointer to the value of the first argument of the method
871 described in M with the given argumentframe ARGFRAME. The type
872 is returned in TYPE. type must be passed to successive calls of
873 method_get_next_argument.
876 method_get_first_argument (struct objc_method
*m
,
880 *type
= m
->method_types
;
881 return method_get_next_argument (argframe
, type
);
885 Return a pointer to the ARGth argument of the method
886 M from the frame ARGFRAME. The type of the argument
887 is returned in the value-result argument TYPE
891 method_get_nth_argument (struct objc_method
*m
,
892 arglist_t argframe
, int arg
,
895 const char *t
= objc_skip_argspec (m
->method_types
);
897 if (arg
> method_get_number_of_arguments (m
))
901 t
= objc_skip_argspec (t
);
904 t
= objc_skip_typespec (t
);
907 return argframe
->arg_regs
+ atoi (++t
);
909 return argframe
->arg_ptr
+ atoi (t
);
913 objc_get_type_qualifiers (const char *type
)
921 case _C_CONST
: res
|= _F_CONST
; break;
922 case _C_IN
: res
|= _F_IN
; break;
923 case _C_INOUT
: res
|= _F_INOUT
; break;
924 case _C_OUT
: res
|= _F_OUT
; break;
925 case _C_BYCOPY
: res
|= _F_BYCOPY
; break;
926 case _C_BYREF
: res
|= _F_BYREF
; break;
927 case _C_ONEWAY
: res
|= _F_ONEWAY
; break;
928 case _C_GCINVISIBLE
: res
|= _F_GCINVISIBLE
; break;
936 /* The following three functions can be used to determine how a
937 structure is laid out by the compiler. For example:
939 struct objc_struct_layout layout;
942 objc_layout_structure (type, &layout);
943 while (objc_layout_structure_next_member (&layout))
948 objc_layout_structure_get_info (&layout, &position, &align, &type);
949 printf ("element %d has offset %d, alignment %d\n",
950 i++, position, align);
953 These functions are used by objc_sizeof_type and objc_alignof_type
954 functions to compute the size and alignment of structures. The
955 previous method of computing the size and alignment of a structure
956 was not working on some architectures, particulary on AIX, and in
957 the presence of bitfields inside the structure. */
959 objc_layout_structure (const char *type
,
960 struct objc_struct_layout
*layout
)
964 if (*type
!= _C_UNION_B
&& *type
!= _C_STRUCT_B
)
966 _objc_abort ("record (or union) type expected in objc_layout_structure, got %s\n",
971 layout
->original_type
= type
;
973 /* Skip "<name>=" if any. Avoid embedded structures and unions. */
975 while (*ntype
!= _C_STRUCT_E
&& *ntype
!= _C_STRUCT_B
&& *ntype
!= _C_UNION_B
979 /* If there's a "<name>=", ntype - 1 points to '='; skip the the name */
980 if (*(ntype
- 1) == '=')
984 layout
->prev_type
= NULL
;
985 layout
->record_size
= 0;
986 layout
->record_align
= BITS_PER_UNIT
;
988 layout
->record_align
= MAX (layout
->record_align
, STRUCTURE_SIZE_BOUNDARY
);
993 objc_layout_structure_next_member (struct objc_struct_layout
*layout
)
995 register int desired_align
= 0;
997 /* The following are used only if the field is a bitfield */
998 register const char *bfld_type
= 0;
999 register int bfld_type_align
= 0, bfld_field_size
= 0;
1001 /* The current type without the type qualifiers */
1003 BOOL unionp
= layout
->original_type
[-1] == _C_UNION_B
;
1005 /* Add the size of the previous field to the size of the record. */
1006 if (layout
->prev_type
)
1008 type
= objc_skip_type_qualifiers (layout
->prev_type
);
1010 layout
->record_size
= MAX (layout
->record_size
,
1011 objc_sizeof_type (type
) * BITS_PER_UNIT
);
1013 else if (*type
!= _C_BFLD
)
1014 layout
->record_size
+= objc_sizeof_type (type
) * BITS_PER_UNIT
;
1016 /* Get the bitfield's type */
1017 for (bfld_type
= type
+ 1;
1018 isdigit ((unsigned char)*bfld_type
);
1022 bfld_type_align
= objc_alignof_type (bfld_type
) * BITS_PER_UNIT
;
1023 bfld_field_size
= atoi (objc_skip_typespec (bfld_type
));
1024 layout
->record_size
+= bfld_field_size
;
1028 if ((unionp
&& *layout
->type
== _C_UNION_E
)
1029 || (!unionp
&& *layout
->type
== _C_STRUCT_E
))
1032 /* Skip the variable name if any */
1033 if (*layout
->type
== '"')
1035 for (layout
->type
++; *layout
->type
++ != '"';)
1039 type
= objc_skip_type_qualifiers (layout
->type
);
1041 if (*type
!= _C_BFLD
)
1042 desired_align
= objc_alignof_type (type
) * BITS_PER_UNIT
;
1046 /* Skip the bitfield's offset */
1047 for (bfld_type
= type
+ 1;
1048 isdigit ((unsigned char) *bfld_type
);
1052 bfld_type_align
= objc_alignof_type (bfld_type
) * BITS_PER_UNIT
;
1053 bfld_field_size
= atoi (objc_skip_typespec (bfld_type
));
1056 /* The following won't work for vectors. */
1057 #ifdef BIGGEST_FIELD_ALIGNMENT
1058 desired_align
= MIN (desired_align
, BIGGEST_FIELD_ALIGNMENT
);
1060 #ifdef ADJUST_FIELD_ALIGN
1061 desired_align
= ADJUST_FIELD_ALIGN (type
, desired_align
);
1064 /* Record must have at least as much alignment as any field.
1065 Otherwise, the alignment of the field within the record
1067 #ifndef PCC_BITFIELD_TYPE_MATTERS
1068 layout
->record_align
= MAX (layout
->record_align
, desired_align
);
1069 #else /* PCC_BITFIELD_TYPE_MATTERS */
1070 if (*type
== _C_BFLD
)
1072 /* For these machines, a zero-length field does not
1073 affect the alignment of the structure as a whole.
1074 It does, however, affect the alignment of the next field
1075 within the structure. */
1076 if (bfld_field_size
)
1077 layout
->record_align
= MAX (layout
->record_align
, desired_align
);
1079 desired_align
= objc_alignof_type (bfld_type
) * BITS_PER_UNIT
;
1081 /* A named bit field of declared type `int'
1082 forces the entire structure to have `int' alignment.
1083 Q1: How is encoded this thing and how to check for it?
1084 Q2: How to determine maximum_field_alignment at runtime? */
1086 /* if (DECL_NAME (field) != 0) */
1088 int type_align
= bfld_type_align
;
1090 if (maximum_field_alignment
!= 0)
1091 type_align
= MIN (type_align
, maximum_field_alignment
);
1092 else if (DECL_PACKED (field
))
1093 type_align
= MIN (type_align
, BITS_PER_UNIT
);
1096 layout
->record_align
= MAX (layout
->record_align
, type_align
);
1100 layout
->record_align
= MAX (layout
->record_align
, desired_align
);
1101 #endif /* PCC_BITFIELD_TYPE_MATTERS */
1103 /* Does this field automatically have alignment it needs
1104 by virtue of the fields that precede it and the record's
1107 if (*type
== _C_BFLD
)
1108 layout
->record_size
= atoi (type
+ 1);
1109 else if (layout
->record_size
% desired_align
!= 0)
1111 /* No, we need to skip space before this field.
1112 Bump the cumulative size to multiple of field alignment. */
1113 layout
->record_size
= ROUND (layout
->record_size
, desired_align
);
1116 /* Jump to the next field in record. */
1118 layout
->prev_type
= layout
->type
;
1119 layout
->type
= objc_skip_typespec (layout
->type
); /* skip component */
1125 void objc_layout_finish_structure (struct objc_struct_layout
*layout
,
1127 unsigned int *align
)
1129 BOOL unionp
= layout
->original_type
[-1] == _C_UNION_B
;
1131 && ((!unionp
&& *layout
->type
== _C_STRUCT_E
)
1132 || (unionp
&& *layout
->type
== _C_UNION_E
)))
1134 /* Work out the alignment of the record as one expression and store
1135 in the record type. Round it up to a multiple of the record's
1137 #if defined (ROUND_TYPE_ALIGN) && ! defined (__sparc__)
1138 layout
->record_align
= ROUND_TYPE_ALIGN (layout
->original_type
-1,
1140 layout
->record_align
);
1142 layout
->record_align
= MAX (1, layout
->record_align
);
1145 #ifdef ROUND_TYPE_SIZE
1146 layout
->record_size
= ROUND_TYPE_SIZE (layout
->original_type
,
1147 layout
->record_size
,
1148 layout
->record_align
);
1150 /* Round the size up to be a multiple of the required alignment */
1151 layout
->record_size
= ROUND (layout
->record_size
, layout
->record_align
);
1154 layout
->type
= NULL
;
1157 *size
= layout
->record_size
/ BITS_PER_UNIT
;
1159 *align
= layout
->record_align
/ BITS_PER_UNIT
;
1163 void objc_layout_structure_get_info (struct objc_struct_layout
*layout
,
1164 unsigned int *offset
,
1165 unsigned int *align
,
1169 *offset
= layout
->record_size
/ BITS_PER_UNIT
;
1171 *align
= layout
->record_align
/ BITS_PER_UNIT
;
1173 *type
= layout
->prev_type
;