Skip to content

Commit fa578df

Browse files
committed
Simplify @objc actor back-deploy IR and switch to objc_getRequiredClass.
`objc_getRequiredClass` will produce a fatal error if the class isn't found, which will prevent a malformed program using back-deployed @objc actor from launching. Also eliminate the spurious `objc_opt_self` call, which is unneeded given that we're realizing the metadata. Thanks to Mike Ash for the review.
1 parent 394d6a8 commit fa578df

File tree

3 files changed

+9
-8
lines changed

3 files changed

+9
-8
lines changed

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,6 +1390,10 @@ FUNCTION(ObjCGetClass, objc_getClass, C_CC, AlwaysAvailable,
13901390
RETURNS(ObjCClassPtrTy),
13911391
ARGS(Int8PtrTy),
13921392
ATTRS(NoUnwind))
1393+
FUNCTION(ObjCGetRequiredClass, objc_getRequiredClass, C_CC, AlwaysAvailable,
1394+
RETURNS(ObjCClassPtrTy),
1395+
ARGS(Int8PtrTy),
1396+
ATTRS(NoUnwind))
13931397
FUNCTION(ObjCGetMetaClass, objc_getMetaClass, C_CC, AlwaysAvailable,
13941398
RETURNS(ObjCClassPtrTy),
13951399
ARGS(Int8PtrTy),

lib/IRGen/GenDecl.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1881,15 +1881,13 @@ void IRGenerator::emitObjCActorsNeedingSuperclassSwizzle() {
18811881
auto swiftNativeNSObjectName =
18821882
IGM->getAddrOfGlobalString("SwiftNativeNSObject");
18831883
auto swiftNativeNSObjectClass = RegisterIGF.Builder.CreateCall(
1884-
RegisterIGF.IGM.getLookUpClassFn(), swiftNativeNSObjectName);
1884+
RegisterIGF.IGM.getObjCGetRequiredClassFn(), swiftNativeNSObjectName);
18851885

18861886
for (ClassDecl *CD : ObjCActorsNeedingSuperclassSwizzle) {
18871887
// The @objc actor class.
18881888
llvm::Value *classRef = RegisterIGF.emitTypeMetadataRef(
18891889
CD->getDeclaredInterfaceType()->getCanonicalType());
18901890
classRef = RegisterIGF.Builder.CreateBitCast(classRef, IGM->ObjCClassPtrTy);
1891-
classRef = RegisterIGF.Builder.CreateCall(
1892-
IGM->getFixedClassInitializationFn(), classRef);
18931891

18941892
// Set its superclass to SwiftNativeNSObject.
18951893
RegisterIGF.Builder.CreateCall(
@@ -1900,8 +1898,8 @@ void IRGenerator::emitObjCActorsNeedingSuperclassSwizzle() {
19001898

19011899
// Add the registration function as a static initializer. We use a priority
19021900
// slightly lower than used for C++ global constructors, so that the code is
1903-
// executed before C++ global constructors (in case someone uses archives
1904-
// from a C++ global constructor).
1901+
// executed before C++ global constructors (in case someone manages to access
1902+
// an @objc actor from a global constructor).
19051903
llvm::appendToGlobalCtors(IGM->Module, RegisterFn, 60000, nullptr);
19061904
}
19071905

test/IRGen/actor_class_objc_backdeploy.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,9 @@ import Foundation
5151
// CHECK: swift_defaultActor_destroy
5252

5353
// CHECK-LABEL: define private void @_swift_objc_actor_initialization()
54-
// CHECK: [[SWIFT_NATIVE_NSOBJECT_CLASS:%.*]] = call %objc_class* @objc_lookUpClass(i8* getelementptr inbounds ([20 x i8], [20 x i8]* [[SWIFT_NATIVE_NSOBJECT_NAME]]
54+
// CHECK: [[SWIFT_NATIVE_NSOBJECT_CLASS:%.*]] = call %objc_class* @objc_getRequiredClass(i8* getelementptr inbounds ([20 x i8], [20 x i8]* [[SWIFT_NATIVE_NSOBJECT_NAME]]
5555
// CHECK: [[ACTOR_RESPONSE:%.*]] = call swiftcc %swift.metadata_response @"$s16actor_class_objc7MyClassCMa"(
5656
// CHECK: [[ACTOR_METADATA:%.*]] = extractvalue %swift.metadata_response [[ACTOR_RESPONSE]], 0
57-
// CHECK: [[ACTOR_CLASS_RAW:%.*]] = bitcast %swift.type* [[ACTOR_METADATA]] to %objc_class*
58-
// CHECK: [[ACTOR_CLASS:%.*]] = call %objc_class* @objc_opt_self(%objc_class* [[ACTOR_CLASS_RAW]])
57+
// CHECK: [[ACTOR_CLASS:%.*]] = bitcast %swift.type* [[ACTOR_METADATA]] to %objc_class*
5958
// CHECK: call %objc_class* @class_setSuperclass(%objc_class* [[ACTOR_CLASS]], %objc_class* [[SWIFT_NATIVE_NSOBJECT_CLASS]])
6059

0 commit comments

Comments
 (0)