]> git.saurik.com Git - apple/objc4.git/blobdiff - runtime/objc-abi.h
objc4-818.2.tar.gz
[apple/objc4.git] / runtime / objc-abi.h
index 7d9e89e006f269b12512aaf5e330d3aa4feffcb1..937a4be54c27ddf485a7ece2e6f5ef71c3da7175 100644 (file)
 #include <objc/runtime.h>
 #include <objc/message.h>
 
+/* Linker metadata symbols */
+
+// NSObject was in Foundation/CF on macOS < 10.8.
+#if TARGET_OS_OSX && (__x86_64__ || __i386__)
+#if __OBJC2__
+
+OBJC_EXPORT const char __objc_nsobject_class_10_5
+    __asm__("$ld$hide$os10.5$_OBJC_CLASS_$_NSObject");
+OBJC_EXPORT const char __objc_nsobject_class_10_6
+    __asm__("$ld$hide$os10.6$_OBJC_CLASS_$_NSObject");
+OBJC_EXPORT const char __objc_nsobject_class_10_7
+    __asm__("$ld$hide$os10.7$_OBJC_CLASS_$_NSObject");
+
+OBJC_EXPORT const char __objc_nsobject_metaclass_10_5
+    __asm__("$ld$hide$os10.5$_OBJC_METACLASS_$_NSObject");
+OBJC_EXPORT const char __objc_nsobject_metaclass_10_6
+    __asm__("$ld$hide$os10.6$_OBJC_METACLASS_$_NSObject");
+OBJC_EXPORT const char __objc_nsobject_metaclass_10_7
+    __asm__("$ld$hide$os10.7$_OBJC_METACLASS_$_NSObject");
+
+OBJC_EXPORT const char __objc_nsobject_isa_10_5
+    __asm__("$ld$hide$os10.5$_OBJC_IVAR_$_NSObject.isa");
+OBJC_EXPORT const char __objc_nsobject_isa_10_6
+    __asm__("$ld$hide$os10.6$_OBJC_IVAR_$_NSObject.isa");
+OBJC_EXPORT const char __objc_nsobject_isa_10_7
+    __asm__("$ld$hide$os10.7$_OBJC_IVAR_$_NSObject.isa");
+
+#else
+
+OBJC_EXPORT const char __objc_nsobject_class_10_5
+    __asm__("$ld$hide$os10.5$.objc_class_name_NSObject");
+OBJC_EXPORT const char __objc_nsobject_class_10_6
+    __asm__("$ld$hide$os10.6$.objc_class_name_NSObject");
+OBJC_EXPORT const char __objc_nsobject_class_10_7
+    __asm__("$ld$hide$os10.7$.objc_class_name_NSObject");
+
+#endif
+#endif
+
 /* Runtime startup. */
 
 // Old static initializer. Used by old crt1.o and old bug workarounds.
-OBJC_EXPORT void _objcInit(void)
-    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0);
+OBJC_EXPORT void
+_objcInit(void)
+    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);
 
 /* Images */
 
@@ -60,6 +100,7 @@ typedef struct objc_image_info {
 #if __cplusplus >= 201103L
   private:
     enum : uint32_t {
+        // 1 byte assorted flags
         IsReplacement       = 1<<0,  // used for Fix&Continue, now ignored
         SupportsGC          = 1<<1,  // image supports GC
         RequiresGC          = 1<<2,  // image requires GC
@@ -67,17 +108,28 @@ typedef struct objc_image_info {
         CorrectedSynthesize = 1<<4,  // used for an old workaround, now ignored
         IsSimulated         = 1<<5,  // image compiled for a simulator platform
         HasCategoryClassProperties  = 1<<6,  // class properties in category_t
+        OptimizedByDyldClosure = 1 << 7, // dyld (not the shared cache) optimized this.
 
-        SwiftVersionMaskShift = 8,
-        SwiftVersionMask    = 0xff << SwiftVersionMaskShift  // Swift ABI version
+        // 1 byte Swift unstable ABI version number
+        SwiftUnstableVersionMaskShift = 8,
+        SwiftUnstableVersionMask = 0xff << SwiftUnstableVersionMaskShift,
 
+        // 2 byte Swift stable ABI version number
+        SwiftStableVersionMaskShift = 16,
+        SwiftStableVersionMask = 0xffffUL << SwiftStableVersionMaskShift
     };
-   public:
+  public:
     enum : uint32_t {
+        // Values for SwiftUnstableVersion
+        // All stable ABIs store SwiftVersion5 here.
         SwiftVersion1   = 1,
         SwiftVersion1_2 = 2,
         SwiftVersion2   = 3,
-        SwiftVersion3   = 4
+        SwiftVersion3   = 4,
+        SwiftVersion4   = 5,
+        SwiftVersion4_1 = 6,
+        SwiftVersion4_2 = 6,  // [sic]
+        SwiftVersion5   = 7
     };
 
   public:
@@ -86,8 +138,9 @@ typedef struct objc_image_info {
     bool requiresGC()      const { return flags & RequiresGC; }
     bool optimizedByDyld() const { return flags & OptimizedByDyld; }
     bool hasCategoryClassProperties() const { return flags & HasCategoryClassProperties; }
-    bool containsSwift()   const { return (flags & SwiftVersionMask) != 0; }
-    uint32_t swiftVersion() const { return (flags & SwiftVersionMask) >> SwiftVersionMaskShift; }
+    bool optimizedByDyldClosure() const { return flags & OptimizedByDyldClosure; }
+    bool containsSwift()   const { return (flags & SwiftUnstableVersionMask) != 0; }
+    uint32_t swiftUnstableVersion() const { return (flags & SwiftUnstableVersionMask) >> SwiftUnstableVersionMaskShift; }
 #endif
 } objc_image_info;
 
@@ -118,56 +171,91 @@ HasClassProperties:
    Old ABI: Set by some compilers. Not used by the runtime.
 */
 
+// Description of an expected duplicate class name.
+// __DATA,__objc_dupclass stores one of these. Only the main image is
+// consulted for these purposes.
+typedef struct _objc_duplicate_class {
+    uint32_t version;
+    uint32_t flags;
+    const char name[64];
+} objc_duplicate_class;
+#define OBJC_HAS_DUPLICATE_CLASS 1
 
 /* Properties */
 
 // Read or write an object property. Not all object properties use these.
-OBJC_EXPORT id objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic)
-    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);
-OBJC_EXPORT void objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id newValue, BOOL atomic, signed char shouldCopy)
-    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);
+OBJC_EXPORT id _Nullable
+objc_getProperty(id _Nullable self, SEL _Nonnull _cmd,
+                 ptrdiff_t offset, BOOL atomic)
+    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
+
+OBJC_EXPORT void
+objc_setProperty(id _Nullable self, SEL _Nonnull _cmd, ptrdiff_t offset,
+                 id _Nullable newValue, BOOL atomic, signed char shouldCopy)
+    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
+
+OBJC_EXPORT void
+objc_setProperty_atomic(id _Nullable self, SEL _Nonnull _cmd,
+                        id _Nullable newValue, ptrdiff_t offset)
+    OBJC_AVAILABLE(10.8, 6.0, 9.0, 1.0, 2.0);
 
-OBJC_EXPORT void objc_setProperty_atomic(id self, SEL _cmd, id newValue, ptrdiff_t offset)
-    OBJC_AVAILABLE(10.8, 6.0, 9.0, 1.0);
-OBJC_EXPORT void objc_setProperty_nonatomic(id self, SEL _cmd, id newValue, ptrdiff_t offset)
-    OBJC_AVAILABLE(10.8, 6.0, 9.0, 1.0);
-OBJC_EXPORT void objc_setProperty_atomic_copy(id self, SEL _cmd, id newValue, ptrdiff_t offset)
-    OBJC_AVAILABLE(10.8, 6.0, 9.0, 1.0);
-OBJC_EXPORT void objc_setProperty_nonatomic_copy(id self, SEL _cmd, id newValue, ptrdiff_t offset)
-    OBJC_AVAILABLE(10.8, 6.0, 9.0, 1.0);
+OBJC_EXPORT void
+objc_setProperty_nonatomic(id _Nullable self, SEL _Nonnull _cmd,
+                           id _Nullable newValue, ptrdiff_t offset)
+    OBJC_AVAILABLE(10.8, 6.0, 9.0, 1.0, 2.0);
+
+OBJC_EXPORT void
+objc_setProperty_atomic_copy(id _Nullable self, SEL _Nonnull _cmd,
+                             id _Nullable newValue, ptrdiff_t offset)
+    OBJC_AVAILABLE(10.8, 6.0, 9.0, 1.0, 2.0);
+
+OBJC_EXPORT void
+objc_setProperty_nonatomic_copy(id _Nullable self, SEL _Nonnull _cmd,
+                                id _Nullable newValue, ptrdiff_t offset)
+    OBJC_AVAILABLE(10.8, 6.0, 9.0, 1.0, 2.0);
 
 
 // Read or write a non-object property. Not all uses are C structs, 
 // and not all C struct properties use this.
-OBJC_EXPORT void objc_copyStruct(void *dest, const void *src, ptrdiff_t size, BOOL atomic, BOOL hasStrong)
-    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);
+OBJC_EXPORT void
+objc_copyStruct(void * _Nonnull dest, const void * _Nonnull src,
+                ptrdiff_t size, BOOL atomic, BOOL hasStrong)
+    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
 
 // Perform a copy of a C++ object using striped locks. Used by non-POD C++ typed atomic properties.
-OBJC_EXPORT void objc_copyCppObjectAtomic(void *dest, const void *src, void (*copyHelper) (void *dest, const void *source))
-    OBJC_AVAILABLE(10.8, 6.0, 9.0, 1.0);
+OBJC_EXPORT void
+objc_copyCppObjectAtomic(void * _Nonnull dest, const void * _Nonnull src,
+                         void (* _Nonnull copyHelper)
+                           (void * _Nonnull dest, const void * _Nonnull source))
+    OBJC_AVAILABLE(10.8, 6.0, 9.0, 1.0, 2.0);
 
 /* Classes. */
 #if __OBJC2__
-OBJC_EXPORT IMP _objc_empty_vtable
-    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);
+OBJC_EXPORT IMP _Nonnull _objc_empty_vtable
+    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
 #endif
 OBJC_EXPORT struct objc_cache _objc_empty_cache
-    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0);
+    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);
 
 
 /* Messages */
 
 #if __OBJC2__
 // objc_msgSendSuper2() takes the current search class, not its superclass.
-OBJC_EXPORT id objc_msgSendSuper2(struct objc_super *super, SEL op, ...)
-    OBJC_AVAILABLE(10.6, 2.0, 9.0, 1.0);
-OBJC_EXPORT void objc_msgSendSuper2_stret(struct objc_super *super, SEL op,...)
-    OBJC_AVAILABLE(10.6, 2.0, 9.0, 1.0)
+OBJC_EXPORT id _Nullable
+objc_msgSendSuper2(struct objc_super * _Nonnull super, SEL _Nonnull op, ...)
+    OBJC_AVAILABLE(10.6, 2.0, 9.0, 1.0, 2.0);
+
+OBJC_EXPORT void
+objc_msgSendSuper2_stret(struct objc_super * _Nonnull super,
+                         SEL _Nonnull op,...)
+    OBJC_AVAILABLE(10.6, 2.0, 9.0, 1.0, 2.0)
     OBJC_ARM64_UNAVAILABLE;
 
 // objc_msgSend_noarg() may be faster for methods with no additional arguments.
-OBJC_EXPORT id objc_msgSend_noarg(id self, SEL _cmd)
-    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0);
+OBJC_EXPORT id _Nullable
+objc_msgSend_noarg(id _Nullable self, SEL _Nonnull _cmd)
+    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0);
 #endif
 
 #if __OBJC2__
@@ -175,29 +263,42 @@ OBJC_EXPORT id objc_msgSend_noarg(id self, SEL _cmd)
 // may perform extra sanity checking. 
 // Old objc_msgSendSuper() does not have a debug version; this is OBJC2 only.
 // *_fixup() do not have debug versions; use non-fixup only for debug mode.
-OBJC_EXPORT id objc_msgSend_debug(id self, SEL op, ...)
-    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0);
-OBJC_EXPORT id objc_msgSendSuper2_debug(struct objc_super *super, SEL op, ...)
-    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0);
-OBJC_EXPORT void objc_msgSend_stret_debug(id self, SEL op, ...)
-    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0)
+OBJC_EXPORT id _Nullable
+objc_msgSend_debug(id _Nullable self, SEL _Nonnull op, ...)
+    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0);
+
+OBJC_EXPORT id _Nullable
+objc_msgSendSuper2_debug(struct objc_super * _Nonnull super,
+                         SEL _Nonnull op, ...)
+    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0);
+
+OBJC_EXPORT void
+objc_msgSend_stret_debug(id _Nullable self, SEL _Nonnull op, ...)
+    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0)
     OBJC_ARM64_UNAVAILABLE;
-OBJC_EXPORT void objc_msgSendSuper2_stret_debug(struct objc_super *super, SEL op,...)
-    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0)
+
+OBJC_EXPORT void
+objc_msgSendSuper2_stret_debug(struct objc_super * _Nonnull super,
+                               SEL _Nonnull op,...)
+    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0)
     OBJC_ARM64_UNAVAILABLE;
 
 # if defined(__i386__)
-OBJC_EXPORT double objc_msgSend_fpret_debug(id self, SEL op, ...)
-    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0);
+OBJC_EXPORT double
+objc_msgSend_fpret_debug(id _Nullable self, SEL _Nonnull op, ...)
+    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0);
 # elif defined(__x86_64__)
-OBJC_EXPORT long double objc_msgSend_fpret_debug(id self, SEL op, ...)
-    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0);
+OBJC_EXPORT long double
+objc_msgSend_fpret_debug(id _Nullable self, SEL _Nonnull op, ...)
+    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0);
 #  if __STDC_VERSION__ >= 199901L
-OBJC_EXPORT _Complex long double objc_msgSend_fp2ret_debug(id self, SEL op, ...)
-    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0);
+OBJC_EXPORT _Complex long double
+objc_msgSend_fp2ret_debug(id _Nullable self, SEL _Nonnull op, ...)
+    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0);
 #  else
-OBJC_EXPORT void objc_msgSend_fp2ret_debug(id self, SEL op, ...)
-    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0);
+OBJC_EXPORT void
+objc_msgSend_fp2ret_debug(id _Nullable self, SEL _Nonnull op, ...)
+    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0);
 #  endif
 # endif
 
@@ -219,66 +320,80 @@ OBJC_EXPORT void objc_msgSend_fp2ret_debug(id self, SEL op, ...)
 // - Red zone is not preserved.
 // See each architecture's implementation for details.
 
-OBJC_EXPORT void objc_msgLookup(void)
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0);
-OBJC_EXPORT void objc_msgLookupSuper2(void)
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0);
-OBJC_EXPORT void objc_msgLookup_stret(void)
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0)
+OBJC_EXPORT void
+objc_msgLookup(void)
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0);
+
+OBJC_EXPORT void
+objc_msgLookupSuper2(void)
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0);
+
+OBJC_EXPORT void
+objc_msgLookup_stret(void)
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0)
     OBJC_ARM64_UNAVAILABLE;
-OBJC_EXPORT void objc_msgLookupSuper2_stret(void)
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0)
+
+OBJC_EXPORT void
+objc_msgLookupSuper2_stret(void)
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0)
     OBJC_ARM64_UNAVAILABLE;
 
 # if defined(__i386__)
-OBJC_EXPORT void objc_msgLookup_fpret(void)
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0);
+OBJC_EXPORT void
+objc_msgLookup_fpret(void)
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0);
+
 # elif defined(__x86_64__)
-OBJC_EXPORT void objc_msgLookup_fpret(void)
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0);
-OBJC_EXPORT void objc_msgLookup_fp2ret(void)
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0);
+OBJC_EXPORT void
+objc_msgLookup_fpret(void)
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0);
+
+OBJC_EXPORT void
+objc_msgLookup_fp2ret(void)
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0);
 # endif
 
 #endif
 
-#if TARGET_OS_OSX  &&  defined(__x86_64__)
-// objc_msgSend_fixup() is used for vtable-dispatchable call sites.
-OBJC_EXPORT void objc_msgSend_fixup(void)
-    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized") 
-    __IOS_UNAVAILABLE __TVOS_UNAVAILABLE __WATCHOS_UNAVAILABLE;
-OBJC_EXPORT void objc_msgSend_stret_fixup(void)
-    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized") 
-    __IOS_UNAVAILABLE __TVOS_UNAVAILABLE __WATCHOS_UNAVAILABLE;
-OBJC_EXPORT void objc_msgSendSuper2_fixup(void)
-    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized") 
-    __IOS_UNAVAILABLE __TVOS_UNAVAILABLE __WATCHOS_UNAVAILABLE;
-OBJC_EXPORT void objc_msgSendSuper2_stret_fixup(void)
-    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized") 
-    __IOS_UNAVAILABLE __TVOS_UNAVAILABLE __WATCHOS_UNAVAILABLE;
-OBJC_EXPORT void objc_msgSend_fpret_fixup(void)
-    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized") 
-    __IOS_UNAVAILABLE __TVOS_UNAVAILABLE __WATCHOS_UNAVAILABLE;
-OBJC_EXPORT void objc_msgSend_fp2ret_fixup(void)
-    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized") 
-    __IOS_UNAVAILABLE __TVOS_UNAVAILABLE __WATCHOS_UNAVAILABLE;
+#if (TARGET_OS_OSX || TARGET_OS_SIMULATOR)  &&  defined(__x86_64__)
+// objc_msgSend_fixup() was used for vtable-dispatchable call sites.
+// The symbols remain exported on macOS for binary compatibility.
+// The symbols can probably be removed from iOS simulator but we haven't tried.
+OBJC_EXPORT void
+objc_msgSend_fixup(void)
+    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized");
+
+OBJC_EXPORT void
+objc_msgSend_stret_fixup(void)
+    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized");
+
+OBJC_EXPORT void
+objc_msgSendSuper2_fixup(void)
+    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized");
+
+OBJC_EXPORT void
+objc_msgSendSuper2_stret_fixup(void)
+    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized");
+
+OBJC_EXPORT void
+objc_msgSend_fpret_fixup(void)
+    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized");
+
+OBJC_EXPORT void
+objc_msgSend_fp2ret_fixup(void)
+    __OSX_DEPRECATED(10.5, 10.8, "fixup dispatch is no longer optimized");
 #endif
 
 /* C++-compatible exception handling. */
 #if __OBJC2__
 
-// fixme these conflict with C++ compiler's internal definitions
-#if !defined(__cplusplus)
-
 // Vtable for C++ exception typeinfo for Objective-C types.
-OBJC_EXPORT const void *objc_ehtype_vtable[]
-    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);
+OBJC_EXPORT const void * _Nullable objc_ehtype_vtable[]
+    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
 
 // C++ exception typeinfo for type `id`.
 OBJC_EXPORT struct objc_typeinfo OBJC_EHTYPE_id
-    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);
-
-#endif
+    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
 
 // Exception personality function for Objective-C and Objective-C++ code.
 struct _Unwind_Exception;
@@ -287,16 +402,17 @@ OBJC_EXPORT int
 __objc_personality_v0(int version,
                       int actions,
                       uint64_t exceptionClass,
-                      struct _Unwind_Exception *exceptionObject,
-                      struct _Unwind_Context *context)
-    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);
+                      struct _Unwind_Exception * _Nonnull exceptionObject,
+                      struct _Unwind_Context * _Nonnull context)
+    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
 
 #endif
 
 /* ARC */
 
-OBJC_EXPORT id objc_retainBlock(id)
-    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0);
+OBJC_EXPORT id _Nullable
+objc_retainBlock(id _Nullable)
+    OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0);
 
 
 /* Non-pointer isa */
@@ -305,7 +421,7 @@ OBJC_EXPORT id objc_retainBlock(id)
 
 // Extract class pointer from an isa field.
     
-#if  TARGET_OS_SIMULATOR
+#if TARGET_OS_SIMULATOR && !TARGET_OS_MACCATALYST && !__arm64__
     // No simulators use nonpointer isa yet.
     
 #elif __LP64__
@@ -315,9 +431,9 @@ OBJC_EXPORT id objc_retainBlock(id)
 // Packed-isa version. This one is used directly by Swift code.
 // (Class)(isa & (uintptr_t)&objc_absolute_packed_isa_class_mask) == class ptr
 OBJC_EXPORT const struct { char c; } objc_absolute_packed_isa_class_mask
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0);
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0);
 
-#elif __ARM_ARCH_7K__ >= 2
+#elif (__ARM_ARCH_7K__ >= 2  ||  (__arm64__ && !__LP64__))
 #   define OBJC_HAVE_NONPOINTER_ISA 1
 #   define OBJC_HAVE_INDEXED_NONPOINTER_ISA 1
 
@@ -329,18 +445,42 @@ OBJC_EXPORT const struct { char c; } objc_absolute_packed_isa_class_mask
 //     cls = (Class)isa;
 // }
 OBJC_EXPORT const struct { char c; } objc_absolute_indexed_isa_magic_mask
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0);
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0);
 OBJC_EXPORT const struct { char c; } objc_absolute_indexed_isa_magic_value
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0);
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0);
 OBJC_EXPORT const struct { char c; } objc_absolute_indexed_isa_index_mask
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0);
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0);
 OBJC_EXPORT const struct { char c; } objc_absolute_indexed_isa_index_shift
-    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0);
+    OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0);
+
+#endif
 
 #endif
 
-// OBJC2
+
+/* Object class */
+
+// This symbol might be required for binary compatibility, so we
+// declare it here where TAPI will see it.
+#if __OBJC__  &&  __OBJC2__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
+#if !defined(OBJC_DECLARE_SYMBOLS)
+__OSX_AVAILABLE(10.0)
+__IOS_UNAVAILABLE __TVOS_UNAVAILABLE
+__WATCHOS_UNAVAILABLE
+#   ifndef __APPLE_BLEACH_SDK__
+__BRIDGEOS_UNAVAILABLE
+#   endif
+#endif
+OBJC_ROOT_CLASS
+@interface Object {
+    Class isa;
+}
+@end
+#pragma clang diagnostic pop
 #endif
 
+
 // _OBJC_ABI_H
 #endif