Skip to content

Commit 6606850

Browse files
committed
[Runtime] Add option to remove override point for retain/release.
Add a `SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE` CMake option. When set to true, swift_retain/release and the other functions in InstrumentsSupport.h can be overridden by setting the appropriate global function pointer, as is already the case. When set to false, those function pointers are removed and the functions always go into the default implementation. Set `SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE` to false when building the minimal stdlib, and set it to true otherwise by default. rdar://115987924
1 parent c10c4fc commit 6606850

File tree

8 files changed

+61
-25
lines changed

8 files changed

+61
-25
lines changed

include/swift/Runtime/InstrumentsSupport.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
namespace swift {
2525

26+
#ifdef SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE
27+
2628
// liboainject patches the function pointers and calls the functions below.
2729
SWIFT_RUNTIME_EXPORT
2830
HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_allocObject)(
@@ -60,6 +62,8 @@ size_t _swift_indexToSize(size_t idx);
6062
SWIFT_RUNTIME_EXPORT
6163
void _swift_zone_init(void);
6264

65+
#endif // SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE
66+
6367
}
6468

6569
#endif

stdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,10 @@ function(_add_target_variant_c_compile_flags)
449449
list(APPEND result "-DSWIFT_STDLIB_USE_RELATIVE_PROTOCOL_WITNESS_TABLES")
450450
endif()
451451

452+
if(SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE)
453+
list(APPEND result "-DSWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE")
454+
endif()
455+
452456
list(APPEND result ${SWIFT_STDLIB_EXTRA_C_COMPILE_FLAGS})
453457

454458
set("${CFLAGS_RESULT_VAR_NAME}" "${result}" PARENT_SCOPE)

stdlib/cmake/modules/StdlibOptions.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,10 @@ option(SWIFT_STDLIB_INSTALL_PARENT_MODULE_FOR_SHIMS
264264
"Install a parent module map for Swift shims."
265265
${SWIFT_STDLIB_INSTALL_PARENT_MODULE_FOR_SHIMS_default})
266266

267+
option(SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE
268+
"Allow retain/release functions to be overridden by indirecting through function pointers."
269+
TRUE)
270+
267271
set(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH "" CACHE STRING
268272
"If set, provides a fixed path to the swift-backtrace binary. This
269273
will disable dynamic determination of the path and will also disable

stdlib/cmake/modules/SwiftSource.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,10 @@ function(_add_target_variant_swift_compile_flags
341341
list(APPEND result "-D" "SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY")
342342
endif()
343343

344+
if(SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE)
345+
list(APPEND result "-D" "SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE")
346+
endif()
347+
344348
string(TOUPPER "${SWIFT_SDK_${sdk}_THREADING_PACKAGE}" _threading_package)
345349
list(APPEND result "-D" "SWIFT_THREADING_${_threading_package}")
346350

stdlib/public/runtime/HeapObject.cpp

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ static void _swift_release_n_(HeapObject *object, uint32_t n)
107107
asm("__swift_release_n_");
108108
static HeapObject *_swift_tryRetain_(HeapObject *object)
109109
asm("__swift_tryRetain_");
110+
111+
#ifdef SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE
112+
110113
#define CALL_IMPL(name, args) do { \
111114
void *fptr; \
112115
memcpy(&fptr, (void *)&_ ## name, sizeof(fptr)); \
@@ -117,6 +120,14 @@ static HeapObject *_swift_tryRetain_(HeapObject *object)
117120
return _ ## name ## _ args; \
118121
} while(0)
119122

123+
#else
124+
125+
// If retain/release etc. aren't overridable, just call the real implementation.
126+
#define CALL_IMPL(name, args) \
127+
return _ ## name ## _ args;
128+
129+
#endif
130+
120131
#if SWIFT_STDLIB_HAS_MALLOC_TYPE
121132
static malloc_type_summary_t
122133
computeMallocTypeSummary(const HeapMetadata *heapMetadata) {
@@ -212,6 +223,35 @@ static malloc_type_id_t getMallocTypeId(const HeapMetadata *heapMetadata) {
212223
}
213224
#endif // SWIFT_STDLIB_HAS_MALLOC_TYPE
214225

226+
#ifdef SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE
227+
228+
SWIFT_RUNTIME_EXPORT
229+
HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_allocObject)(
230+
HeapMetadata const *metadata, size_t requiredSize,
231+
size_t requiredAlignmentMask) = _swift_allocObject_;
232+
233+
SWIFT_RUNTIME_EXPORT
234+
HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_retain)(HeapObject *object) =
235+
_swift_retain_;
236+
237+
SWIFT_RUNTIME_EXPORT
238+
HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_retain_n)(
239+
HeapObject *object, uint32_t n) = _swift_retain_n_;
240+
241+
SWIFT_RUNTIME_EXPORT
242+
void (*SWIFT_RT_DECLARE_ENTRY _swift_release)(HeapObject *object) =
243+
_swift_release_;
244+
245+
SWIFT_RUNTIME_EXPORT
246+
void (*SWIFT_RT_DECLARE_ENTRY _swift_release_n)(HeapObject *object,
247+
uint32_t n) = _swift_release_n_;
248+
249+
SWIFT_RUNTIME_EXPORT
250+
HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_tryRetain)(HeapObject *object) =
251+
_swift_tryRetain_;
252+
253+
#endif // SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE
254+
215255
static HeapObject *_swift_allocObject_(HeapMetadata const *metadata,
216256
size_t requiredSize,
217257
size_t requiredAlignmentMask) {
@@ -243,11 +283,6 @@ HeapObject *swift::swift_allocObject(HeapMetadata const *metadata,
243283
CALL_IMPL(swift_allocObject, (metadata, requiredSize, requiredAlignmentMask));
244284
}
245285

246-
SWIFT_RUNTIME_EXPORT
247-
HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_allocObject)(
248-
HeapMetadata const *metadata, size_t requiredSize,
249-
size_t requiredAlignmentMask) = _swift_allocObject_;
250-
251286
HeapObject *
252287
swift::swift_initStackObject(HeapMetadata const *metadata,
253288
HeapObject *object) {
@@ -465,10 +500,6 @@ HeapObject *swift::swift_retain(HeapObject *object) {
465500

466501
CUSTOM_RR_ENTRYPOINTS_DEFINE_ENTRYPOINTS(swift_retain)
467502

468-
SWIFT_RUNTIME_EXPORT
469-
HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_retain)(HeapObject *object) =
470-
_swift_retain_;
471-
472503
HeapObject *swift::swift_nonatomic_retain(HeapObject *object) {
473504
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_retain);
474505
if (isValidPointerForNativeRetain(object))
@@ -492,10 +523,6 @@ HeapObject *swift::swift_retain_n(HeapObject *object, uint32_t n) {
492523
#endif
493524
}
494525

495-
SWIFT_RUNTIME_EXPORT
496-
HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_retain_n)(
497-
HeapObject *object, uint32_t n) = _swift_retain_n_;
498-
499526
HeapObject *swift::swift_nonatomic_retain_n(HeapObject *object, uint32_t n) {
500527
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_retain_n);
501528
if (isValidPointerForNativeRetain(object))
@@ -520,10 +547,6 @@ void swift::swift_release(HeapObject *object) {
520547

521548
CUSTOM_RR_ENTRYPOINTS_DEFINE_ENTRYPOINTS(swift_release)
522549

523-
SWIFT_RUNTIME_EXPORT
524-
void (*SWIFT_RT_DECLARE_ENTRY _swift_release)(HeapObject *object) =
525-
_swift_release_;
526-
527550
void swift::swift_nonatomic_release(HeapObject *object) {
528551
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_release);
529552
if (isValidPointerForNativeRetain(object))
@@ -545,10 +568,6 @@ void swift::swift_release_n(HeapObject *object, uint32_t n) {
545568
#endif
546569
}
547570

548-
SWIFT_RUNTIME_EXPORT
549-
void (*SWIFT_RT_DECLARE_ENTRY _swift_release_n)(HeapObject *object,
550-
uint32_t n) = _swift_release_n_;
551-
552571
void swift::swift_nonatomic_release_n(HeapObject *object, uint32_t n) {
553572
SWIFT_RT_TRACK_INVOCATION(object, swift_nonatomic_release_n);
554573
if (isValidPointerForNativeRetain(object))
@@ -706,10 +725,6 @@ HeapObject *swift::swift_tryRetain(HeapObject *object) {
706725
CALL_IMPL(swift_tryRetain, (object));
707726
}
708727

709-
SWIFT_RUNTIME_EXPORT
710-
HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_tryRetain)(HeapObject *object) =
711-
_swift_tryRetain_;
712-
713728
bool swift::swift_isDeallocating(HeapObject *object) {
714729
if (!isValidPointerForNativeRetain(object))
715730
return false;

utils/build-presets.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2638,6 +2638,7 @@ build-swift-stdlib-unicode-data=0
26382638
build-swift-stdlib-static-print=1
26392639
darwin-crash-reporter-client=0
26402640
swift-stdlib-use-relative-protocol-witness-tables=1
2641+
swift-stdlib-overridable-retain-release=0
26412642

26422643
[preset: stdlib_S_standalone_minimal_macho_x86_64,build]
26432644
mixin-preset=

utils/build-script-impl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ KNOWN_SETTINGS=(
245245
swift-earlyswiftsyntax "0" "use the early SwiftSyntax"
246246
swift-enable-backtracing "1" "whether to build the backtracing support"
247247
swift-runtime-fixed-backtracer-path "" "if set, use a fixed path for the backtracer"
248+
swift-stdlib-overridable-retain-release "1" "whether to allow retain/release functions to be overridden by indirecting through function pointers"
248249

249250
## FREESTANDING Stdlib Options
250251
swift-freestanding-flavor "" "when building the FREESTANDING stdlib, which build style to use (options: apple, linux)"
@@ -1876,6 +1877,7 @@ for host in "${ALL_HOSTS[@]}"; do
18761877
-DLIBDISPATCH_CMAKE_BUILD_TYPE:STRING="${LIBDISPATCH_BUILD_TYPE}"
18771878
-DSWIFT_PATH_TO_SWIFT_SYNTAX_SOURCE:PATH="${SWIFT_SYNTAX_SOURCE_DIR}"
18781879
-DSWIFT_ENABLE_BACKTRACING:BOOL=$(true_false "${SWIFT_ENABLE_BACKTRACING}")
1880+
-DSWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE:BOOL=$(true_false "${SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE}")
18791881
"${swift_cmake_options[@]}"
18801882
)
18811883

utils/swift_build_support/swift_build_support/products/minimalstdlib.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ def build(self, host_target):
167167
self.cmake_options.define(
168168
'SWIFT_STDLIB_USE_RELATIVE_PROTOCOL_WITNESS_TABLES:BOOL', 'TRUE')
169169
self.cmake_options.define('SWIFT_THREADING_PACKAGE:STRING', 'none')
170+
self.cmake_options.define(
171+
'SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE:BOOL', 'FALSE')
170172

171173
# Build!
172174
self.build_with_cmake(["swift-stdlib-freestanding"], build_variant, [],

0 commit comments

Comments
 (0)