Skip to content

Commit ec1e051

Browse files
committed
Add runtime library support for tracking the invocations of runtime functions.
1 parent 196fe68 commit ec1e051

File tree

4 files changed

+401
-0
lines changed

4 files changed

+401
-0
lines changed

stdlib/public/runtime/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ set(swift_runtime_sources
5858
ProtocolConformance.cpp
5959
RefCount.cpp
6060
RuntimeEntrySymbols.cpp
61+
RuntimeInvocationsTracking.cpp
6162
"${SWIFT_SOURCE_DIR}/lib/Demangling/OldDemangler.cpp"
6263
"${SWIFT_SOURCE_DIR}/lib/Demangling/Demangler.cpp"
6364
"${SWIFT_SOURCE_DIR}/lib/Demangling/NodePrinter.cpp"

stdlib/public/runtime/HeapObject.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "llvm/Support/MathExtras.h"
2525
#include "MetadataCache.h"
2626
#include "Private.h"
27+
#include "RuntimeInvocationsTracking.h"
2728
#include "WeakReference.h"
2829
#include "swift/Runtime/Debug.h"
2930
#include <algorithm>
@@ -297,6 +298,7 @@ void swift::swift_nonatomic_retain(HeapObject *object) {
297298
SWIFT_RT_ENTRY_IMPL_VISIBILITY
298299
extern "C"
299300
void SWIFT_RT_ENTRY_IMPL(swift_nonatomic_retain)(HeapObject *object) {
301+
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_retain);
300302
if (isValidPointerForNativeRetain(object))
301303
object->refCounts.incrementNonAtomic(1);
302304
}
@@ -308,6 +310,7 @@ void swift::swift_nonatomic_release(HeapObject *object) {
308310
SWIFT_RT_ENTRY_IMPL_VISIBILITY
309311
extern "C"
310312
void SWIFT_RT_ENTRY_IMPL(swift_nonatomic_release)(HeapObject *object) {
313+
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_release);
311314
if (isValidPointerForNativeRetain(object))
312315
object->refCounts.decrementAndMaybeDeinitNonAtomic(1);
313316
}
@@ -316,6 +319,7 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
316319
extern "C"
317320
void SWIFT_RT_ENTRY_IMPL(swift_retain)(HeapObject *object)
318321
SWIFT_CC(RegisterPreservingCC_IMPL) {
322+
SWIFT_RT_TRACK_INVOCATION(object, swift_retain);
319323
if (isValidPointerForNativeRetain(object))
320324
object->refCounts.increment(1);
321325
}
@@ -329,6 +333,7 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
329333
extern "C"
330334
void SWIFT_RT_ENTRY_IMPL(swift_retain_n)(HeapObject *object, uint32_t n)
331335
SWIFT_CC(RegisterPreservingCC_IMPL) {
336+
SWIFT_RT_TRACK_INVOCATION(object, swift_retain_n);
332337
if (isValidPointerForNativeRetain(object))
333338
object->refCounts.increment(n);
334339
}
@@ -342,6 +347,7 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
342347
extern "C"
343348
void SWIFT_RT_ENTRY_IMPL(swift_nonatomic_retain_n)(HeapObject *object, uint32_t n)
344349
SWIFT_CC(RegisterPreservingCC_IMPL) {
350+
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_retain_n);
345351
if (isValidPointerForNativeRetain(object))
346352
object->refCounts.incrementNonAtomic(n);
347353
}
@@ -355,6 +361,7 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
355361
extern "C"
356362
void SWIFT_RT_ENTRY_IMPL(swift_release)(HeapObject *object)
357363
SWIFT_CC(RegisterPreservingCC_IMPL) {
364+
SWIFT_RT_TRACK_INVOCATION(object, swift_release);
358365
if (isValidPointerForNativeRetain(object))
359366
object->refCounts.decrementAndMaybeDeinit(1);
360367
}
@@ -368,11 +375,13 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
368375
extern "C"
369376
void SWIFT_RT_ENTRY_IMPL(swift_release_n)(HeapObject *object, uint32_t n)
370377
SWIFT_CC(RegisterPreservingCC_IMPL) {
378+
SWIFT_RT_TRACK_INVOCATION(object, swift_release_n);
371379
if (isValidPointerForNativeRetain(object))
372380
object->refCounts.decrementAndMaybeDeinit(n);
373381
}
374382

375383
void swift::swift_setDeallocating(HeapObject *object) {
384+
SWIFT_RT_TRACK_INVOCATION(object, swift_setDeallocating);
376385
object->refCounts.decrementFromOneNonAtomic();
377386
}
378387

@@ -385,6 +394,7 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
385394
extern "C"
386395
void SWIFT_RT_ENTRY_IMPL(swift_nonatomic_release_n)(HeapObject *object, uint32_t n)
387396
SWIFT_CC(RegisterPreservingCC_IMPL) {
397+
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_release_n);
388398
if (isValidPointerForNativeRetain(object))
389399
object->refCounts.decrementAndMaybeDeinitNonAtomic(n);
390400
}
@@ -399,6 +409,7 @@ size_t swift::swift_unownedRetainCount(HeapObject *object) {
399409

400410
void swift::swift_unownedRetain(HeapObject *object)
401411
SWIFT_CC(RegisterPreservingCC_IMPL) {
412+
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRetain);
402413
if (!isValidPointerForNativeRetain(object))
403414
return;
404415

@@ -407,6 +418,7 @@ void swift::swift_unownedRetain(HeapObject *object)
407418

408419
void swift::swift_unownedRelease(HeapObject *object)
409420
SWIFT_CC(RegisterPreservingCC_IMPL) {
421+
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRelease);
410422
if (!isValidPointerForNativeRetain(object))
411423
return;
412424

@@ -425,6 +437,7 @@ void swift::swift_unownedRelease(HeapObject *object)
425437

426438
void swift::swift_nonatomic_unownedRetain(HeapObject *object)
427439
SWIFT_CC(RegisterPreservingCC_IMPL) {
440+
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_unownedRetain);
428441
if (!isValidPointerForNativeRetain(object))
429442
return;
430443

@@ -433,6 +446,7 @@ void swift::swift_nonatomic_unownedRetain(HeapObject *object)
433446

434447
void swift::swift_nonatomic_unownedRelease(HeapObject *object)
435448
SWIFT_CC(RegisterPreservingCC_IMPL) {
449+
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_unownedRelease);
436450
if (!isValidPointerForNativeRetain(object))
437451
return;
438452

@@ -451,6 +465,7 @@ void swift::swift_nonatomic_unownedRelease(HeapObject *object)
451465

452466
void swift::swift_unownedRetain_n(HeapObject *object, int n)
453467
SWIFT_CC(RegisterPreservingCC_IMPL) {
468+
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRetain_n);
454469
if (!isValidPointerForNativeRetain(object))
455470
return;
456471

@@ -459,6 +474,7 @@ void swift::swift_unownedRetain_n(HeapObject *object, int n)
459474

460475
void swift::swift_unownedRelease_n(HeapObject *object, int n)
461476
SWIFT_CC(RegisterPreservingCC_IMPL) {
477+
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRelease_n);
462478
if (!isValidPointerForNativeRetain(object))
463479
return;
464480

@@ -476,6 +492,7 @@ void swift::swift_unownedRelease_n(HeapObject *object, int n)
476492

477493
void swift::swift_nonatomic_unownedRetain_n(HeapObject *object, int n)
478494
SWIFT_CC(RegisterPreservingCC_IMPL) {
495+
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_unownedRetain_n);
479496
if (!isValidPointerForNativeRetain(object))
480497
return;
481498

@@ -484,6 +501,7 @@ void swift::swift_nonatomic_unownedRetain_n(HeapObject *object, int n)
484501

485502
void swift::swift_nonatomic_unownedRelease_n(HeapObject *object, int n)
486503
SWIFT_CC(RegisterPreservingCC_IMPL) {
504+
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRelease_n);
487505
if (!isValidPointerForNativeRetain(object))
488506
return;
489507

@@ -501,6 +519,7 @@ void swift::swift_nonatomic_unownedRelease_n(HeapObject *object, int n)
501519

502520
HeapObject *swift::swift_tryPin(HeapObject *object)
503521
SWIFT_CC(RegisterPreservingCC_IMPL) {
522+
SWIFT_RT_TRACK_INVOCATION(object, swift_tryPin);
504523
assert(isValidPointerForNativeRetain(object));
505524

506525
// Try to set the flag. If this succeeds, the caller will be
@@ -515,6 +534,7 @@ HeapObject *swift::swift_tryPin(HeapObject *object)
515534

516535
void swift::swift_unpin(HeapObject *object)
517536
SWIFT_CC(RegisterPreservingCC_IMPL) {
537+
SWIFT_RT_TRACK_INVOCATION(object, swift_unpin);
518538
if (isValidPointerForNativeRetain(object))
519539
object->refCounts.decrementAndUnpinAndMaybeDeinit();
520540
}
@@ -526,6 +546,7 @@ HeapObject *swift::swift_tryRetain(HeapObject *object)
526546

527547
HeapObject *swift::swift_nonatomic_tryPin(HeapObject *object)
528548
SWIFT_CC(RegisterPreservingCC_IMPL) {
549+
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_tryPin);
529550
assert(object);
530551

531552
// Try to set the flag. If this succeeds, the caller will be
@@ -540,6 +561,7 @@ HeapObject *swift::swift_nonatomic_tryPin(HeapObject *object)
540561

541562
void swift::swift_nonatomic_unpin(HeapObject *object)
542563
SWIFT_CC(RegisterPreservingCC_IMPL) {
564+
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_unpin);
543565
if (isValidPointerForNativeRetain(object))
544566
object->refCounts.decrementAndUnpinAndMaybeDeinitNonAtomic();
545567
}
@@ -548,6 +570,7 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
548570
extern "C"
549571
HeapObject *SWIFT_RT_ENTRY_IMPL(swift_tryRetain)(HeapObject *object)
550572
SWIFT_CC(RegisterPreservingCC_IMPL) {
573+
SWIFT_RT_TRACK_INVOCATION(object, swift_tryRetain);
551574
if (!isValidPointerForNativeRetain(object))
552575
return nullptr;
553576

@@ -570,6 +593,7 @@ bool SWIFT_RT_ENTRY_IMPL(swift_isDeallocating)(HeapObject *object) {
570593

571594
void swift::swift_unownedRetainStrong(HeapObject *object)
572595
SWIFT_CC(RegisterPreservingCC_IMPL) {
596+
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRetainStrong);
573597
if (!isValidPointerForNativeRetain(object))
574598
return;
575599
assert(object->refCounts.getUnownedCount() &&
@@ -581,6 +605,7 @@ void swift::swift_unownedRetainStrong(HeapObject *object)
581605

582606
void swift::swift_nonatomic_unownedRetainStrong(HeapObject *object)
583607
SWIFT_CC(RegisterPreservingCC_IMPL) {
608+
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_unownedRetainStrong);
584609
if (!isValidPointerForNativeRetain(object))
585610
return;
586611
assert(object->refCounts.getUnownedCount() &&
@@ -592,6 +617,7 @@ void swift::swift_nonatomic_unownedRetainStrong(HeapObject *object)
592617

593618
void swift::swift_unownedRetainStrongAndRelease(HeapObject *object)
594619
SWIFT_CC(RegisterPreservingCC_IMPL) {
620+
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRetainStrongAndRelease);
595621
if (!isValidPointerForNativeRetain(object))
596622
return;
597623
assert(object->refCounts.getUnownedCount() &&
@@ -608,6 +634,7 @@ void swift::swift_unownedRetainStrongAndRelease(HeapObject *object)
608634

609635
void swift::swift_nonatomic_unownedRetainStrongAndRelease(HeapObject *object)
610636
SWIFT_CC(RegisterPreservingCC_IMPL) {
637+
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_unownedRetainStrongAndRelease);
611638
if (!isValidPointerForNativeRetain(object))
612639
return;
613640
assert(object->refCounts.getUnownedCount() &&

0 commit comments

Comments
 (0)