Skip to content

Commit 305752e

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 2551a04 commit 305752e

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
@@ -1414,6 +1414,10 @@ FUNCTION(ObjCGetClass, objc_getClass, C_CC, AlwaysAvailable,
14141414
RETURNS(ObjCClassPtrTy),
14151415
ARGS(Int8PtrTy),
14161416
ATTRS(NoUnwind))
1417+
FUNCTION(ObjCGetRequiredClass, objc_getRequiredClass, C_CC, AlwaysAvailable,
1418+
RETURNS(ObjCClassPtrTy),
1419+
ARGS(Int8PtrTy),
1420+
ATTRS(NoUnwind))
14171421
FUNCTION(ObjCGetMetaClass, objc_getMetaClass, C_CC, AlwaysAvailable,
14181422
RETURNS(ObjCClassPtrTy),
14191423
ARGS(Int8PtrTy),

lib/IRGen/GenDecl.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,15 +1907,13 @@ void IRGenerator::emitObjCActorsNeedingSuperclassSwizzle() {
19071907
auto swiftNativeNSObjectName =
19081908
IGM->getAddrOfGlobalString("SwiftNativeNSObject");
19091909
auto swiftNativeNSObjectClass = RegisterIGF.Builder.CreateCall(
1910-
RegisterIGF.IGM.getLookUpClassFn(), swiftNativeNSObjectName);
1910+
RegisterIGF.IGM.getObjCGetRequiredClassFn(), swiftNativeNSObjectName);
19111911

19121912
for (ClassDecl *CD : ObjCActorsNeedingSuperclassSwizzle) {
19131913
// The @objc actor class.
19141914
llvm::Value *classRef = RegisterIGF.emitTypeMetadataRef(
19151915
CD->getDeclaredInterfaceType()->getCanonicalType());
19161916
classRef = RegisterIGF.Builder.CreateBitCast(classRef, IGM->ObjCClassPtrTy);
1917-
classRef = RegisterIGF.Builder.CreateCall(
1918-
IGM->getFixedClassInitializationFn(), classRef);
19191917

19201918
// Set its superclass to SwiftNativeNSObject.
19211919
RegisterIGF.Builder.CreateCall(
@@ -1926,8 +1924,8 @@ void IRGenerator::emitObjCActorsNeedingSuperclassSwizzle() {
19261924

19271925
// Add the registration function as a static initializer. We use a priority
19281926
// slightly lower than used for C++ global constructors, so that the code is
1929-
// executed before C++ global constructors (in case someone uses archives
1930-
// from a C++ global constructor).
1927+
// executed before C++ global constructors (in case someone manages to access
1928+
// an @objc actor from a global constructor).
19311929
llvm::appendToGlobalCtors(IGM->Module, RegisterFn, 60000, nullptr);
19321930
}
19331931

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)