Skip to content

Commit 0261a29

Browse files
committed
[Backtracing] Support specifying a hard-coded path for swift-backtrace.
Add a way to disable dynamic lookup of the backtracer path, for situations where a hard-coded path makes more sense. rdar://107360391
1 parent 8990a12 commit 0261a29

File tree

7 files changed

+58
-1
lines changed

7 files changed

+58
-1
lines changed

stdlib/cmake/modules/StdlibOptions.cmake

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,3 +234,8 @@ option(SWIFT_STDLIB_CONCURRENCY_TRACING
234234
option(SWIFT_STDLIB_USE_RELATIVE_PROTOCOL_WITNESS_TABLES
235235
"Use relative protocol witness tables"
236236
FALSE)
237+
238+
set(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH "" CACHE STRING
239+
"If set, provides a fixed path to the swift-backtrace binary. This
240+
will disable dynamic determination of the path and will also disable
241+
the setting in SWIFT_BACKTRACE.")

stdlib/public/runtime/Backtrace.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,25 @@ static_assert((SWIFT_BACKTRACE_ENVIRONMENT_SIZE % SWIFT_PAGE_SIZE) == 0,
166166

167167
#if _WIN32
168168
#pragma section(SWIFT_BACKTRACE_SECTION, read, write)
169+
170+
#if defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
171+
const WCHAR swiftBacktracePath[] = L"" SWIFT_RUNTIME_FIXED_BACKTRACER_PATH;
172+
#else
169173
__declspec(allocate(SWIFT_BACKTRACE_SECTION)) WCHAR swiftBacktracePath[SWIFT_BACKTRACE_BUFFER_SIZE];
174+
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
175+
170176
__declspec(allocate(SWIFT_BACKTRACE_SECTION)) CHAR swiftBacktraceEnv[SWIFT_BACKTRACE_ENVIRONMENT_SIZE];
177+
171178
#elif defined(__linux__) || TARGET_OS_OSX
179+
180+
#if defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
181+
const char swiftBacktracePath[] = SWIFT_RUNTIME_FIXED_BACKTRACER_PATH;
182+
#else
172183
char swiftBacktracePath[SWIFT_BACKTRACE_BUFFER_SIZE] __attribute__((section(SWIFT_BACKTRACE_SECTION), aligned(SWIFT_PAGE_SIZE)));
184+
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH
185+
173186
char swiftBacktraceEnv[SWIFT_BACKTRACE_ENVIRONMENT_SIZE] __attribute__((section(SWIFT_BACKTRACE_SECTION), aligned(SWIFT_PAGE_SIZE)));
174-
#endif
187+
#endif // defined(__linux__) || TARGET_OS_OSX
175188

176189
void _swift_backtraceSetupEnvironment();
177190

@@ -314,6 +327,7 @@ BacktraceInitializer::BacktraceInitializer() {
314327
_swift_backtraceSettings.preset = Preset::Full;
315328
}
316329

330+
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
317331
if (_swift_backtraceSettings.enabled == OnOffTty::On
318332
&& !_swift_backtraceSettings.swiftBacktracePath) {
319333
_swift_backtraceSettings.swiftBacktracePath
@@ -327,6 +341,7 @@ BacktraceInitializer::BacktraceInitializer() {
327341
_swift_backtraceSettings.enabled = OnOffTty::Off;
328342
}
329343
}
344+
#endif
330345

331346
if (_swift_backtraceSettings.enabled == OnOffTty::On) {
332347
// Copy the path to swift-backtrace into swiftBacktracePath, then write
@@ -339,6 +354,7 @@ BacktraceInitializer::BacktraceInitializer() {
339354
if (_swift_backtraceSettings.algorithm == UnwindAlgorithm::Auto)
340355
_swift_backtraceSettings.algorithm = UnwindAlgorithm::Precise;
341356

357+
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
342358
int len = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
343359
_swift_backtraceSettings.swiftBacktracePath, -1,
344360
swiftBacktracePath,
@@ -359,6 +375,7 @@ BacktraceInitializer::BacktraceInitializer() {
359375
::GetLastError());
360376
_swift_backtraceSettings.enabled = OnOffTty::Off;
361377
}
378+
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
362379

363380
_swift_backtraceSetupEnvironment();
364381

@@ -376,6 +393,7 @@ BacktraceInitializer::BacktraceInitializer() {
376393
if (_swift_backtraceSettings.algorithm == UnwindAlgorithm::Auto)
377394
_swift_backtraceSettings.algorithm = UnwindAlgorithm::Precise;
378395

396+
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
379397
size_t len = strlen(_swift_backtraceSettings.swiftBacktracePath);
380398
if (len > SWIFT_BACKTRACE_BUFFER_SIZE - 1) {
381399
swift::warning(0,
@@ -400,6 +418,7 @@ BacktraceInitializer::BacktraceInitializer() {
400418
}
401419
#endif // PROTECT_BACKTRACE_SETTINGS
402420
}
421+
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
403422

404423
_swift_backtraceSetupEnvironment();
405424

@@ -632,6 +651,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
632651
"swift runtime: unknown output-to setting '%.*s'\n",
633652
static_cast<int>(value.size()), value.data());
634653
}
654+
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
635655
} else if (key.equals_insensitive("swift-backtrace")) {
636656
size_t len = value.size();
637657
char *path = (char *)std::malloc(len + 1);
@@ -640,6 +660,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
640660

641661
std::free(const_cast<char *>(_swift_backtraceSettings.swiftBacktracePath));
642662
_swift_backtraceSettings.swiftBacktracePath = path;
663+
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
643664
} else {
644665
swift::warning(0,
645666
"swift runtime: unknown backtracing setting '%.*s'\n",

stdlib/public/runtime/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ if(SWIFT_RUNTIME_ENABLE_LEAK_CHECKER)
1818
set(swift_runtime_leaks_sources Leaks.mm)
1919
endif()
2020

21+
if(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
22+
list(APPEND swift_runtime_compile_flags
23+
"-DSWIFT_RUNTIME_FIXED_BACKTRACER_PATH=\"${SWIFT_RUNTIME_FIXED_BACKTRACER_PATH}\"")
24+
endif()
25+
2126
set(swift_runtime_objc_sources
2227
ErrorObject.mm
2328
SwiftObject.mm

utils/build-script-impl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ KNOWN_SETTINGS=(
236236
swift-enable-experimental-string-processing "1" "whether to build experimental string processing feature"
237237
swift-earlyswiftsyntax "0" "use the early SwiftSyntax"
238238
swift-enable-backtracing "1" "whether to build the backtracing support"
239+
swift-runtime-fixed-backtracer-path "" "if set, use a fixed path for the backtracer"
239240

240241
## FREESTANDING Stdlib Options
241242
swift-freestanding-flavor "" "when building the FREESTANDING stdlib, which build style to use (options: apple, linux)"
@@ -1622,6 +1623,13 @@ for host in "${ALL_HOSTS[@]}"; do
16221623
)
16231624
fi
16241625

1626+
if [[ "${SWIFT_RUNTIME_FIXED_BACKTRACER_PATH}" ]] ; then
1627+
swift_cmake_options=(
1628+
"${swift_cmake_options[@]}"
1629+
-DSWIFT_RUNTIME_FIXED_BACKTRACER_PATH:STRING="${SWIFT_RUNTIME_FIXED_BACKTRACER_PATH}"
1630+
)
1631+
fi
1632+
16251633
if [[ "${EXTRA_SWIFT_ARGS}" ]] ; then
16261634
swift_cmake_options=(
16271635
"${swift_cmake_options[@]}"
@@ -2050,6 +2058,13 @@ for host in "${ALL_HOSTS[@]}"; do
20502058
)
20512059
fi
20522060

2061+
if [[ "${SWIFT_RUNTIME_FIXED_BACKTRACER_PATH}" ]] ; then
2062+
cmake_options=(
2063+
"${cmake_options[@]}"
2064+
-DSWIFT_RUNTIME_FIXED_BACKTRACER_PATH:STRING="${SWIFT_RUNTIME_FIXED_BACKTRACER_PATH}"
2065+
)
2066+
fi
2067+
20532068
# SWIFT_THREADING_PACKAGE can be:
20542069
#
20552070
# - Empty

utils/build_swift/build_swift/driver_arguments.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,8 @@ def create_argument_parser():
455455
option('--swift-enable-backtracing', toggle_true,
456456
default=True,
457457
help='enable backtracing support')
458+
option('--swift-runtime-fixed-backtracer-path', store,
459+
help='if set, provide a fixed path for the Swift backtracer')
458460

459461
option('--compiler-vendor', store,
460462
choices=['none', 'apple'],

utils/build_swift/tests/expected_options.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@
239239
'swift_darwin_supported_archs': None,
240240
'swift_freestanding_is_darwin': False,
241241
'swift_profile_instr_use': None,
242+
'swift_runtime_fixed_backtracer_path': None,
242243
'swift_stdlib_assertions': True,
243244
'swift_stdlib_build_variant': 'Debug',
244245
'swift_tools_ld64_lto_codegen_only_for_supporting_targets': False,
@@ -752,6 +753,7 @@ class BuildScriptImplOption(_BaseOption):
752753
PathOption('--cmake-c-launcher'),
753754
PathOption('--cmake-cxx-launcher'),
754755
PathOption('--swift-profile-instr-use'),
756+
PathOption('--swift-runtime-fixed-backtracer-path'),
755757

756758
IntOption('--benchmark-num-o-iterations'),
757759
IntOption('--benchmark-num-onone-iterations'),

utils/swift_build_support/swift_build_support/build_script_invocation.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,13 @@ def convert_to_impl_arguments(self):
386386
if args.maccatalyst_ios_tests:
387387
impl_args += ["--darwin-test-maccatalyst-ios-like=1"]
388388

389+
# Provide a fixed backtracer path, if required
390+
if args.swift_runtime_fixed_backtracer_path is not None:
391+
impl_args += [
392+
'--swift-runtime-fixed-backtracer-path=%s' %
393+
args.swift_runtime_fixed_backtracer_path
394+
]
395+
389396
# If we have extra_cmake_options, combine all of them together and then
390397
# add them as one command.
391398
if args.extra_cmake_options:

0 commit comments

Comments
 (0)