Skip to content

Commit a39c831

Browse files
committed
Add llvm:Attribute::Returned to the weak runtime functions
rdar://18172130
1 parent efe22fc commit a39c831

File tree

3 files changed

+46
-14
lines changed

3 files changed

+46
-14
lines changed

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -464,17 +464,17 @@ FUNCTION(NativeWeakDestroy, swift_weakDestroy, DefaultCC,
464464
ARGS(WeakReferencePtrTy),
465465
ATTRS(NoUnwind))
466466

467-
// void swift_weakInit(WeakReference *object, void *value);
467+
// WeakReference *swift_weakInit(WeakReference *object, void *value);
468468
FUNCTION(NativeWeakInit, swift_weakInit, DefaultCC,
469469
RETURNS(WeakReferencePtrTy),
470470
ARGS(WeakReferencePtrTy, RefCountedPtrTy),
471-
ATTRS(NoUnwind))
471+
ATTRS(NoUnwind, FirstParamReturned))
472472

473-
// void swift_weakAssign(WeakReference *object, void *value);
473+
// WeakReferencePtr *swift_weakAssign(WeakReference *object, void *value);
474474
FUNCTION(NativeWeakAssign, swift_weakAssign, DefaultCC,
475475
RETURNS(WeakReferencePtrTy),
476476
ARGS(WeakReferencePtrTy, RefCountedPtrTy),
477-
ATTRS(NoUnwind))
477+
ATTRS(NoUnwind, FirstParamReturned))
478478

479479
// void *swift_weakLoadStrong(WeakReference *object);
480480
FUNCTION(NativeWeakLoadStrong, swift_weakLoadStrong,DefaultCC,
@@ -488,29 +488,29 @@ FUNCTION(NativeWeakTakeStrong, swift_weakTakeStrong,DefaultCC,
488488
ARGS(WeakReferencePtrTy),
489489
ATTRS(NoUnwind))
490490

491-
// void swift_weakCopyInit(WeakReference *dest, WeakReference *src);
491+
// WeakReference *swift_weakCopyInit(WeakReference *dest, WeakReference *src);
492492
FUNCTION(NativeWeakCopyInit, swift_weakCopyInit, DefaultCC,
493493
RETURNS(WeakReferencePtrTy),
494494
ARGS(WeakReferencePtrTy, WeakReferencePtrTy),
495-
ATTRS(NoUnwind))
495+
ATTRS(NoUnwind, FirstParamReturned))
496496

497-
// void swift_weakTakeInit(WeakReference *dest, WeakReference *src);
497+
// WeakReference *swift_weakTakeInit(WeakReference *dest, WeakReference *src);
498498
FUNCTION(NativeWeakTakeInit, swift_weakTakeInit, DefaultCC,
499499
RETURNS(WeakReferencePtrTy),
500500
ARGS(WeakReferencePtrTy, WeakReferencePtrTy),
501-
ATTRS(NoUnwind))
501+
ATTRS(NoUnwind, FirstParamReturned))
502502

503-
// void swift_weakCopyAssign(WeakReference *dest, WeakReference *src);
503+
// WeakReference *swift_weakCopyAssign(WeakReference *dest, WeakReference *src);
504504
FUNCTION(NativeWeakCopyAssign, swift_weakCopyAssign, DefaultCC,
505505
RETURNS(WeakReferencePtrTy),
506506
ARGS(WeakReferencePtrTy, WeakReferencePtrTy),
507-
ATTRS(NoUnwind))
507+
ATTRS(NoUnwind, FirstParamReturned))
508508

509-
// void swift_weakTakeAssign(WeakReference *dest, WeakReference *src);
509+
// WeakReference *swift_weakTakeAssign(WeakReference *dest, WeakReference *src);
510510
FUNCTION(NativeWeakTakeAssign, swift_weakTakeAssign, DefaultCC,
511511
RETURNS(WeakReferencePtrTy),
512512
ARGS(WeakReferencePtrTy, WeakReferencePtrTy),
513-
ATTRS(NoUnwind))
513+
ATTRS(NoUnwind, FirstParamReturned))
514514

515515
// void swift_unknownWeakDestroy(WeakReference *object);
516516
FUNCTION(UnknownWeakDestroy, swift_unknownWeakDestroy, DefaultCC,

lib/IRGen/IRGenModule.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,7 @@ namespace RuntimeConstants {
428428
const auto NoReturn = llvm::Attribute::NoReturn;
429429
const auto NoUnwind = llvm::Attribute::NoUnwind;
430430
const auto ZExt = llvm::Attribute::ZExt;
431+
const auto FirstParamReturned = llvm::Attribute::Returned;
431432
} // namespace RuntimeConstants
432433

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

440446
llvm::Constant *swift::getRuntimeFn(llvm::Module &Module,
441447
llvm::Constant *&cache,
@@ -471,15 +477,19 @@ llvm::Constant *swift::getRuntimeFn(llvm::Module &Module,
471477

472478
llvm::AttrBuilder buildFnAttr;
473479
llvm::AttrBuilder buildRetAttr;
480+
llvm::AttrBuilder buildFirstParamAttr;
474481

475482
for (auto Attr : attrs) {
476483
if (isReturnAttribute(Attr))
477484
buildRetAttr.addAttribute(Attr);
485+
else if (isReturnedAttribute(Attr))
486+
buildFirstParamAttr.addAttribute(Attr);
478487
else
479488
buildFnAttr.addAttribute(Attr);
480489
}
481490
fn->addAttributes(llvm::AttributeList::FunctionIndex, buildFnAttr);
482491
fn->addAttributes(llvm::AttributeList::ReturnIndex, buildRetAttr);
492+
fn->addParamAttrs(0, buildFirstParamAttr);
483493
}
484494

485495
return cache;

test/IRGen/weak.sil

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -emit-ir %s | %FileCheck %s
2+
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -O -S %s | %FileCheck %s --check-prefix=TAILCALL
23

34
// REQUIRES: CPU=x86_64
45
// XFAIL: linux
@@ -15,15 +16,15 @@ sil_stage canonical
1516

1617
import Swift
1718

18-
class C {}
19+
public class C {}
1920
sil_vtable C {}
2021
sil @_T04weak1CCfD : $@convention(method) (C) -> ()
2122

2223
protocol P : class {
2324
func explode()
2425
}
2526

26-
struct A {
27+
public struct A {
2728
weak var x : C?
2829
}
2930

@@ -113,13 +114,19 @@ bb0(%0 : $Optional<P>):
113114
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
114115
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]
115116

117+
// TAILCALL: __T04weak1AVwCP:
118+
// TAILCALL: jmp _swift_weakCopyInit
119+
116120
// destroy
117121
// CHECK: define linkonce_odr hidden void @_T04weak1AVwxx([[OPAQUE]]* noalias [[ARG:%.*]], [[TYPE]]*
118122
// CHECK: [[T0:%.*]] = bitcast [[OPAQUE]]* [[ARG]] to [[A]]*
119123
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[T0]], i32 0, i32 0
120124
// CHECK-NEXT: call void @swift_weakDestroy([[WEAK]]* [[T1]])
121125
// CHECK-NEXT: ret void
122126

127+
// TAILCALL: __T04weak1AVwxx:
128+
// TAILCALL: jmp _swift_weakDestroy
129+
123130
// initializeWithCopy
124131
// CHECK: define linkonce_odr hidden [[OPAQUE]]* @_T04weak1AVwcp([[OPAQUE]]* noalias [[DEST_OPQ:%.*]], [[OPAQUE]]* noalias [[SRC_OPQ:%.*]], [[TYPE]]*
125132
// CHECK: [[DEST:%.*]] = bitcast [[OPAQUE]]* [[DEST_OPQ]] to [[A]]*
@@ -130,6 +137,9 @@ bb0(%0 : $Optional<P>):
130137
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
131138
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]
132139

140+
// TAILCALL: __T04weak1AVwcp:
141+
// TAILCALL: jmp _swift_weakCopyInit
142+
133143
// assignWithCopy
134144
// CHECK: define linkonce_odr hidden [[OPAQUE]]* @_T04weak1AVwca([[OPAQUE]]* [[DEST_OPQ:%.*]], [[OPAQUE]]* [[SRC_OPQ:%.*]], [[TYPE]]*
135145
// CHECK: [[DEST:%.*]] = bitcast [[OPAQUE]]* [[DEST_OPQ]] to [[A]]*
@@ -140,6 +150,9 @@ bb0(%0 : $Optional<P>):
140150
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
141151
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]
142152

153+
// TAILCALL: __T04weak1AVwca:
154+
// TAILCALL: jmp _swift_weakCopyAssign
155+
143156
// assignWithTake
144157
// CHECK: define linkonce_odr hidden [[OPAQUE]]* @_T04weak1AVwta([[OPAQUE]]* noalias [[DEST_OPQ:%.*]], [[OPAQUE]]* noalias [[SRC_OPQ:%.*]], [[TYPE]]*
145158
// CHECK: [[DEST:%.*]] = bitcast [[OPAQUE]]* [[DEST_OPQ]] to [[A]]*
@@ -149,3 +162,12 @@ bb0(%0 : $Optional<P>):
149162
// CHECK-NEXT: call [[WEAK]]* @swift_weakTakeAssign([[WEAK]]* [[DEST_X]], [[WEAK]]* [[SRC_X]])
150163
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[DEST]] to [[OPAQUE]]*
151164
// CHECK-NEXT: ret [[OPAQUE]]* [[T0]]
165+
166+
// TAILCALL: __T04weak1AVwtk:
167+
// TAILCALL: jmp _swift_weakTakeInit
168+
169+
// TAILCALL: __T04weak1AVwta:
170+
// TAILCALL: jmp _swift_weakTakeAssign
171+
172+
// TAILCALL: __T04weak1AVwTK:
173+
// TAILCALL: jmp _swift_weakTakeInit

0 commit comments

Comments
 (0)