]> git.saurik.com Git - apple/objc4.git/blob - runtime/objc-abi.h
809416ce4fbfd42c6d95d2cf80754a15ba19e2eb
[apple/objc4.git] / runtime / objc-abi.h
1 /*
2 * Copyright (c) 2009 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
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
11 * file.
12 *
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.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24
25 #ifndef _OBJC_ABI_H
26 #define _OBJC_ABI_H
27
28 /*
29 * WARNING DANGER HAZARD BEWARE EEK
30 *
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.
34 */
35
36 /*
37 * objc-abi.h: Declarations for functions used by compiler codegen.
38 */
39
40 #include <malloc/malloc.h>
41 #include <objc/objc.h>
42 #include <objc/runtime.h>
43 #include <objc/message.h>
44
45 /* Runtime startup. */
46
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);
50
51 /* Images */
52
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
57 uint32_t flags;
58 } objc_image_info;
59
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
66
67
68 /* Properties */
69
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);
75
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)
78 OBJC_GC_UNAVAILABLE;
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)
81 OBJC_GC_UNAVAILABLE;
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)
84 OBJC_GC_UNAVAILABLE;
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)
87 OBJC_GC_UNAVAILABLE;
88
89
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);
94
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);
98
99 /* Classes. */
100 #if __OBJC2__
101 OBJC_EXPORT IMP _objc_empty_vtable
102 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
103 #endif
104 OBJC_EXPORT struct objc_cache _objc_empty_cache
105 __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
106
107
108 /* Messages */
109
110 #if __OBJC2__
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;
117
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);
121 #endif
122
123 #if __OBJC2__
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;
138
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);
148 # else
149 OBJC_EXPORT void objc_msgSend_fp2ret_debug(id self, SEL op, ...)
150 __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0);
151 # endif
152 # endif
153
154 #endif
155
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);
170 #endif
171
172 /* C++-compatible exception handling. */
173 #if __OBJC2__
174
175 // fixme these conflict with C++ compiler's internal definitions
176 #if !defined(__cplusplus)
177
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);
181
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);
185
186 #endif
187
188 // Exception personality function for Objective-C and Objective-C++ code.
189 struct _Unwind_Exception;
190 struct _Unwind_Context;
191 OBJC_EXPORT int
192 __objc_personality_v0(int version,
193 int actions,
194 uint64_t exceptionClass,
195 struct _Unwind_Exception *exceptionObject,
196 struct _Unwind_Context *context)
197 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
198
199 #endif
200
201 /* ARR */
202
203 OBJC_EXPORT id objc_retainBlock(id)
204 __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0);
205
206 #endif