Skip to content

runtime: return the destination address in swift_weakInit/Assign/Copy… #11897

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions include/swift/Runtime/HeapObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -673,15 +673,17 @@ class WeakReference;
///
/// \param ref - never null
/// \param value - can be null
/// \return ref
SWIFT_RUNTIME_EXPORT
void swift_weakInit(WeakReference *ref, HeapObject *value);
WeakReference *swift_weakInit(WeakReference *ref, HeapObject *value);

/// Assign a new value to a weak reference.
///
/// \param ref - never null
/// \param value - can be null
/// \return ref
SWIFT_RUNTIME_EXPORT
void swift_weakAssign(WeakReference *ref, HeapObject *value);
WeakReference *swift_weakAssign(WeakReference *ref, HeapObject *value);

/// Load a value from a weak reference. If the current value is a
/// non-null object that has begun deallocation, returns null;
Expand Down Expand Up @@ -710,29 +712,33 @@ void swift_weakDestroy(WeakReference *ref);
///
/// \param dest - never null, but can refer to a null object
/// \param src - never null, but can refer to a null object
/// \return dest
SWIFT_RUNTIME_EXPORT
void swift_weakCopyInit(WeakReference *dest, WeakReference *src);
WeakReference *swift_weakCopyInit(WeakReference *dest, WeakReference *src);

/// Take initialize a weak reference.
///
/// \param dest - never null, but can refer to a null object
/// \param src - never null, but can refer to a null object
/// \return dest
SWIFT_RUNTIME_EXPORT
void swift_weakTakeInit(WeakReference *dest, WeakReference *src);
WeakReference *swift_weakTakeInit(WeakReference *dest, WeakReference *src);

/// Copy assign a weak reference.
///
/// \param dest - never null, but can refer to a null object
/// \param src - never null, but can refer to a null object
/// \return dest
SWIFT_RUNTIME_EXPORT
void swift_weakCopyAssign(WeakReference *dest, WeakReference *src);
WeakReference *swift_weakCopyAssign(WeakReference *dest, WeakReference *src);

/// Take assign a weak reference.
///
/// \param dest - never null, but can refer to a null object
/// \param src - never null, but can refer to a null object
/// \return dest
SWIFT_RUNTIME_EXPORT
void swift_weakTakeAssign(WeakReference *dest, WeakReference *src);
WeakReference *swift_weakTakeAssign(WeakReference *dest, WeakReference *src);

/*****************************************************************************/
/************************* OTHER REFERENCE-COUNTING **************************/
Expand Down
36 changes: 18 additions & 18 deletions include/swift/Runtime/RuntimeFunctions.def
Original file line number Diff line number Diff line change
Expand Up @@ -464,17 +464,17 @@ FUNCTION(NativeWeakDestroy, swift_weakDestroy, DefaultCC,
ARGS(WeakReferencePtrTy),
ATTRS(NoUnwind))

// void swift_weakInit(WeakReference *object, void *value);
// WeakReference *swift_weakInit(WeakReference *object, void *value);
FUNCTION(NativeWeakInit, swift_weakInit, DefaultCC,
RETURNS(VoidTy),
RETURNS(WeakReferencePtrTy),
ARGS(WeakReferencePtrTy, RefCountedPtrTy),
ATTRS(NoUnwind))
ATTRS(NoUnwind, FirstParamReturned))

// void swift_weakAssign(WeakReference *object, void *value);
// WeakReferencePtr *swift_weakAssign(WeakReference *object, void *value);
FUNCTION(NativeWeakAssign, swift_weakAssign, DefaultCC,
RETURNS(VoidTy),
RETURNS(WeakReferencePtrTy),
ARGS(WeakReferencePtrTy, RefCountedPtrTy),
ATTRS(NoUnwind))
ATTRS(NoUnwind, FirstParamReturned))

// void *swift_weakLoadStrong(WeakReference *object);
FUNCTION(NativeWeakLoadStrong, swift_weakLoadStrong,DefaultCC,
Expand All @@ -488,29 +488,29 @@ FUNCTION(NativeWeakTakeStrong, swift_weakTakeStrong,DefaultCC,
ARGS(WeakReferencePtrTy),
ATTRS(NoUnwind))

// void swift_weakCopyInit(WeakReference *dest, WeakReference *src);
// WeakReference *swift_weakCopyInit(WeakReference *dest, WeakReference *src);
FUNCTION(NativeWeakCopyInit, swift_weakCopyInit, DefaultCC,
RETURNS(VoidTy),
RETURNS(WeakReferencePtrTy),
ARGS(WeakReferencePtrTy, WeakReferencePtrTy),
ATTRS(NoUnwind))
ATTRS(NoUnwind, FirstParamReturned))

// void swift_weakTakeInit(WeakReference *dest, WeakReference *src);
// WeakReference *swift_weakTakeInit(WeakReference *dest, WeakReference *src);
FUNCTION(NativeWeakTakeInit, swift_weakTakeInit, DefaultCC,
RETURNS(VoidTy),
RETURNS(WeakReferencePtrTy),
ARGS(WeakReferencePtrTy, WeakReferencePtrTy),
ATTRS(NoUnwind))
ATTRS(NoUnwind, FirstParamReturned))

// void swift_weakCopyAssign(WeakReference *dest, WeakReference *src);
// WeakReference *swift_weakCopyAssign(WeakReference *dest, WeakReference *src);
FUNCTION(NativeWeakCopyAssign, swift_weakCopyAssign, DefaultCC,
RETURNS(VoidTy),
RETURNS(WeakReferencePtrTy),
ARGS(WeakReferencePtrTy, WeakReferencePtrTy),
ATTRS(NoUnwind))
ATTRS(NoUnwind, FirstParamReturned))

// void swift_weakTakeAssign(WeakReference *dest, WeakReference *src);
// WeakReference *swift_weakTakeAssign(WeakReference *dest, WeakReference *src);
FUNCTION(NativeWeakTakeAssign, swift_weakTakeAssign, DefaultCC,
RETURNS(VoidTy),
RETURNS(WeakReferencePtrTy),
ARGS(WeakReferencePtrTy, WeakReferencePtrTy),
ATTRS(NoUnwind))
ATTRS(NoUnwind, FirstParamReturned))

// void swift_unknownWeakDestroy(WeakReference *object);
FUNCTION(UnknownWeakDestroy, swift_unknownWeakDestroy, DefaultCC,
Expand Down
10 changes: 10 additions & 0 deletions lib/IRGen/IRGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,7 @@ namespace RuntimeConstants {
const auto NoReturn = llvm::Attribute::NoReturn;
const auto NoUnwind = llvm::Attribute::NoUnwind;
const auto ZExt = llvm::Attribute::ZExt;
const auto FirstParamReturned = llvm::Attribute::Returned;
} // namespace RuntimeConstants

// We don't use enough attributes to justify generalizing the
Expand All @@ -436,6 +437,11 @@ namespace RuntimeConstants {
static bool isReturnAttribute(llvm::Attribute::AttrKind Attr) {
return Attr == llvm::Attribute::ZExt;
}
// Similar to the 'return' attribute we assume that the 'returned' attributed is
// associated with the first function parameter.
static bool isReturnedAttribute(llvm::Attribute::AttrKind Attr) {
return Attr == llvm::Attribute::Returned;
}

llvm::Constant *swift::getRuntimeFn(llvm::Module &Module,
llvm::Constant *&cache,
Expand Down Expand Up @@ -471,15 +477,19 @@ llvm::Constant *swift::getRuntimeFn(llvm::Module &Module,

llvm::AttrBuilder buildFnAttr;
llvm::AttrBuilder buildRetAttr;
llvm::AttrBuilder buildFirstParamAttr;

for (auto Attr : attrs) {
if (isReturnAttribute(Attr))
buildRetAttr.addAttribute(Attr);
else if (isReturnedAttribute(Attr))
buildFirstParamAttr.addAttribute(Attr);
else
buildFnAttr.addAttribute(Attr);
}
fn->addAttributes(llvm::AttributeList::FunctionIndex, buildFnAttr);
fn->addAttributes(llvm::AttributeList::ReturnIndex, buildRetAttr);
fn->addParamAttrs(0, buildFirstParamAttr);
}

return cache;
Expand Down
23 changes: 16 additions & 7 deletions stdlib/public/runtime/HeapObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -829,13 +829,14 @@ void swift::swift_deallocObject(HeapObject *object, size_t allocatedSize,
}
}


void swift::swift_weakInit(WeakReference *ref, HeapObject *value) {
WeakReference *swift::swift_weakInit(WeakReference *ref, HeapObject *value) {
ref->nativeInit(value);
return ref;
}

void swift::swift_weakAssign(WeakReference *ref, HeapObject *value) {
WeakReference *swift::swift_weakAssign(WeakReference *ref, HeapObject *value) {
ref->nativeAssign(value);
return ref;
}

HeapObject *swift::swift_weakLoadStrong(WeakReference *ref) {
Expand All @@ -850,19 +851,27 @@ void swift::swift_weakDestroy(WeakReference *ref) {
ref->nativeDestroy();
}

void swift::swift_weakCopyInit(WeakReference *dest, WeakReference *src) {
WeakReference *swift::swift_weakCopyInit(WeakReference *dest,
WeakReference *src) {
dest->nativeCopyInit(src);
return dest;
}

void swift::swift_weakTakeInit(WeakReference *dest, WeakReference *src) {
WeakReference *swift::swift_weakTakeInit(WeakReference *dest,
WeakReference *src) {
dest->nativeTakeInit(src);
return dest;
}

void swift::swift_weakCopyAssign(WeakReference *dest, WeakReference *src) {
WeakReference *swift::swift_weakCopyAssign(WeakReference *dest,
WeakReference *src) {
dest->nativeCopyAssign(src);
return dest;
}

void swift::swift_weakTakeAssign(WeakReference *dest, WeakReference *src) {
WeakReference *swift::swift_weakTakeAssign(WeakReference *dest,
WeakReference *src) {
dest->nativeTakeAssign(src);
return dest;
}

12 changes: 6 additions & 6 deletions test/IRGen/existentials.sil
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,15 @@ entry(%w : $*@sil_weak CP?, %a : $CP?):
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: store i8** [[SRC_WITNESS]], i8*** [[DEST_WITNESS_ADDR]]
// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: call void @swift_weakInit(%swift.weak* [[DEST_REF_ADDR]], %swift.refcounted* [[SRC_REF]])
// CHECK: call %swift.weak* @swift_weakInit(%swift.weak* [[DEST_REF_ADDR]], %swift.refcounted* [[SRC_REF]])
store_weak %a to [initialization] %w : $*@sil_weak CP?

// CHECK: [[SRC_REF:%.*]] = inttoptr {{.*}} %swift.refcounted*
// CHECK: [[SRC_WITNESS:%.*]] = inttoptr {{.*}} i8**
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: store i8** [[SRC_WITNESS]], i8*** [[DEST_WITNESS_ADDR]]
// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: call void @swift_weakAssign(%swift.weak* [[DEST_REF_ADDR]], %swift.refcounted* [[SRC_REF]])
// CHECK: call %swift.weak* @swift_weakAssign(%swift.weak* [[DEST_REF_ADDR]], %swift.refcounted* [[SRC_REF]])
store_weak %a to %w : $*@sil_weak CP?

// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
Expand All @@ -69,7 +69,7 @@ entry(%w : $*@sil_weak CP?, %a : $CP?):

// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* [[V]], i32 0, i32 0
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: call void @swift_weakTakeInit(%swift.weak* [[DEST_REF_ADDR]], %swift.weak* [[SRC_REF_ADDR]])
// CHECK: call %swift.weak* @swift_weakTakeInit(%swift.weak* [[DEST_REF_ADDR]], %swift.weak* [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: [[WITNESS:%.*]] = load i8**, i8*** [[SRC_WITNESS_ADDR]], align 8
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* [[V]], i32 0, i32 1
Expand All @@ -78,7 +78,7 @@ entry(%w : $*@sil_weak CP?, %a : $CP?):

// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* [[V]], i32 0, i32 0
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: call void @swift_weakTakeAssign(%swift.weak* [[DEST_REF_ADDR]], %swift.weak* [[SRC_REF_ADDR]])
// CHECK: call %swift.weak* @swift_weakTakeAssign(%swift.weak* [[DEST_REF_ADDR]], %swift.weak* [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: [[WITNESS:%.*]] = load i8**, i8*** [[SRC_WITNESS_ADDR]], align 8
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* [[V]], i32 0, i32 1
Expand All @@ -87,7 +87,7 @@ entry(%w : $*@sil_weak CP?, %a : $CP?):

// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* [[V]], i32 0, i32 0
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: call void @swift_weakCopyInit(%swift.weak* [[DEST_REF_ADDR]], %swift.weak* [[SRC_REF_ADDR]])
// CHECK: call %swift.weak* @swift_weakCopyInit(%swift.weak* [[DEST_REF_ADDR]], %swift.weak* [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: [[WITNESS:%.*]] = load i8**, i8*** [[SRC_WITNESS_ADDR]], align 8
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* [[V]], i32 0, i32 1
Expand All @@ -96,7 +96,7 @@ entry(%w : $*@sil_weak CP?, %a : $CP?):

// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* [[V]], i32 0, i32 0
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: call void @swift_weakCopyAssign(%swift.weak* [[DEST_REF_ADDR]], %swift.weak* [[SRC_REF_ADDR]])
// CHECK: call %swift.weak* @swift_weakCopyAssign(%swift.weak* [[DEST_REF_ADDR]], %swift.weak* [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: [[WITNESS:%.*]] = load i8**, i8*** [[SRC_WITNESS_ADDR]], align 8
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* [[V]], i32 0, i32 1
Expand Down
36 changes: 29 additions & 7 deletions test/IRGen/weak.sil
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -emit-ir %s | %FileCheck %s
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -O -S %s | %FileCheck %s --check-prefix=TAILCALL

// REQUIRES: CPU=x86_64
// XFAIL: linux
Expand All @@ -15,15 +16,15 @@ sil_stage canonical

import Swift

class C {}
public class C {}
sil_vtable C {}
sil @_T04weak1CCfD : $@convention(method) (C) -> ()

protocol P : class {
func explode()
}

struct A {
public struct A {
weak var x : C?
}

Expand All @@ -46,7 +47,7 @@ bb0(%0 : $*A, %1 : $Optional<C>):
// CHECK-NEXT: [[T0:%.*]] = call [[C]]* bitcast ([[REF]]* ([[WEAK]]*)* @swift_weakLoadStrong to [[C]]* ([[WEAK]]*)*)([[WEAK]]* [[X]])
// CHECK-NEXT: %3 = ptrtoint %T4weak1CC* %2 to i64
// CHECK-NEXT: %4 = inttoptr
// CHECK-NEXT: call void bitcast (void ([[WEAK]]*, [[REF]]*)* @swift_weakAssign to void ([[WEAK]]*, [[C]]*)*)([[WEAK]]* [[X]], [[C]]* %4)
// CHECK-NEXT: call void bitcast ([[WEAK]]* ([[WEAK]]*, [[REF]]*)* @swift_weakAssign to void ([[WEAK]]*, [[C]]*)*)([[WEAK]]* [[X]], [[C]]* %4)
// CHECK-NEXT: %5 = inttoptr i64 %3 to %swift.refcounted*
// CHECK-NEXT: call void @swift_rt_swift_release([[REF]]* %5)
// CHECK-NEXT: ret void
Expand Down Expand Up @@ -109,43 +110,64 @@ bb0(%0 : $Optional<P>):
// CHECK-NEXT: [[SRC:%.*]] = bitcast [[BUFFER]]* [[SRCBUF]] to [[A]]*
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[DEST]], i32 0, i32 0
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[SRC]], i32 0, i32 0
// CHECK-NEXT: call void @swift_weakCopyInit([[WEAK]]* [[T0]], [[WEAK]]* [[T1]])
// CHECK-NEXT: call [[WEAK]]* @swift_weakCopyInit([[WEAK]]* [[T0]], [[WEAK]]* [[T1]])
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]

// TAILCALL: __T04weak1AVwCP:
// TAILCALL: jmp _swift_weakCopyInit

// destroy
// CHECK: define linkonce_odr hidden void @_T04weak1AVwxx([[OPAQUE]]* noalias [[ARG:%.*]], [[TYPE]]*
// CHECK: [[T0:%.*]] = bitcast [[OPAQUE]]* [[ARG]] to [[A]]*
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[T0]], i32 0, i32 0
// CHECK-NEXT: call void @swift_weakDestroy([[WEAK]]* [[T1]])
// CHECK-NEXT: ret void

// TAILCALL: __T04weak1AVwxx:
// TAILCALL: jmp _swift_weakDestroy

// initializeWithCopy
// CHECK: define linkonce_odr hidden [[OPAQUE]]* @_T04weak1AVwcp([[OPAQUE]]* noalias [[DEST_OPQ:%.*]], [[OPAQUE]]* noalias [[SRC_OPQ:%.*]], [[TYPE]]*
// CHECK: [[DEST:%.*]] = bitcast [[OPAQUE]]* [[DEST_OPQ]] to [[A]]*
// CHECK-NEXT: [[SRC:%.*]] = bitcast [[OPAQUE]]* [[SRC_OPQ]] to [[A]]*
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[DEST]], i32 0, i32 0
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[SRC]], i32 0, i32 0
// CHECK-NEXT: call void @swift_weakCopyInit([[WEAK]]* [[T0]], [[WEAK]]* [[T1]])
// CHECK-NEXT: call [[WEAK]]* @swift_weakCopyInit([[WEAK]]* [[T0]], [[WEAK]]* [[T1]])
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]

// TAILCALL: __T04weak1AVwcp:
// TAILCALL: jmp _swift_weakCopyInit

// assignWithCopy
// CHECK: define linkonce_odr hidden [[OPAQUE]]* @_T04weak1AVwca([[OPAQUE]]* [[DEST_OPQ:%.*]], [[OPAQUE]]* [[SRC_OPQ:%.*]], [[TYPE]]*
// CHECK: [[DEST:%.*]] = bitcast [[OPAQUE]]* [[DEST_OPQ]] to [[A]]*
// CHECK-NEXT: [[SRC:%.*]] = bitcast [[OPAQUE]]* [[SRC_OPQ]] to [[A]]*
// CHECK-NEXT: [[DEST_X:%.*]] = getelementptr inbounds [[A]], [[A]]* [[DEST]], i32 0, i32 0
// CHECK-NEXT: [[SRC_X:%.*]] = getelementptr inbounds [[A]], [[A]]* [[SRC]], i32 0, i32 0
// CHECK-NEXT: call void @swift_weakCopyAssign([[WEAK]]* [[DEST_X]], [[WEAK]]* [[SRC_X]])
// CHECK-NEXT: call [[WEAK]]* @swift_weakCopyAssign([[WEAK]]* [[DEST_X]], [[WEAK]]* [[SRC_X]])
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]

// TAILCALL: __T04weak1AVwca:
// TAILCALL: jmp _swift_weakCopyAssign

// assignWithTake
// CHECK: define linkonce_odr hidden [[OPAQUE]]* @_T04weak1AVwta([[OPAQUE]]* noalias [[DEST_OPQ:%.*]], [[OPAQUE]]* noalias [[SRC_OPQ:%.*]], [[TYPE]]*
// CHECK: [[DEST:%.*]] = bitcast [[OPAQUE]]* [[DEST_OPQ]] to [[A]]*
// CHECK-NEXT: [[SRC:%.*]] = bitcast [[OPAQUE]]* [[SRC_OPQ]] to [[A]]*
// CHECK-NEXT: [[DEST_X:%.*]] = getelementptr inbounds [[A]], [[A]]* [[DEST]], i32 0, i32 0
// CHECK-NEXT: [[SRC_X:%.*]] = getelementptr inbounds [[A]], [[A]]* [[SRC]], i32 0, i32 0
// CHECK-NEXT: call void @swift_weakTakeAssign([[WEAK]]* [[DEST_X]], [[WEAK]]* [[SRC_X]])
// CHECK-NEXT: call [[WEAK]]* @swift_weakTakeAssign([[WEAK]]* [[DEST_X]], [[WEAK]]* [[SRC_X]])
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]

// TAILCALL: __T04weak1AVwtk:
// TAILCALL: jmp _swift_weakTakeInit

// TAILCALL: __T04weak1AVwta:
// TAILCALL: jmp _swift_weakTakeAssign

// TAILCALL: __T04weak1AVwTK:
// TAILCALL: jmp _swift_weakTakeInit
2 changes: 1 addition & 1 deletion test/IRGen/weak_class_protocol.sil
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ protocol Foo: class { }
// CHECK: store i8** [[WTABLE]], i8*** [[WTABLE_SLOT]], align 8
// CHECK: [[INSTANCE_SLOT:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK-objc: call void @swift_unknownWeakAssign(%swift.weak* [[INSTANCE_SLOT]], %objc_object* [[INSTANCE]]) {{#[0-9]+}}
// CHECK-native: call void @swift_weakAssign(%swift.weak* [[INSTANCE_SLOT]], %swift.refcounted* [[INSTANCE]]) {{#[0-9]+}}
// CHECK-native: call %swift.weak* @swift_weakAssign(%swift.weak* [[INSTANCE_SLOT]], %swift.refcounted* [[INSTANCE]]) {{#[0-9]+}}
// CHECK: ret void
// CHECK: }
sil @store_weak : $@convention(thin) (@owned Foo?) -> @out @sil_weak Foo? {
Expand Down
Loading