2 * Copyright (c) 2009 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
29 * WARNING DANGER HAZARD BEWARE EEK
31 * Everything in this file is for Apple Internal use only.
32 * These will change in arbitrary OS updates and in unpredictable ways.
33 * When your program breaks, you get to keep both pieces.
37 * objc-abi.h: Declarations for functions used by compiler codegen.
40 #include <malloc/malloc.h>
41 #include <objc/objc.h>
42 #include <objc/runtime.h>
43 #include <objc/message.h>
45 /* Runtime startup. */
47 // Old static initializer. Used by old crt1.o and old bug workarounds.
48 OBJC_EXPORT
void _objcInit(void)
49 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
53 // Description of an Objective-C image.
54 // __DATA,__objc_imageinfo stores one of these.
55 typedef struct objc_image_info
{
56 uint32_t version
; // currently 0
60 // Values for objc_image_info.flags
61 #define OBJC_IMAGE_IS_REPLACEMENT (1<<0)
62 #define OBJC_IMAGE_SUPPORTS_GC (1<<1)
63 #define OBJC_IMAGE_REQUIRES_GC (1<<2)
64 #define OBJC_IMAGE_OPTIMIZED_BY_DYLD (1<<3)
65 #define OBJC_IMAGE_SUPPORTS_COMPACTION (1<<4) // might be re-assignable
70 // Read or write an object property. Not all object properties use these.
71 OBJC_EXPORT id
objc_getProperty(id self
, SEL _cmd
, ptrdiff_t offset
, BOOL atomic
)
72 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
73 OBJC_EXPORT
void objc_setProperty(id self
, SEL _cmd
, ptrdiff_t offset
, id newValue
, BOOL atomic
, signed char shouldCopy
)
74 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
76 OBJC_EXPORT
void objc_setProperty_atomic(id self
, SEL _cmd
, id newValue
, ptrdiff_t offset
)
77 __OSX_AVAILABLE_STARTING(__MAC_10_8
, __IPHONE_6_0
)
79 OBJC_EXPORT
void objc_setProperty_nonatomic(id self
, SEL _cmd
, id newValue
, ptrdiff_t offset
)
80 __OSX_AVAILABLE_STARTING(__MAC_10_8
, __IPHONE_6_0
)
82 OBJC_EXPORT
void objc_setProperty_atomic_copy(id self
, SEL _cmd
, id newValue
, ptrdiff_t offset
)
83 __OSX_AVAILABLE_STARTING(__MAC_10_8
, __IPHONE_6_0
)
85 OBJC_EXPORT
void objc_setProperty_nonatomic_copy(id self
, SEL _cmd
, id newValue
, ptrdiff_t offset
)
86 __OSX_AVAILABLE_STARTING(__MAC_10_8
, __IPHONE_6_0
)
90 // Read or write a non-object property. Not all uses are C structs,
91 // and not all C struct properties use this.
92 OBJC_EXPORT
void objc_copyStruct(void *dest
, const void *src
, ptrdiff_t size
, BOOL atomic
, BOOL hasStrong
)
93 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
95 // Perform a copy of a C++ object using striped locks. Used by non-POD C++ typed atomic properties.
96 OBJC_EXPORT
void objc_copyCppObjectAtomic(void *dest
, const void *src
, void (*copyHelper
) (void *dest
, const void *source
))
97 __OSX_AVAILABLE_STARTING(__MAC_10_8
, __IPHONE_6_0
);
101 OBJC_EXPORT IMP _objc_empty_vtable
102 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
104 OBJC_EXPORT
struct objc_cache _objc_empty_cache
105 __OSX_AVAILABLE_STARTING(__MAC_10_0
, __IPHONE_2_0
);
111 // objc_msgSendSuper2() takes the current search class, not its superclass.
112 OBJC_EXPORT id
objc_msgSendSuper2(struct objc_super
*super
, SEL op
, ...)
113 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
114 OBJC_EXPORT
void objc_msgSendSuper2_stret(struct objc_super
*super
, SEL op
,...)
115 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
)
116 OBJC_ARM64_UNAVAILABLE
;
118 // objc_msgSend_noarg() may be faster for methods with no additional arguments.
119 OBJC_EXPORT id
objc_msgSend_noarg(id self
, SEL _cmd
)
120 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
124 // Debug messengers. Messengers used by the compiler have a debug flavor that
125 // may perform extra sanity checking.
126 // Old objc_msgSendSuper() does not have a debug version; this is OBJC2 only.
127 // *_fixup() do not have debug versions; use non-fixup only for debug mode.
128 OBJC_EXPORT id
objc_msgSend_debug(id self
, SEL op
, ...)
129 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
130 OBJC_EXPORT id
objc_msgSendSuper2_debug(struct objc_super
*super
, SEL op
, ...)
131 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
132 OBJC_EXPORT
void objc_msgSend_stret_debug(id self
, SEL op
, ...)
133 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
)
134 OBJC_ARM64_UNAVAILABLE
;
135 OBJC_EXPORT
void objc_msgSendSuper2_stret_debug(struct objc_super
*super
, SEL op
,...)
136 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
)
137 OBJC_ARM64_UNAVAILABLE
;
139 # if defined(__i386__)
140 OBJC_EXPORT
double objc_msgSend_fpret_debug(id self
, SEL op
, ...)
141 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
142 # elif defined(__x86_64__)
143 OBJC_EXPORT
long double objc_msgSend_fpret_debug(id self
, SEL op
, ...)
144 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
145 # if __STDC_VERSION__ >= 199901L
146 OBJC_EXPORT _Complex
long double objc_msgSend_fp2ret_debug(id self
, SEL op
, ...)
147 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
149 OBJC_EXPORT
void objc_msgSend_fp2ret_debug(id self
, SEL op
, ...)
150 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);
156 #if defined(__x86_64__) && TARGET_OS_MAC && !TARGET_IPHONE_SIMULATOR
157 // objc_msgSend_fixup() is used for vtable-dispatchable call sites.
158 OBJC_EXPORT
void objc_msgSend_fixup(void)
159 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5
, __MAC_10_8
, __IPHONE_NA
, __IPHONE_NA
);
160 OBJC_EXPORT
void objc_msgSend_stret_fixup(void)
161 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5
, __MAC_10_8
, __IPHONE_NA
, __IPHONE_NA
);
162 OBJC_EXPORT
void objc_msgSendSuper2_fixup(void)
163 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5
, __MAC_10_8
, __IPHONE_NA
, __IPHONE_NA
);
164 OBJC_EXPORT
void objc_msgSendSuper2_stret_fixup(void)
165 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5
, __MAC_10_8
, __IPHONE_NA
, __IPHONE_NA
);
166 OBJC_EXPORT
void objc_msgSend_fpret_fixup(void)
167 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5
, __MAC_10_8
, __IPHONE_NA
, __IPHONE_NA
);
168 OBJC_EXPORT
void objc_msgSend_fp2ret_fixup(void)
169 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5
, __MAC_10_8
, __IPHONE_NA
, __IPHONE_NA
);
172 /* C++-compatible exception handling. */
175 // fixme these conflict with C++ compiler's internal definitions
176 #if !defined(__cplusplus)
178 // Vtable for C++ exception typeinfo for Objective-C types.
179 OBJC_EXPORT
const void *objc_ehtype_vtable
[]
180 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
182 // C++ exception typeinfo for type `id`.
183 OBJC_EXPORT
struct objc_typeinfo OBJC_EHTYPE_id
184 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
188 // Exception personality function for Objective-C and Objective-C++ code.
189 struct _Unwind_Exception
;
190 struct _Unwind_Context
;
192 __objc_personality_v0(int version
,
194 uint64_t exceptionClass
,
195 struct _Unwind_Exception
*exceptionObject
,
196 struct _Unwind_Context
*context
)
197 __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
);
203 OBJC_EXPORT id
objc_retainBlock(id
)
204 __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_5_0
);