Skip to content

Commit 9f14e24

Browse files
authored
Merge pull request #64715 from al45tair/eng/PR-107360391-5.9
[Backtracing] Support specifying a hard-coded path for swift-backtrace.
2 parents ba6bed1 + 58d542e commit 9f14e24

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
@@ -163,12 +163,25 @@ static_assert((SWIFT_BACKTRACE_ENVIRONMENT_SIZE % SWIFT_PAGE_SIZE) == 0,
163163

164164
#if _WIN32
165165
#pragma section(SWIFT_BACKTRACE_SECTION, read, write)
166+
167+
#if defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
168+
const WCHAR swiftBacktracePath[] = L"" SWIFT_RUNTIME_FIXED_BACKTRACER_PATH;
169+
#else
166170
__declspec(allocate(SWIFT_BACKTRACE_SECTION)) WCHAR swiftBacktracePath[SWIFT_BACKTRACE_BUFFER_SIZE];
171+
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
172+
167173
__declspec(allocate(SWIFT_BACKTRACE_SECTION)) CHAR swiftBacktraceEnv[SWIFT_BACKTRACE_ENVIRONMENT_SIZE];
174+
168175
#elif defined(__linux__) || TARGET_OS_OSX
176+
177+
#if defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
178+
const char swiftBacktracePath[] = SWIFT_RUNTIME_FIXED_BACKTRACER_PATH;
179+
#else
169180
char swiftBacktracePath[SWIFT_BACKTRACE_BUFFER_SIZE] __attribute__((section(SWIFT_BACKTRACE_SECTION), aligned(SWIFT_PAGE_SIZE)));
181+
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH
182+
170183
char swiftBacktraceEnv[SWIFT_BACKTRACE_ENVIRONMENT_SIZE] __attribute__((section(SWIFT_BACKTRACE_SECTION), aligned(SWIFT_PAGE_SIZE)));
171-
#endif
184+
#endif // defined(__linux__) || TARGET_OS_OSX
172185

173186
void _swift_backtraceSetupEnvironment();
174187

@@ -311,6 +324,7 @@ BacktraceInitializer::BacktraceInitializer() {
311324
_swift_backtraceSettings.preset = Preset::Full;
312325
}
313326

327+
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
314328
if (_swift_backtraceSettings.enabled == OnOffTty::On
315329
&& !_swift_backtraceSettings.swiftBacktracePath) {
316330
_swift_backtraceSettings.swiftBacktracePath
@@ -324,6 +338,7 @@ BacktraceInitializer::BacktraceInitializer() {
324338
_swift_backtraceSettings.enabled = OnOffTty::Off;
325339
}
326340
}
341+
#endif
327342

328343
if (_swift_backtraceSettings.enabled == OnOffTty::On) {
329344
// Copy the path to swift-backtrace into swiftBacktracePath, then write
@@ -336,6 +351,7 @@ BacktraceInitializer::BacktraceInitializer() {
336351
if (_swift_backtraceSettings.algorithm == UnwindAlgorithm::Auto)
337352
_swift_backtraceSettings.algorithm = UnwindAlgorithm::Precise;
338353

354+
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
339355
int len = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
340356
_swift_backtraceSettings.swiftBacktracePath, -1,
341357
swiftBacktracePath,
@@ -356,6 +372,7 @@ BacktraceInitializer::BacktraceInitializer() {
356372
::GetLastError());
357373
_swift_backtraceSettings.enabled = OnOffTty::Off;
358374
}
375+
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
359376

360377
_swift_backtraceSetupEnvironment();
361378

@@ -373,6 +390,7 @@ BacktraceInitializer::BacktraceInitializer() {
373390
if (_swift_backtraceSettings.algorithm == UnwindAlgorithm::Auto)
374391
_swift_backtraceSettings.algorithm = UnwindAlgorithm::Precise;
375392

393+
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
376394
size_t len = strlen(_swift_backtraceSettings.swiftBacktracePath);
377395
if (len > SWIFT_BACKTRACE_BUFFER_SIZE - 1) {
378396
swift::warning(0,
@@ -397,6 +415,7 @@ BacktraceInitializer::BacktraceInitializer() {
397415
}
398416
#endif // PROTECT_BACKTRACE_SETTINGS
399417
}
418+
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
400419

401420
_swift_backtraceSetupEnvironment();
402421

@@ -619,6 +638,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
619638
}
620639
} else if (key.equals_insensitive("cache")) {
621640
_swift_backtraceSettings.cache = parseBoolean(value);
641+
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
622642
} else if (key.equals_insensitive("swift-backtrace")) {
623643
size_t len = value.size();
624644
char *path = (char *)std::malloc(len + 1);
@@ -627,6 +647,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
627647

628648
std::free(const_cast<char *>(_swift_backtraceSettings.swiftBacktracePath));
629649
_swift_backtraceSettings.swiftBacktracePath = path;
650+
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
630651
} else {
631652
swift::warning(0,
632653
"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
@@ -240,6 +240,7 @@
240240
'swift_darwin_supported_archs': None,
241241
'swift_freestanding_is_darwin': False,
242242
'swift_profile_instr_use': None,
243+
'swift_runtime_fixed_backtracer_path': None,
243244
'swift_stdlib_assertions': True,
244245
'swift_stdlib_build_variant': 'Debug',
245246
'swift_tools_ld64_lto_codegen_only_for_supporting_targets': False,
@@ -754,6 +755,7 @@ class BuildScriptImplOption(_BaseOption):
754755
PathOption('--cmake-c-launcher'),
755756
PathOption('--cmake-cxx-launcher'),
756757
PathOption('--swift-profile-instr-use'),
758+
PathOption('--swift-runtime-fixed-backtracer-path'),
757759

758760
IntOption('--benchmark-num-o-iterations'),
759761
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)