+OBJC_EXPORT NXHashTable * _Nullable _objc_debug_class_hash
+ __OSX_AVAILABLE(10.2)
+ __IOS_UNAVAILABLE __TVOS_UNAVAILABLE
+ __WATCHOS_UNAVAILABLE __BRIDGEOS_UNAVAILABLE;
+
+#endif
+
+
+/***********************************************************************
+* Non-pointer isa
+**********************************************************************/
+
+#if __OBJC2__
+
+// Extract isa pointer from an isa field.
+// (Class)(isa & mask) == class pointer
+OBJC_EXPORT const uintptr_t objc_debug_isa_class_mask
+ OBJC_AVAILABLE(10.10, 7.0, 9.0, 1.0, 2.0);
+
+// Extract magic cookie from an isa field.
+// (isa & magic_mask) == magic_value
+OBJC_EXPORT const uintptr_t objc_debug_isa_magic_mask
+ OBJC_AVAILABLE(10.10, 7.0, 9.0, 1.0, 2.0);
+OBJC_EXPORT const uintptr_t objc_debug_isa_magic_value
+ OBJC_AVAILABLE(10.10, 7.0, 9.0, 1.0, 2.0);
+
+// Use indexed ISAs for targets which store index of the class in the ISA.
+// This index can be used to index the array of classes.
+OBJC_EXPORT const uintptr_t objc_debug_indexed_isa_magic_mask;
+OBJC_EXPORT const uintptr_t objc_debug_indexed_isa_magic_value;
+
+// Then these are used to extract the index from the ISA.
+OBJC_EXPORT const uintptr_t objc_debug_indexed_isa_index_mask;
+OBJC_EXPORT const uintptr_t objc_debug_indexed_isa_index_shift;
+
+// And then we can use that index to get the class from this array. Note
+// the size is provided so that clients can ensure the index they get is in
+// bounds and not read off the end of the array.
+OBJC_EXPORT Class _Nullable objc_indexed_classes[];
+
+// When we don't have enough bits to store a class*, we can instead store an
+// index in to this array. Classes are added here when they are realized.
+// Note, an index of 0 is illegal.
+OBJC_EXPORT uintptr_t objc_indexed_classes_count;
+
+// Absolute symbols for some of the above values are in objc-abi.h.
+
+#endif
+
+
+/***********************************************************************
+* Class structure decoding
+**********************************************************************/
+#if __OBJC2__
+
+// Mask for the pointer from class struct to class rw data.
+// Other bits may be used for flags.
+// Use 0x00007ffffffffff8UL or 0xfffffffcUL when this variable is unavailable.
+OBJC_EXPORT const uintptr_t objc_debug_class_rw_data_mask
+ OBJC_AVAILABLE(10.13, 11.0, 11.0, 4.0, 2.0);
+
+// The ABI version for the internal runtime representations
+// lldb, CoreSymbolication and debugging tools need to know
+OBJC_EXTERN const uint32_t objc_class_abi_version
+ OBJC_AVAILABLE(10.15, 13.0, 13.0, 6.0, 5.0);
+
+// the maximum ABI version in existence for now
+#define OBJC_CLASS_ABI_VERSION_MAX 1
+
+// Used when objc_class_abi_version is absent or 0
+struct class_rw_v0_t {
+ uint32_t flags;
+ uint32_t version;
+ uintptr_t ro; // class_ro_t
+ uintptr_t methods; // method_array_t
+ uintptr_t properties; // property_array_t
+ uintptr_t protocols; // protocol_array_t
+ Class _Nullable firstSubclass;
+ Class _Nullable nextSiblingClass;
+ char *_Nullable demangledName;
+
+ // uint32_t index; // only when indexed-isa is used
+};
+
+// Used when objc_class_abi_version is 1
+struct class_rw_v1_t {
+ uint32_t flags;
+ uint16_t witness;
+ uint16_t index; // only when indexed-isa is used
+ uintptr_t ro_or_rw_ext; // tagged union based on the low bit:
+ // 0: class_ro_t 1: class_rw_ext_t
+ Class _Nullable firstSubclass;
+ Class _Nullable nextSiblingClass;
+};
+
+struct class_rw_ext_v1_t {
+ uintptr_t ro; // class_ro_t
+ uintptr_t methods; // method_array_t
+ uintptr_t properties; // property_array_t
+ uintptr_t protocols; // protocol_array_t
+ char *_Nullable demangledName;
+ uint32_t version;
+};