Skip to content

Commit b45ca04

Browse files
rjmccallbob-wilson
authored andcommitted
Use the new ObjC retain/release intrinsics in IRGen.
1 parent 8719f52 commit b45ca04

17 files changed

+87
-128
lines changed

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,17 +1163,6 @@ FUNCTION(InstantiateObjCClass, swift_instantiateObjCClass, C_CC,
11631163
ATTRS(NoUnwind))
11641164
FUNCTION(ObjCAllocWithZone, objc_allocWithZone, C_CC,
11651165
RETURNS(ObjCPtrTy), ARGS(ObjCClassPtrTy), ATTRS(NoUnwind))
1166-
FUNCTION(ObjCRetain, objc_retain, C_CC,
1167-
RETURNS(ObjCPtrTy), ARGS(ObjCPtrTy), ATTRS(NoUnwind))
1168-
FUNCTION(ObjCRelease, objc_release, C_CC,
1169-
RETURNS(VoidTy), ARGS(ObjCPtrTy), ATTRS(NoUnwind))
1170-
FUNCTION(ObjCAutorelease, objc_autorelease, C_CC,
1171-
RETURNS(ObjCPtrTy), ARGS(ObjCPtrTy), ATTRS(NoUnwind))
1172-
FUNCTION(ObjCRetainAutoreleasedReturnValue,
1173-
objc_retainAutoreleasedReturnValue, C_CC,
1174-
RETURNS(Int8PtrTy), ARGS(Int8PtrTy), ATTRS(NoUnwind))
1175-
FUNCTION(ObjCAutoreleaseReturnValue, objc_autoreleaseReturnValue, C_CC,
1176-
RETURNS(ObjCPtrTy), ARGS(ObjCPtrTy), ATTRS(NoUnwind))
11771166
FUNCTION(ObjCMsgSend, objc_msgSend, C_CC,
11781167
RETURNS(VoidTy), NO_ARGS, NO_ATTRS)
11791168
FUNCTION(ObjCMsgSendStret, objc_msgSend_stret, C_CC,

lib/IRGen/GenObjC.cpp

Lines changed: 41 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -57,71 +57,53 @@
5757
using namespace swift;
5858
using namespace irgen;
5959

60-
void IRGenFunction::emitObjCStrongRelease(llvm::Value *value) {
61-
// Get an appropriately-cast function pointer.
62-
auto fn = IGM.getObjCReleaseFn();
63-
auto cc = IGM.C_CC;
64-
if (auto fun = dyn_cast<llvm::Function>(fn))
65-
cc = fun->getCallingConv();
60+
namespace {
6661

67-
if (value->getType() != IGM.ObjCPtrTy) {
68-
auto fnTy = llvm::FunctionType::get(IGM.VoidTy, value->getType(),
69-
false)->getPointerTo();
70-
fn = llvm::ConstantExpr::getBitCast(fn, fnTy);
62+
/// A utility class that saves the original type of a value in its constructor,
63+
/// casts the value to i8*, and then allows values later to be casted to the
64+
/// original type.
65+
struct CastToInt8PtrTy {
66+
llvm::Type *OrigTy;
67+
68+
CastToInt8PtrTy(IRGenFunction &IGF, llvm::Value *&value)
69+
: OrigTy(value->getType()) {
70+
if (OrigTy->isPointerTy())
71+
value = IGF.Builder.CreateBitCast(value, IGF.IGM.Int8PtrTy);
72+
else
73+
value = IGF.Builder.CreateIntToPtr(value, IGF.IGM.Int8PtrTy);
7174
}
7275

73-
auto call = Builder.CreateCall(fn, value);
74-
call->setCallingConv(cc);
75-
call->setDoesNotThrow();
76+
llvm::Value *restore(IRGenFunction &IGF, llvm::Value *value) const {
77+
assert(value->getType() == IGF.IGM.Int8PtrTy);
78+
if (OrigTy->isPointerTy())
79+
return IGF.Builder.CreateBitCast(value, OrigTy);
80+
else
81+
return IGF.Builder.CreatePtrToInt(value, OrigTy);
82+
}
83+
};
84+
7685
}
7786

78-
/// Given a function of type %objc* (%objc*)*, cast it as appropriate
79-
/// to be used with values of type T.
80-
static llvm::Constant *getCastOfRetainFn(IRGenModule &IGM,
81-
llvm::Constant *fn,
82-
llvm::Type *valueTy) {
83-
#ifndef NDEBUG
84-
auto origFnTy = cast<llvm::FunctionType>(fn->getType()->getPointerElementType());
85-
assert(origFnTy->getReturnType() == IGM.ObjCPtrTy);
86-
assert(origFnTy->getNumParams() == 1);
87-
assert(origFnTy->getParamType(0) == IGM.ObjCPtrTy);
88-
assert(isa<llvm::PointerType>(valueTy) ||
89-
valueTy == IGM.IntPtrTy); // happens with optional types
90-
#endif
91-
if (valueTy == IGM.ObjCPtrTy)
92-
return fn;
93-
94-
auto fnTy = llvm::FunctionType::get(valueTy, valueTy, false);
95-
return llvm::ConstantExpr::getBitCast(fn, fnTy->getPointerTo(0));
87+
void IRGenFunction::emitObjCStrongRelease(llvm::Value *value) {
88+
CastToInt8PtrTy savedType(*this, value);
89+
Builder.CreateIntrinsicCall(llvm::Intrinsic::objc_release, value);
9690
}
9791

9892
void IRGenFunction::emitObjCStrongRetain(llvm::Value *v) {
9993
emitObjCRetainCall(v);
10094
}
10195

10296
llvm::Value *IRGenFunction::emitObjCRetainCall(llvm::Value *value) {
103-
// Get an appropriately cast function pointer.
104-
auto fn = IGM.getObjCRetainFn();
105-
auto cc = IGM.C_CC;
106-
if (auto fun = dyn_cast<llvm::Function>(fn))
107-
cc = fun->getCallingConv();
108-
fn = getCastOfRetainFn(IGM, fn, value->getType());
109-
110-
auto call = Builder.CreateCall(fn, value);
111-
call->setCallingConv(cc);
112-
call->setDoesNotThrow();
113-
return call;
97+
CastToInt8PtrTy savedType(*this, value);
98+
auto call = Builder.CreateIntrinsicCall(llvm::Intrinsic::objc_retain, value);
99+
return savedType.restore(*this, call);
114100
}
115101

116-
llvm::Value *IRGenFunction::emitObjCAutoreleaseCall(llvm::Value *val) {
117-
if (val->getType()->isPointerTy())
118-
val = Builder.CreateBitCast(val, IGM.ObjCPtrTy);
119-
else
120-
val = Builder.CreateIntToPtr(val, IGM.ObjCPtrTy);
121-
122-
auto call = Builder.CreateCall(IGM.getObjCAutoreleaseFn(), val);
123-
call->setDoesNotThrow();
124-
return call;
102+
llvm::Value *IRGenFunction::emitObjCAutoreleaseCall(llvm::Value *value) {
103+
CastToInt8PtrTy savedType(*this, value);
104+
auto call = Builder.CreateIntrinsicCall(llvm::Intrinsic::objc_autorelease,
105+
value);
106+
return savedType.restore(*this, call);
125107
}
126108

127109
llvm::InlineAsm *IRGenModule::getObjCRetainAutoreleasedReturnValueMarker() {
@@ -173,20 +155,10 @@ llvm::Value *irgen::emitObjCRetainAutoreleasedReturnValue(IRGenFunction &IGF,
173155
IGF.Builder.CreateAsmCall(marker, {});
174156
}
175157

176-
auto fn = IGF.IGM.getObjCRetainAutoreleasedReturnValueFn();
158+
CastToInt8PtrTy savedType(IGF, value);
177159

178-
// We don't want to cast the function here because it interferes with
179-
// LLVM's ability to recognize and special-case this function.
180-
// Note that the parameter and result must also have type i8*.
181-
llvm::Type *valueType = value->getType();
182-
if (isa<llvm::PointerType>(valueType)) {
183-
value = IGF.Builder.CreateBitCast(value, IGF.IGM.Int8PtrTy);
184-
} else {
185-
value = IGF.Builder.CreateIntToPtr(value, IGF.IGM.Int8PtrTy);
186-
}
187-
188-
auto call = IGF.Builder.CreateCall(fn, value);
189-
call->setDoesNotThrow();
160+
auto call = IGF.Builder.CreateIntrinsicCall(
161+
llvm::Intrinsic::objc_retainAutoreleasedReturnValue, value);
190162

191163
const llvm::Triple &triple = IGF.IGM.Context.LangOpts.Target;
192164
if (triple.getArch() == llvm::Triple::x86_64) {
@@ -199,25 +171,19 @@ llvm::Value *irgen::emitObjCRetainAutoreleasedReturnValue(IRGenFunction &IGF,
199171
call->setTailCallKind(llvm::CallInst::TCK_NoTail);
200172
}
201173

202-
llvm::Value *result = call;
203-
if (isa<llvm::PointerType>(valueType)) {
204-
result = IGF.Builder.CreateBitCast(result, valueType);
205-
} else {
206-
result = IGF.Builder.CreatePtrToInt(result, valueType);
207-
}
208-
return result;
174+
return savedType.restore(IGF, call);
209175
}
210176

211177
/// Autorelease a return value.
212178
llvm::Value *irgen::emitObjCAutoreleaseReturnValue(IRGenFunction &IGF,
213179
llvm::Value *value) {
214-
auto fn = IGF.IGM.getObjCAutoreleaseReturnValueFn();
215-
fn = getCastOfRetainFn(IGF.IGM, fn, value->getType());
180+
CastToInt8PtrTy savedType(IGF, value);
216181

217-
auto call = IGF.Builder.CreateCall(fn, value);
182+
auto call = IGF.Builder.CreateIntrinsicCall(
183+
llvm::Intrinsic::objc_autoreleaseReturnValue, value);
218184
call->setDoesNotThrow();
219185
call->setTailCall(); // force tail calls at -O0
220-
return call;
186+
return savedType.restore(IGF, call);
221187
}
222188

223189
namespace {

test/ClangImporter/MixedSource/forward-declarations.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class Sub: Base {
88
// CHECK: [[OPAQUE_SELF:%.+]] = bitcast %TSo4BaseC* %2 to {{%.+}}*
99
// CHECK: [[RESULT:%.+]] = call {{%.+}}* bitcast (void ()* @objc_msgSend to {{%.+}}* ({{%.+}}*, i8*)*)({{%.+}}* [[OPAQUE_SELF]], i8* [[SELECTOR]])
1010
// CHECK: [[OPAQUE_RESULT:%.+]] = bitcast {{%.+}}* [[RESULT]] to i8*
11-
// CHECK: call i8* @objc_retainAutoreleasedReturnValue(i8* [[OPAQUE_RESULT]])
11+
// CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[OPAQUE_RESULT]])
1212
_ = self.getClassInstanceWithoutMentioningItsName()
1313
// CHECK: call void @swift_release(%swift.refcounted* {{%.+}})
1414
// CHECK: ret void

test/ClangImporter/objc_ir.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func instanceMethods(_ b: B) {
3434
func extensionMethods(b b: B) {
3535
// CHECK: load i8*, i8** @"\01L_selector(method:separateExtMethod:)", align 8
3636
// CHECK: [[T0:%.*]] = call i8* bitcast (void ()* @objc_msgSend to i8*
37-
// CHECK-NEXT: [[T1:%.*]] = {{.*}}call i8* @objc_retainAutoreleasedReturnValue(i8* [[T0]])
37+
// CHECK-NEXT: [[T1:%.*]] = {{.*}}call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[T0]])
3838
// CHECK-NOT: [[T0]]
3939
// CHECK: [[T1]]
4040
b.method(1, separateExtMethod:1.5)

test/IRGen/autorelease.sil

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) %s -emit-ir | %FileCheck -check-prefix CHECK -check-prefix CHECK-%target-ptrsize -check-prefix %target-cpu %s
1+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) %s -emit-ir | %FileCheck -check-prefix CHECK -check-prefix CHECK-%target-ptrsize -check-prefix %target-cpu -DINT=i%target-ptrsize %s
22

33
// rdar://16565958
44

55
import Builtin
66
import Swift
77

8-
// CHECK: [[OBJC:%objc_object]] = type
9-
108
class C {}
119
sil_vtable C {}
1210
sil [ossa] @_TFC11autorelease1Cd : $@convention(method) (@owned C) -> @owned Builtin.NativeObject {
@@ -20,13 +18,11 @@ bb0(%0 : @owned $C?):
2018
return %0 : $C?
2119
}
2220

23-
// CHECK-32: define{{( dllexport| protected)?}} swiftcc i32 @foo(i32) {{.*}} {
24-
// CHECK-32: [[T0:%.*]] = tail call i32 bitcast ([[OBJC]]* ([[OBJC]]*)* @objc_autoreleaseReturnValue to i32 (i32)*)(i32 %0)
25-
// CHECK-32-NEXT: ret i32 [[T0]]
26-
27-
// CHECK-64: define{{( dllexport| protected)?}} swiftcc i64 @foo(i64) {{.*}} {
28-
// CHECK-64: [[T0:%.*]] = tail call i64 bitcast ([[OBJC]]* ([[OBJC]]*)* @objc_autoreleaseReturnValue to i64 (i64)*)(i64 %0)
29-
// CHECK-64-NEXT: ret i64 [[T0]]
21+
// CHECK: define{{( dllexport| protected)?}} swiftcc [[INT]] @foo([[INT]]) {{.*}} {
22+
// CHECK: [[T0:%.*]] = inttoptr [[INT]] %0 to i8*
23+
// CHECK-NEXT: [[T1:%.*]] = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* [[T0]])
24+
// CHECK-NEXT: [[T2:%.*]] = ptrtoint i8* [[T1]] to [[INT]]
25+
// CHECK-NEXT: ret [[INT]] [[T2]]
3026

3127
sil [ossa] @bar : $@convention(thin) (@owned C?) -> @owned C? {
3228
bb0(%0 : @owned $C?):
@@ -38,45 +34,45 @@ bb0(%0 : @owned $C?):
3834
// x86_64: define{{( dllexport| protected)?}} swiftcc i64 @bar(i64)
3935
// x86_64: [[T0:%.*]] = call swiftcc i64 @foo(i64 %0)
4036
// x86_64-NEXT: [[T1:%.*]] = inttoptr i64 [[T0]] to i8*
41-
// x86_64-NEXT: [[T2:%.*]] = notail call i8* @objc_retainAutoreleasedReturnValue(i8* [[T1]])
37+
// x86_64-NEXT: [[T2:%.*]] = notail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[T1]])
4238
// x86_64-NEXT: [[T3:%.*]] = ptrtoint i8* [[T2]] to i64
4339
// x86_64-NEXT: ret i64 [[T3]]
4440

4541
// arm64: define{{( dllexport| protected)?}} swiftcc i64 @bar(i64)
4642
// arm64: [[T0:%.*]] = call swiftcc i64 @foo(i64 %0)
4743
// arm64-NEXT: call void asm sideeffect "mov
4844
// arm64-NEXT: [[T1:%.*]] = inttoptr i64 [[T0]] to i8*
49-
// arm64-NEXT: [[T2:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T1]])
45+
// arm64-NEXT: [[T2:%.*]] = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[T1]])
5046
// arm64-NEXT: [[T3:%.*]] = ptrtoint i8* [[T2]] to i64
5147
// arm64-NEXT: ret i64 [[T3]]
5248

5349
// i386: define{{( dllexport| protected)?}} swiftcc i32 @bar(i32)
5450
// i386: [[T0:%.*]] = call swiftcc i32 @foo(i32 %0)
5551
// i386-NEXT: [[T1:%.*]] = inttoptr i32 [[T0]] to i8*
56-
// i386-NEXT: [[T2:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T1]])
52+
// i386-NEXT: [[T2:%.*]] = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[T1]])
5753
// i386-NEXT: [[T3:%.*]] = ptrtoint i8* [[T2]] to i32
5854
// i386-NEXT: ret i32 [[T3]]
5955

6056
// armv7: define{{( dllexport| protected)?}} swiftcc i32 @bar(i32)
6157
// armv7: [[T0:%.*]] = call swiftcc i32 @foo(i32 %0)
6258
// armv7-NEXT: call void asm sideeffect "mov
6359
// armv7-NEXT: [[T1:%.*]] = inttoptr i32 [[T0]] to i8*
64-
// armv7-NEXT: [[T2:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T1]])
60+
// armv7-NEXT: [[T2:%.*]] = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[T1]])
6561
// armv7-NEXT: [[T3:%.*]] = ptrtoint i8* [[T2]] to i32
6662
// armv7-NEXT: ret i32 [[T3]]
6763

6864
// armv7s: define{{( dllexport| protected)?}} swiftcc i32 @bar(i32)
6965
// armv7s: [[T0:%.*]] = call swiftcc i32 @foo(i32 %0)
7066
// armv7s-NEXT: call void asm sideeffect "mov
7167
// armv7s-NEXT: [[T1:%.*]] = inttoptr i32 [[T0]] to i8*
72-
// armv7s-NEXT: [[T2:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T1]])
68+
// armv7s-NEXT: [[T2:%.*]] = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[T1]])
7369
// armv7s-NEXT: [[T3:%.*]] = ptrtoint i8* [[T2]] to i32
7470
// armv7s-NEXT: ret i32 [[T3]]
7571

7672
// armv7k: define{{( dllexport| protected)?}} swiftcc i32 @bar(i32)
7773
// armv7k: [[T0:%.*]] = call swiftcc i32 @foo(i32 %0)
7874
// armv7k-NEXT: call void asm sideeffect "mov
7975
// armv7k-NEXT: [[T1:%.*]] = inttoptr i32 [[T0]] to i8*
80-
// armv7k-NEXT: [[T2:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T1]])
76+
// armv7k-NEXT: [[T2:%.*]] = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[T1]])
8177
// armv7k-NEXT: [[T3:%.*]] = ptrtoint i8* [[T2]] to i32
8278
// armv7k-NEXT: ret i32 [[T3]]

test/IRGen/class.sil

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ bb0(%0 : $@thick C.Type):
105105
}
106106

107107
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T5class1CC* @autorelease(%T5class1CC*) {{.*}} {
108-
// CHECK: %1 = bitcast %T5class1CC* %0 to %objc_object*
109-
// CHECK: call %objc_object* @objc_autorelease(%objc_object* %1)
108+
// CHECK: %1 = bitcast %T5class1CC* %0 to i8*
109+
// CHECK: call i8* @llvm.objc.autorelease(i8* %1)
110110
// CHECK: ret %T5class1CC* %0
111111
sil @autorelease : $@convention(thin) (@owned C) -> C {
112112
entry(%c : $C):
@@ -115,8 +115,8 @@ entry(%c : $C):
115115
}
116116

117117
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i64 @autorelease_optional(i64) {{.*}} {
118-
// CHECK: %1 = inttoptr i64 %0 to %objc_object*
119-
// CHECK: call %objc_object* @objc_autorelease(%objc_object* %1)
118+
// CHECK: %1 = inttoptr i64 %0 to i8*
119+
// CHECK: call i8* @llvm.objc.autorelease(i8* %1)
120120
// CHECK: ret i64 %0
121121
sil @autorelease_optional : $@convention(thin) (@owned C?) -> C? {
122122
entry(%c : $C?):

test/IRGen/newtype.swift

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// RUN: %empty-directory(%t)
22
// RUN: %build-irgen-test-overlays
3-
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t -I %S/../IDE/Inputs/custom-modules) %s -emit-ir | %FileCheck %s
4-
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t -I %S/../IDE/Inputs/custom-modules) %s -emit-ir -O | %FileCheck %s -check-prefix=OPT
3+
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t -I %S/../IDE/Inputs/custom-modules) %s -emit-ir | %FileCheck %s -DINT=i%target-ptrsize
4+
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t -I %S/../IDE/Inputs/custom-modules) %s -emit-ir -O | %FileCheck %s -check-prefix=OPT -DINT=i%target-ptrsize
55
import CoreFoundation
66
import Foundation
77
import Newtype
@@ -133,18 +133,23 @@ public func anchor() -> Bool {
133133

134134
class ObjCTest {
135135
// CHECK-LABEL: define hidden %0* @"$s7newtype8ObjCTestC19optionalPassThroughySo14SNTErrorDomainaSgAGFTo"
136-
// CHECK: [[CASTED:%.+]] = ptrtoint %0* %2 to i{{32|64}}
137-
// CHECK: [[RESULT:%.+]] = call swiftcc i{{32|64}} @"$s7newtype8ObjCTestC19optionalPassThroughySo14SNTErrorDomainaSgAGF"(i{{32|64}} [[CASTED]], %T7newtype8ObjCTestC* swiftself {{%.+}})
138-
// CHECK: [[AUTORELEASE_RESULT:%.+]] = {{(tail )?}}call {{.*}} @objc_autoreleaseReturnValue {{.*}}(i{{32|64}} [[RESULT]])
139-
// CHECK: [[OPAQUE_RESULT:%.+]] = inttoptr i{{32|64}} [[AUTORELEASE_RESULT]] to %0*
136+
// CHECK: [[CASTED:%.+]] = ptrtoint %0* %2 to [[INT]]
137+
// CHECK: [[RESULT:%.+]] = call swiftcc [[INT]] @"$s7newtype8ObjCTestC19optionalPassThroughySo14SNTErrorDomainaSgAGF"([[INT]] [[CASTED]], %T7newtype8ObjCTestC* swiftself {{%.+}})
138+
// CHECK: [[CAST_RESULT:%.+]] = inttoptr [[INT]] [[RESULT]] to i8*
139+
// CHECK: [[AUTORELEASE_RESULT:%.+]] = {{(tail )?}}call i8* @llvm.objc.autoreleaseReturnValue(i8* [[CAST_RESULT]])
140+
// CHECK: [[CAST_AUTORELEASE_RESULT:%.+]] = ptrtoint i8* [[AUTORELEASE_RESULT]] to [[INT]]
141+
// CHECK: [[OPAQUE_RESULT:%.+]] = inttoptr [[INT]] [[CAST_AUTORELEASE_RESULT]] to %0*
140142
// CHECK: ret %0* [[OPAQUE_RESULT]]
141143
// CHECK: {{^}$}}
142144

143145
// OPT-LABEL: define hidden %0* @"$s7newtype8ObjCTestC19optionalPassThroughySo14SNTErrorDomainaSgAGFTo"
144146
// OPT: [[CAST_VALUE:%.*]] = bitcast %0* %2 to %objc_object*
145-
// OPT: [[RESULT:%.*]] = {{(tail )?}}call %objc_object* @objc_autoreleaseReturnValue(%objc_object* [[CAST_VALUE]])
146-
// OPT: [[RESULT_CAST:%.*]] = bitcast %objc_object* [[RESULT]] to %0*
147-
// OPT: ret %0* [[RESULT_CAST]]
147+
// OPT: [[RECAST_VALUE:%.*]] = bitcast %objc_object* [[CAST_VALUE]] to i8*
148+
// OPT: [[RESULT:%.*]] = {{(tail )?}}call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* [[RECAST_VALUE]])
149+
// OPT: [[RESULT_CAST:%.*]] = bitcast i8* [[RESULT]] to %0*
150+
// OPT: [[RESULT_RECAST:%.*]] = bitcast %0* [[RESULT_CAST]] to i8*
151+
// OPT: [[RESULT_RERECAST:%.*]] = bitcast i8* [[RESULT_RECAST]] to %0*
152+
// OPT: ret %0* [[RESULT_RERECAST]]
148153
// OPT: {{^}$}}
149154
@objc func optionalPassThrough(_ ed: ErrorDomain?) -> ErrorDomain? {
150155
return ed

test/IRGen/objc.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class MyBlammo : Blammo {
4848
class Test2 : Gizmo {
4949
func foo() {}
5050
// CHECK: define hidden swiftcc void @"$s4objc5Test2C3fooyyF"([[TEST2]]* swiftself) {{.*}} {
51-
// CHECK: call {{.*}} @objc_release
51+
// CHECK: call {{.*}} @llvm.objc.release
5252
// CHECK: ret void
5353

5454
@objc dynamic func bar() {}

test/IRGen/objc_arc_contract.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
// REQUIRES: objc_interop
1313
// REQUIRES: asserts
1414

15-
// CHECK-WITHOUT-PASS: call void (...) @clang.arc.use
16-
// CHECK-WITH-PASS-NOT: call void (...) @clang.arc.use
15+
// CHECK-WITHOUT-PASS: call void (...) @llvm.objc.clang.arc.use
16+
// CHECK-WITH-PASS-NOT: call void (...) @llvm.objc.clang.arc.use
1717

1818
import Foundation
1919

test/IRGen/objc_casts.sil

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ sil_vtable SwiftClass {}
1313
protocol ClassProto : class {}
1414

1515
// CHECK-LABEL: define hidden swiftcc %TSo8NSObjectC* @checkedClassBoundCast(%swift.type*, %TSo8NSObjectC*, %swift.type* %T) #0 {
16+
// CHECK: [[OBJ:%.+]] = bitcast %TSo8NSObjectC* %1 to i8*
17+
// CHECK: call i8* @llvm.objc.retain(i8* [[OBJ]])
1618
// CHECK: [[OPAQUE_OBJ:%.+]] = bitcast %TSo8NSObjectC* %1 to i8*
1719
// CHECK: [[OPAQUE_CLASS:%.+]] = bitcast %swift.type* %T to i8*
1820
// CHECK: [[OPAQUE_RESULT:%.+]] = call i8* @swift_dynamicCastUnknownClassUnconditional(i8* [[OPAQUE_OBJ]], i8* [[OPAQUE_CLASS]], {{.*}})

test/IRGen/objc_class_export.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
// CHECK-DAG: [[NSRECT:%TSo6NSRectV]] = type <{ %TSo7NSPointV, %TSo6NSSizeV }>
1414
// CHECK-DAG: [[NSPOINT:%TSo7NSPointV]] = type <{ %TSd, %TSd }>
1515
// CHECK-DAG: [[NSSIZE:%TSo6NSSizeV]] = type <{ %TSd, %TSd }>
16-
// CHECK-DAG: [[OBJC:%objc_object]] = type opaque
1716

1817
// CHECK: @"OBJC_METACLASS_$__TtC17objc_class_export3Foo" = hidden global %objc_class {
1918
// CHECK-SAME: %objc_class* @"OBJC_METACLASS_$_{{(_TtCs12_)?}}SwiftObject",

test/IRGen/objc_factory_method.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ bb0(%0 : $Optional<Bee>, %1 : $@thick Hive.Type):
2424
%3 = objc_method %2 : $@objc_metatype Hive.Type, #Hive.init!allocator.1.foreign : (Hive.Type) -> (Bee!) -> Hive!, $@convention(objc_method) (Optional<Bee>, @objc_metatype Hive.Type) -> @autoreleased Optional<Hive> // user: %4
2525
// CHECK: call {{.*}} @objc_msgSend
2626
%4 = apply %3(%0, %2) : $@convention(objc_method) (Optional<Bee>, @objc_metatype Hive.Type) -> @autoreleased Optional<Hive> // users: %5, %6
27-
// CHECK: call {{.*}} @objc_autorelease
27+
// CHECK: call {{.*}} @llvm.objc.autorelease
2828
autorelease_value %4 : $Optional<Hive>
2929
return %4 : $Optional<Hive>
3030
}

test/IRGen/objc_layout_multifile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
class Foo {
1010
// CHECK-LABEL: define hidden swiftcc void @"$s21objc_layout_multifile3FooC3barAA3BarCSgvs"
1111
// CHECK-NOT: ret
12-
// CHECK: @objc_retain
12+
// CHECK: @llvm.objc.retain
1313
var bar: Bar?
1414
}

0 commit comments

Comments
 (0)