Skip to content

Commit 6f3e24a

Browse files
committed
Use ObjC class symbol for @_objcImpl categories
1 parent f230023 commit 6f3e24a

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

lib/IRGen/GenDecl.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4867,11 +4867,17 @@ IRGenModule::getAddrOfTypeMetadata(CanType concreteType,
48674867
DebugTypeInfo DbgTy;
48684868

48694869
switch (canonicality) {
4870-
case TypeMetadataCanonicality::Canonical:
4871-
entity = LinkEntity::forTypeMetadata(
4872-
concreteType, fullMetadata ? TypeMetadataAddress::FullMetadata
4873-
: TypeMetadataAddress::AddressPoint);
4870+
case TypeMetadataCanonicality::Canonical: {
4871+
auto classDecl = concreteType->getClassOrBoundGenericClass();
4872+
if (classDecl && !classDecl->getObjCImplementationDecls().empty()) {
4873+
entity = LinkEntity::forObjCClass(classDecl);
4874+
} else {
4875+
entity = LinkEntity::forTypeMetadata(
4876+
concreteType, fullMetadata ? TypeMetadataAddress::FullMetadata
4877+
: TypeMetadataAddress::AddressPoint);
4878+
}
48744879
break;
4880+
}
48754881
case TypeMetadataCanonicality::Noncanonical:
48764882
entity =
48774883
LinkEntity::forNoncanonicalSpecializedGenericTypeMetadata(concreteType);

test/IRGen/objc_implementation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
// CHECK: [[OBJC_CLASS_NAME_2:@[^, ]+]] = private unnamed_addr constant [10 x i8] c"Category1\00"
2626
// CHECK: [[selector_data_category1Method_:@[^, ]+]] = private global [17 x i8] c"category1Method:\00", section "__TEXT,__objc_methname,cstring_literals", align 1
2727
// CHECK: [[_CATEGORY_INSTANCE_METHODS_ImplClass_Category1:@[^, ]+]] = internal constant { i32, i32, [1 x { i8*, i8*, i8* }] } { i32 24, i32 1, [1 x { i8*, i8*, i8* }] [{ i8*, i8*, i8* } { i8* getelementptr inbounds ([17 x i8], [17 x i8]* [[selector_data_category1Method_]], i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* [[OBJC_METH_VAR_TYPE_]], i64 0, i64 0), i8* bitcast (void (%0*, i8*, i32)* @"$sSo9ImplClassC19objc_implementationE15category1Methodyys5Int32VFTo" to i8*) }] }, section "__DATA, __objc_data", align 8
28-
// CHECK: [[_CATEGORY_ImplClass_Category1:@[^, ]+]] = internal constant { i8*, %objc_class*, { i32, i32, [1 x { i8*, i8*, i8* }] }*, i8*, i8*, i8*, i8*, i32 } { i8* getelementptr inbounds ([10 x i8], [10 x i8]* [[OBJC_CLASS_NAME_2]], i64 0, i64 0), %objc_class* bitcast (%swift.type* @"$sSo9ImplClassCN" to %objc_class*), { i32, i32, [1 x { i8*, i8*, i8* }] }* [[_CATEGORY_INSTANCE_METHODS_ImplClass_Category1]], i8* null, i8* null, i8* null, i8* null, i32 60 }, section "__DATA, __objc_const", align 8
28+
// CHECK: [[_CATEGORY_ImplClass_Category1:@[^, ]+]] = internal constant { i8*, %objc_class*, { i32, i32, [1 x { i8*, i8*, i8* }] }*, i8*, i8*, i8*, i8*, i32 } { i8* getelementptr inbounds ([10 x i8], [10 x i8]* [[OBJC_CLASS_NAME_2]], i64 0, i64 0), %objc_class* bitcast (<{ i64, %objc_class*, %swift.opaque*, %swift.opaque*, { i32, i32, i32, i32, i8*, i8*, { i32, i32, [1 x { i8*, i8*, i8* }] }*, i8*, i8*, i8*, i8* }* }>* @"OBJC_CLASS_$_ImplClass" to %objc_class*), { i32, i32, [1 x { i8*, i8*, i8* }] }* [[_CATEGORY_INSTANCE_METHODS_ImplClass_Category1]], i8* null, i8* null, i8* null, i8* null, i32 60 }, section "__DATA, __objc_const", align 8
2929
@_objcImplementation(Category1) extension ImplClass {
3030
@objc func category1Method(_: Int32) {
3131
print("category1Method")

0 commit comments

Comments
 (0)