Skip to content

Commit 5198724

Browse files
committed
[Runtime] Initialize function pointers with the original values, check against those values to call directly.
Instruments relies on the old values being there so it can call the original implementation. This has very slightly worse codegen but the impact should be minimal.
1 parent 9fd03e2 commit 5198724

File tree

1 file changed

+21
-24
lines changed

1 file changed

+21
-24
lines changed

stdlib/public/runtime/HeapObject.cpp

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,15 @@ static HeapObject *_swift_allocObject_(HeapMetadata const *metadata,
9595
HeapObject *swift::swift_allocObject(HeapMetadata const *metadata,
9696
size_t requiredSize,
9797
size_t requiredAlignmentMask) {
98-
if (SWIFT_UNLIKELY(_swift_allocObject))
98+
if (SWIFT_UNLIKELY(_swift_allocObject != _swift_allocObject_))
9999
return _swift_allocObject(metadata, requiredSize, requiredAlignmentMask);
100-
else
101-
return _swift_allocObject_(metadata, requiredSize, requiredAlignmentMask);
100+
return _swift_allocObject_(metadata, requiredSize, requiredAlignmentMask);
102101
}
103102

104103
HeapObject *(*swift::_swift_allocObject)(HeapMetadata const *metadata,
105104
size_t requiredSize,
106-
size_t requiredAlignmentMask);
105+
size_t requiredAlignmentMask) =
106+
_swift_allocObject_;
107107

108108
HeapObject *
109109
swift::swift_initStackObject(HeapMetadata const *metadata,
@@ -305,13 +305,12 @@ static HeapObject *_swift_retain_(HeapObject *object) {
305305
}
306306

307307
HeapObject *swift::swift_retain(HeapObject *object) {
308-
if (SWIFT_UNLIKELY(_swift_retain))
308+
if (SWIFT_UNLIKELY(_swift_retain != _swift_retain_))
309309
return _swift_retain(object);
310-
else
311-
return _swift_retain_(object);
310+
return _swift_retain_(object);
312311
}
313312

314-
HeapObject *(*swift::_swift_retain)(HeapObject *object);
313+
HeapObject *(*swift::_swift_retain)(HeapObject *object) = _swift_retain_;
315314

316315
HeapObject *swift::swift_nonatomic_retain(HeapObject *object) {
317316
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_retain);
@@ -328,13 +327,13 @@ static HeapObject *_swift_retain_n_(HeapObject *object, uint32_t n) {
328327
}
329328

330329
HeapObject *swift::swift_retain_n(HeapObject *object, uint32_t n) {
331-
if (SWIFT_UNLIKELY(_swift_retain_n))
330+
if (SWIFT_UNLIKELY(_swift_retain_n != _swift_retain_n_))
332331
return _swift_retain_n(object, n);
333-
else
334-
return _swift_retain_n_(object, n);
332+
return _swift_retain_n_(object, n);
335333
}
336334

337-
HeapObject *(*swift::_swift_retain_n)(HeapObject *object, uint32_t n);
335+
HeapObject *(*swift::_swift_retain_n)(HeapObject *object, uint32_t n) =
336+
_swift_retain_n_;
338337

339338
HeapObject *swift::swift_nonatomic_retain_n(HeapObject *object, uint32_t n) {
340339
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_retain_n);
@@ -350,13 +349,12 @@ static void _swift_release_(HeapObject *object) {
350349
}
351350

352351
void swift::swift_release(HeapObject *object) {
353-
if (SWIFT_UNLIKELY(_swift_release))
352+
if (SWIFT_UNLIKELY(_swift_release != _swift_release_))
354353
_swift_release(object);
355-
else
356-
_swift_release_(object);
354+
_swift_release_(object);
357355
}
358356

359-
void (*swift::_swift_release)(HeapObject *object);
357+
void (*swift::_swift_release)(HeapObject *object) = _swift_release_;
360358

361359
void swift::swift_nonatomic_release(HeapObject *object) {
362360
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_release);
@@ -371,13 +369,13 @@ static void _swift_release_n_(HeapObject *object, uint32_t n) {
371369
}
372370

373371
void swift::swift_release_n(HeapObject *object, uint32_t n) {
374-
if (SWIFT_UNLIKELY(_swift_release_n))
372+
if (SWIFT_UNLIKELY(_swift_release_n != _swift_release_n_))
375373
return _swift_release_n(object, n);
376-
else
377-
return _swift_release_n_(object, n);
374+
return _swift_release_n_(object, n);
378375
}
379376

380-
void (*swift::_swift_release_n)(HeapObject *object, uint32_t n);
377+
void (*swift::_swift_release_n)(HeapObject *object, uint32_t n) =
378+
_swift_release_n_;
381379

382380
void swift::swift_nonatomic_release_n(HeapObject *object, uint32_t n) {
383381
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_release_n);
@@ -511,13 +509,12 @@ static HeapObject *_swift_tryRetain_(HeapObject *object) {
511509
}
512510

513511
HeapObject *swift::swift_tryRetain(HeapObject *object) {
514-
if (SWIFT_UNLIKELY(_swift_tryRetain))
512+
if (SWIFT_UNLIKELY(_swift_tryRetain != _swift_tryRetain_))
515513
return _swift_tryRetain(object);
516-
else
517-
return _swift_tryRetain_(object);
514+
return _swift_tryRetain_(object);
518515
}
519516

520-
HeapObject *(*swift::_swift_tryRetain)(HeapObject *object);
517+
HeapObject *(*swift::_swift_tryRetain)(HeapObject *object) = _swift_tryRetain_;
521518

522519
bool swift::swift_isDeallocating(HeapObject *object) {
523520
if (!isValidPointerForNativeRetain(object))

0 commit comments

Comments
 (0)