@@ -79,6 +79,16 @@ struct RuntimeTarget<4> {
7979 using StoredSize = uint32_t ;
8080 using StoredPointerDifference = int32_t ;
8181 static constexpr size_t PointerSize = 4 ;
82+
83+ #if SWIFT_OBJC_INTEROP
84+ static constexpr bool ObjCInterop = true ;
85+ template <typename T>
86+ using TargetAnyClassMetadata = TargetAnyClassMetadataObjCInterop<T>;
87+ #else
88+ static constexpr bool ObjCInterop = false ;
89+ template <typename T>
90+ using TargetAnyClassMetadata = TargetAnyClassMetadata<T>;
91+ #endif
8292};
8393
8494template <>
@@ -91,6 +101,16 @@ struct RuntimeTarget<8> {
91101 using StoredSize = uint64_t ;
92102 using StoredPointerDifference = int64_t ;
93103 static constexpr size_t PointerSize = 8 ;
104+
105+ #if SWIFT_OBJC_INTEROP
106+ static constexpr bool ObjCInterop = true ;
107+ template <typename T>
108+ using TargetAnyClassMetadata = TargetAnyClassMetadataObjCInterop<T>;
109+ #else
110+ static constexpr bool ObjCInterop = false ;
111+ template <typename T>
112+ using TargetAnyClassMetadata = TargetAnyClassMetadata<T>;
113+ #endif
94114};
95115
96116namespace reflection {
@@ -540,6 +560,14 @@ namespace {
540560
541561using TypeContextDescriptor = TargetTypeContextDescriptor<InProcess>;
542562
563+ template <unsigned PointerSize>
564+ using ExternalTypeContextDescriptor
565+ #if SWIFT_OBJC_INTEROP
566+ = TargetTypeContextDescriptor<External<WithObjCInterop<RuntimeTarget<PointerSize>>>>;
567+ #else
568+ = TargetTypeContextDescriptor<External<NoObjCInterop<RuntimeTarget<PointerSize>>>>;
569+ #endif
570+
543571// FIXME: https://bugs.swift.org/browse/SR-1155
544572#pragma clang diagnostic push
545573#pragma clang diagnostic ignored "-Winvalid-offsetof"
@@ -2106,7 +2134,15 @@ using ProtocolRequirement = TargetProtocolRequirement<InProcess>;
21062134
21072135template <typename Runtime> struct TargetProtocolDescriptor ;
21082136using ProtocolDescriptor = TargetProtocolDescriptor<InProcess>;
2109-
2137+
2138+ template <unsigned PointerSize>
2139+ using ExternalProtocolDescriptor
2140+ #if SWIFT_OBJC_INTEROP
2141+ = TargetProtocolDescriptor<External<WithObjCInterop<RuntimeTarget<PointerSize>>>>;
2142+ #else
2143+ = TargetProtocolDescriptor<External<NoObjCInterop<RuntimeTarget<PointerSize>>>>;
2144+ #endif
2145+
21102146// / A witness table for a protocol.
21112147// /
21122148// / With the exception of the initial protocol conformance descriptor,
@@ -2722,6 +2758,16 @@ struct TargetProtocolConformanceDescriptor final
27222758 return TypeRef.getTypeDescriptor (getTypeKind ());
27232759 }
27242760
2761+ constexpr inline auto
2762+ getTypeDescriptorOffset () const -> typename Runtime::StoredSize {
2763+ return offsetof (typename std::remove_reference<decltype (*this )>::type, TypeRef);
2764+ }
2765+
2766+ constexpr inline auto
2767+ getProtocolDescriptorOffset () const -> typename Runtime::StoredSize {
2768+ return offsetof (typename std::remove_reference<decltype (*this )>::type, Protocol);
2769+ }
2770+
27252771 TargetContextDescriptor<Runtime> * __ptrauth_swift_type_descriptor *
27262772 _getTypeDescriptorLocation () const {
27272773 if (getTypeKind () != TypeReferenceKind::IndirectTypeDescriptor)
@@ -2840,9 +2886,21 @@ using TargetProtocolConformanceRecord =
28402886
28412887using ProtocolConformanceRecord = TargetProtocolConformanceRecord<InProcess>;
28422888
2889+ template <unsigned PointerSize>
28432890using ExternalProtocolConformanceDescriptor
2844- = TargetProtocolConformanceDescriptor<External<RuntimeTarget<8 >>>;
2845- using ExternalProtocolConformanceRecord = TargetProtocolConformanceRecord<External<RuntimeTarget<8 >>>;
2891+ #if SWIFT_OBJC_INTEROP
2892+ = TargetProtocolConformanceDescriptor<External<WithObjCInterop<RuntimeTarget<PointerSize>>>>;
2893+ #else
2894+ = TargetProtocolConformanceDescriptor<External<NoObjCInterop<RuntimeTarget<PointerSize>>>>;
2895+ #endif
2896+
2897+ template <unsigned PointerSize>
2898+ using ExternalProtocolConformanceRecord
2899+ #if SWIFT_OBJC_INTEROP
2900+ = TargetProtocolConformanceRecord<External<WithObjCInterop<RuntimeTarget<PointerSize>>>>;
2901+ #else
2902+ = TargetProtocolConformanceRecord<External<NoObjCInterop<RuntimeTarget<PointerSize>>>>;
2903+ #endif
28462904
28472905template <typename Runtime>
28482906struct TargetGenericContext ;
@@ -2893,6 +2951,13 @@ struct TargetContextDescriptor {
28932951};
28942952
28952953using ContextDescriptor = TargetContextDescriptor<InProcess>;
2954+ template <unsigned PointerSize>
2955+ using ExternalContextDescriptor
2956+ #if SWIFT_OBJC_INTEROP
2957+ = TargetContextDescriptor<External<WithObjCInterop<RuntimeTarget<PointerSize>>>>;
2958+ #else
2959+ = TargetContextDescriptor<External<NoObjCInterop<RuntimeTarget<PointerSize>>>>;
2960+ #endif
28962961
28972962inline bool isCImportedModuleName (llvm::StringRef name) {
28982963 // This does not include MANGLING_MODULE_CLANG_IMPORTER because that's
@@ -3417,6 +3482,11 @@ struct TargetProtocolDescriptor final
34173482 NumRequirements};
34183483 }
34193484
3485+ constexpr inline auto
3486+ getNameOffset () const -> typename Runtime::StoredSize {
3487+ return offsetof (typename std::remove_reference<decltype (*this )>::type, Name);
3488+ }
3489+
34203490 // / Retrieve the requirement base descriptor address.
34213491 ConstTargetPointer<Runtime, TargetProtocolRequirement<Runtime>>
34223492 getRequirementBaseDescriptor () const {
@@ -4081,6 +4151,11 @@ class TargetTypeContextDescriptor
40814151 // / type's metadata. The returned value is measured in sizeof(StoredPointer).
40824152 int32_t getGenericArgumentOffset () const ;
40834153
4154+ constexpr inline auto
4155+ getNameOffset () const -> typename Runtime::StoredSize {
4156+ return offsetof (typename std::remove_reference<decltype (*this )>::type, Name);
4157+ }
4158+
40844159 // / Return the start of the generic arguments array in the nominal
40854160 // / type's metadata. The returned value is measured in sizeof(StoredPointer).
40864161 const TargetMetadata<Runtime> * const *getGenericArguments (
0 commit comments