Skip to content

Commit 967c5c6

Browse files
authored
Merge pull request #69542 from mikeash/retain-release-override-optional
[Runtime] Add option to remove override point for retain/release.
2 parents 5e0125b + 6606850 commit 967c5c6

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
@@ -268,6 +268,10 @@ option(SWIFT_STDLIB_INSTALL_PARENT_MODULE_FOR_SHIMS
268268
"Install a parent module map for Swift shims."
269269
${SWIFT_STDLIB_INSTALL_PARENT_MODULE_FOR_SHIMS_default})
270270

271+
option(SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE
272+
"Allow retain/release functions to be overridden by indirecting through function pointers."
273+
TRUE)
274+
271275
set(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH "" CACHE STRING
272276
"If set, provides a fixed path to the swift-backtrace binary. This
273277
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
@@ -358,6 +358,10 @@ function(_add_target_variant_swift_compile_flags
358358
list(APPEND result "-D" "SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY")
359359
endif()
360360

361+
if(SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE)
362+
list(APPEND result "-D" "SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE")
363+
endif()
364+
361365
string(TOUPPER "${SWIFT_SDK_${sdk}_THREADING_PACKAGE}" _threading_package)
362366
list(APPEND result "-D" "SWIFT_THREADING_${_threading_package}")
363367

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
@@ -2633,6 +2633,7 @@ build-swift-stdlib-unicode-data=0
26332633
build-swift-stdlib-static-print=1
26342634
darwin-crash-reporter-client=0
26352635
swift-stdlib-use-relative-protocol-witness-tables=1
2636+
swift-stdlib-overridable-retain-release=0
26362637

26372638
[preset: stdlib_S_standalone_minimal_macho_x86_64,build]
26382639
mixin-preset=

utils/build-script-impl

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

250251
## FREESTANDING Stdlib Options
251252
swift-freestanding-flavor "" "when building the FREESTANDING stdlib, which build style to use (options: apple, linux)"
@@ -1878,6 +1879,7 @@ for host in "${ALL_HOSTS[@]}"; do
18781879
-DLIBDISPATCH_CMAKE_BUILD_TYPE:STRING="${LIBDISPATCH_BUILD_TYPE}"
18791880
-DSWIFT_PATH_TO_SWIFT_SYNTAX_SOURCE:PATH="${SWIFT_SYNTAX_SOURCE_DIR}"
18801881
-DSWIFT_ENABLE_BACKTRACING:BOOL=$(true_false "${SWIFT_ENABLE_BACKTRACING}")
1882+
-DSWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE:BOOL=$(true_false "${SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE}")
18811883
"${swift_cmake_options[@]}"
18821884
)
18831885

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)