Skip to content

Commit c112918

Browse files
Merge pull request #11986 from aschwaighofer/return_dest_from_retain
runtime: return the argument from swift_retain family of functions
2 parents f519532 + bc68d51 commit c112918

32 files changed

+315
-273
lines changed

include/swift/Runtime/Config.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,15 @@
190190

191191
#endif
192192

193+
// The runtime implementation uses the preserve_most convention to save
194+
// registers spills on the hot path.
195+
#if __has_attribute(preserve_most) && \
196+
(defined(__aarch64__) || defined(__x86_64__))
197+
#define SWIFT_CC_PreserveMost __attribute__((preserve_most))
198+
#else
199+
#define SWIFT_CC_PreserveMost
200+
#endif
201+
193202
// Generates a name of the runtime entry's implementation by
194203
// adding an underscore as a prefix and a suffix.
195204
#define SWIFT_RT_ENTRY_IMPL(Name) _##Name##_

include/swift/Runtime/HeapObject.h

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,10 @@ void swift_slowDealloc(void *ptr, size_t bytes, size_t alignMask)
204204
///
205205
/// \param object - may be null, in which case this is a no-op
206206
///
207+
/// \return object - we return the object because this enables tail call
208+
/// optimization and the argument register to be live through the call on
209+
/// architectures whose argument and return register is the same register.
210+
///
207211
/// POSSIBILITIES: We may end up wanting a bunch of different variants:
208212
/// - the general version which correctly handles null values, swift
209213
/// objects, and ObjC objects
@@ -213,34 +217,35 @@ void swift_slowDealloc(void *ptr, size_t bytes, size_t alignMask)
213217
/// It may also prove worthwhile to have this use a custom CC
214218
/// which preserves a larger set of registers.
215219
SWIFT_RT_ENTRY_VISIBILITY
216-
void swift_retain(HeapObject *object)
220+
HeapObject *swift_retain(HeapObject *object)
217221
SWIFT_CC(RegisterPreservingCC);
218222

219223
SWIFT_RUNTIME_EXPORT
220-
void (*SWIFT_CC(RegisterPreservingCC) _swift_retain)(HeapObject *object);
224+
HeapObject *(*SWIFT_CC(RegisterPreservingCC) _swift_retain)(HeapObject *object);
221225

222226
SWIFT_RT_ENTRY_VISIBILITY
223-
void swift_retain_n(HeapObject *object, uint32_t n)
227+
HeapObject *swift_retain_n(HeapObject *object, uint32_t n)
224228
SWIFT_CC(RegisterPreservingCC);
225229

226230
SWIFT_RUNTIME_EXPORT
227-
void (*SWIFT_CC(RegisterPreservingCC) _swift_retain_n)(HeapObject *object,
228-
uint32_t n);
231+
HeapObject *(*SWIFT_CC(RegisterPreservingCC)
232+
_swift_retain_n)(HeapObject *object, uint32_t n);
229233

230234
SWIFT_RT_ENTRY_VISIBILITY
231-
void swift_nonatomic_retain(HeapObject *object)
235+
HeapObject *swift_nonatomic_retain(HeapObject *object)
232236
SWIFT_CC(RegisterPreservingCC);
233237

234238
SWIFT_RUNTIME_EXPORT
235-
void (*SWIFT_CC(RegisterPreservingCC) _swift_nonatomic_retain)(HeapObject *object);
239+
HeapObject *(*SWIFT_CC(RegisterPreservingCC)
240+
_swift_nonatomic_retain)(HeapObject *object);
236241

237242
SWIFT_RT_ENTRY_VISIBILITY
238-
void swift_nonatomic_retain_n(HeapObject *object, uint32_t n)
243+
HeapObject* swift_nonatomic_retain_n(HeapObject *object, uint32_t n)
239244
SWIFT_CC(RegisterPreservingCC);
240245

241246
SWIFT_RUNTIME_EXPORT
242-
void (*SWIFT_CC(RegisterPreservingCC) _swift_nonatomic_retain_n)(HeapObject *object,
243-
uint32_t n);
247+
HeapObject *(*SWIFT_CC(RegisterPreservingCC)
248+
_swift_nonatomic_retain_n)(HeapObject *object, uint32_t n);
244249

245250
/// Atomically increments the reference count of an object, unless it has
246251
/// already been destroyed. Returns nil if the object is dead.
@@ -525,7 +530,7 @@ struct UnownedReference {
525530

526531
/// Increment the unowned retain count.
527532
SWIFT_RT_ENTRY_VISIBILITY
528-
void swift_unownedRetain(HeapObject *value)
533+
HeapObject *swift_unownedRetain(HeapObject *value)
529534
SWIFT_CC(RegisterPreservingCC);
530535

531536
/// Decrement the unowned retain count.
@@ -535,7 +540,7 @@ void swift_unownedRelease(HeapObject *value)
535540

536541
/// Increment the unowned retain count.
537542
SWIFT_RT_ENTRY_VISIBILITY
538-
void swift_nonatomic_unownedRetain(HeapObject *value)
543+
void *swift_nonatomic_unownedRetain(HeapObject *value)
539544
SWIFT_CC(RegisterPreservingCC);
540545

541546
/// Decrement the unowned retain count.
@@ -545,7 +550,7 @@ void swift_nonatomic_unownedRelease(HeapObject *value)
545550

546551
/// Increment the unowned retain count by n.
547552
SWIFT_RT_ENTRY_VISIBILITY
548-
void swift_unownedRetain_n(HeapObject *value, int n)
553+
HeapObject *swift_unownedRetain_n(HeapObject *value, int n)
549554
SWIFT_CC(RegisterPreservingCC);
550555

551556
/// Decrement the unowned retain count by n.
@@ -555,7 +560,7 @@ void swift_unownedRelease_n(HeapObject *value, int n)
555560

556561
/// Increment the unowned retain count by n.
557562
SWIFT_RT_ENTRY_VISIBILITY
558-
void swift_nonatomic_unownedRetain_n(HeapObject *value, int n)
563+
HeapObject *swift_nonatomic_unownedRetain_n(HeapObject *value, int n)
559564
SWIFT_CC(RegisterPreservingCC);
560565

561566
/// Decrement the unowned retain count by n.
@@ -566,13 +571,13 @@ void swift_nonatomic_unownedRelease_n(HeapObject *value, int n)
566571
/// Increment the strong retain count of an object, aborting if it has
567572
/// been deallocated.
568573
SWIFT_RT_ENTRY_VISIBILITY
569-
void swift_unownedRetainStrong(HeapObject *value)
574+
HeapObject *swift_unownedRetainStrong(HeapObject *value)
570575
SWIFT_CC(RegisterPreservingCC);
571576

572577
/// Increment the strong retain count of an object, aborting if it has
573578
/// been deallocated.
574579
SWIFT_RT_ENTRY_VISIBILITY
575-
void swift_nonatomic_unownedRetainStrong(HeapObject *value)
580+
HeapObject *swift_nonatomic_unownedRetainStrong(HeapObject *value)
576581
SWIFT_CC(RegisterPreservingCC);
577582

578583
/// Increment the strong retain count of an object which may have been
@@ -770,46 +775,46 @@ void *swift_nonatomic_bridgeObjectRetain_n(void *value, int n)
770775
/// Increment the strong retain count of an object which might not be a native
771776
/// Swift object.
772777
SWIFT_RUNTIME_EXPORT
773-
void swift_unknownRetain(void *value)
778+
void *swift_unknownRetain(void *value)
774779
SWIFT_CC(DefaultCC);
775780
/// Increment the strong retain count of an object which might not be a native
776781
/// Swift object by n.
777782
SWIFT_RUNTIME_EXPORT
778-
void swift_unknownRetain_n(void *value, int n)
783+
void *swift_unknownRetain_n(void *value, int n)
779784
SWIFT_CC(DefaultCC);
780785

781786
/// Increment the strong retain count of an object which might not be a native
782787
/// Swift object.
783788
SWIFT_RUNTIME_EXPORT
784-
void swift_nonatomic_unknownRetain(void *value)
789+
void *swift_nonatomic_unknownRetain(void *value)
785790
SWIFT_CC(DefaultCC);
786791
/// Increment the strong retain count of an object which might not be a native
787792
/// Swift object by n.
788793
SWIFT_RUNTIME_EXPORT
789-
void swift_nonatomic_unknownRetain_n(void *value, int n)
794+
void *swift_nonatomic_unknownRetain_n(void *value, int n)
790795
SWIFT_CC(DefaultCC);
791796

792797

793798
#else
794799

795-
static inline void swift_unknownRetain(void *value)
800+
static inline void *swift_unknownRetain(void *value)
796801
SWIFT_CC(DefaultCC) {
797-
swift_retain(static_cast<HeapObject *>(value));
802+
return swift_retain(static_cast<HeapObject *>(value));
798803
}
799804

800-
static inline void swift_unknownRetain_n(void *value, int n)
805+
static inline void *swift_unknownRetain_n(void *value, int n)
801806
SWIFT_CC(DefaultCC) {
802-
swift_retain_n(static_cast<HeapObject *>(value), n);
807+
return swift_retain_n(static_cast<HeapObject *>(value), n);
803808
}
804809

805-
static inline void swift_nonatomic_unknownRetain(void *value)
810+
static inline void *swift_nonatomic_unknownRetain(void *value)
806811
SWIFT_CC(DefaultCC) {
807-
swift_nonatomic_retain(static_cast<HeapObject *>(value));
812+
return swift_nonatomic_retain(static_cast<HeapObject *>(value));
808813
}
809814

810-
static inline void swift_nonatomic_unknownRetain_n(void *value, int n)
815+
static inline void *swift_nonatomic_unknownRetain_n(void *value, int n)
811816
SWIFT_CC(DefaultCC) {
812-
swift_nonatomic_retain_n(static_cast<HeapObject *>(value), n);
817+
return swift_nonatomic_retain_n(static_cast<HeapObject *>(value), n);
813818
}
814819

815820

include/swift/Runtime/InstrumentsSupport.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ SWIFT_RUNTIME_EXPORT
2929
BoxPair::Return (*_swift_allocBox)(Metadata const *type);
3030

3131
SWIFT_RUNTIME_EXPORT
32-
void (*_swift_retain)(HeapObject *object);
32+
HeapObject *(*_swift_retain)(HeapObject *object);
3333
SWIFT_RUNTIME_EXPORT
34-
void (*_swift_retain_n)(HeapObject *object, uint32_t n);
34+
HeapObject *(*_swift_retain_n)(HeapObject *object, uint32_t n);
3535
SWIFT_RUNTIME_EXPORT
36-
void (*_swift_nonatomic_retain)(HeapObject *object);
36+
HeapObject *(*_swift_nonatomic_retain)(HeapObject *object);
3737
SWIFT_RUNTIME_EXPORT
3838
HeapObject *(*_swift_tryRetain)(HeapObject *object);
3939
SWIFT_RUNTIME_EXPORT

0 commit comments

Comments
 (0)