diff --git a/stdlib/cmake/modules/StdlibOptions.cmake b/stdlib/cmake/modules/StdlibOptions.cmake index b917afaec4757..880d45be93d72 100644 --- a/stdlib/cmake/modules/StdlibOptions.cmake +++ b/stdlib/cmake/modules/StdlibOptions.cmake @@ -234,3 +234,8 @@ option(SWIFT_STDLIB_CONCURRENCY_TRACING option(SWIFT_STDLIB_USE_RELATIVE_PROTOCOL_WITNESS_TABLES "Use relative protocol witness tables" FALSE) + +set(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH "" CACHE STRING + "If set, provides a fixed path to the swift-backtrace binary. This + will disable dynamic determination of the path and will also disable + the setting in SWIFT_BACKTRACE.") diff --git a/stdlib/public/runtime/Backtrace.cpp b/stdlib/public/runtime/Backtrace.cpp index 50eeb853580fc..41f306551596a 100644 --- a/stdlib/public/runtime/Backtrace.cpp +++ b/stdlib/public/runtime/Backtrace.cpp @@ -166,12 +166,25 @@ static_assert((SWIFT_BACKTRACE_ENVIRONMENT_SIZE % SWIFT_PAGE_SIZE) == 0, #if _WIN32 #pragma section(SWIFT_BACKTRACE_SECTION, read, write) + +#if defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) +const WCHAR swiftBacktracePath[] = L"" SWIFT_RUNTIME_FIXED_BACKTRACER_PATH; +#else __declspec(allocate(SWIFT_BACKTRACE_SECTION)) WCHAR swiftBacktracePath[SWIFT_BACKTRACE_BUFFER_SIZE]; +#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) + __declspec(allocate(SWIFT_BACKTRACE_SECTION)) CHAR swiftBacktraceEnv[SWIFT_BACKTRACE_ENVIRONMENT_SIZE]; + #elif defined(__linux__) || TARGET_OS_OSX + +#if defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) +const char swiftBacktracePath[] = SWIFT_RUNTIME_FIXED_BACKTRACER_PATH; +#else char swiftBacktracePath[SWIFT_BACKTRACE_BUFFER_SIZE] __attribute__((section(SWIFT_BACKTRACE_SECTION), aligned(SWIFT_PAGE_SIZE))); +#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH + char swiftBacktraceEnv[SWIFT_BACKTRACE_ENVIRONMENT_SIZE] __attribute__((section(SWIFT_BACKTRACE_SECTION), aligned(SWIFT_PAGE_SIZE))); -#endif +#endif // defined(__linux__) || TARGET_OS_OSX void _swift_backtraceSetupEnvironment(); @@ -314,6 +327,7 @@ BacktraceInitializer::BacktraceInitializer() { _swift_backtraceSettings.preset = Preset::Full; } +#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) if (_swift_backtraceSettings.enabled == OnOffTty::On && !_swift_backtraceSettings.swiftBacktracePath) { _swift_backtraceSettings.swiftBacktracePath @@ -327,6 +341,7 @@ BacktraceInitializer::BacktraceInitializer() { _swift_backtraceSettings.enabled = OnOffTty::Off; } } +#endif if (_swift_backtraceSettings.enabled == OnOffTty::On) { // Copy the path to swift-backtrace into swiftBacktracePath, then write @@ -339,6 +354,7 @@ BacktraceInitializer::BacktraceInitializer() { if (_swift_backtraceSettings.algorithm == UnwindAlgorithm::Auto) _swift_backtraceSettings.algorithm = UnwindAlgorithm::Precise; +#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) int len = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, _swift_backtraceSettings.swiftBacktracePath, -1, swiftBacktracePath, @@ -359,6 +375,7 @@ BacktraceInitializer::BacktraceInitializer() { ::GetLastError()); _swift_backtraceSettings.enabled = OnOffTty::Off; } +#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) _swift_backtraceSetupEnvironment(); @@ -376,6 +393,7 @@ BacktraceInitializer::BacktraceInitializer() { if (_swift_backtraceSettings.algorithm == UnwindAlgorithm::Auto) _swift_backtraceSettings.algorithm = UnwindAlgorithm::Precise; +#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) size_t len = strlen(_swift_backtraceSettings.swiftBacktracePath); if (len > SWIFT_BACKTRACE_BUFFER_SIZE - 1) { swift::warning(0, @@ -400,6 +418,7 @@ BacktraceInitializer::BacktraceInitializer() { } #endif // PROTECT_BACKTRACE_SETTINGS } +#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) _swift_backtraceSetupEnvironment(); @@ -632,6 +651,7 @@ _swift_processBacktracingSetting(llvm::StringRef key, "swift runtime: unknown output-to setting '%.*s'\n", static_cast(value.size()), value.data()); } +#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) } else if (key.equals_insensitive("swift-backtrace")) { size_t len = value.size(); char *path = (char *)std::malloc(len + 1); @@ -640,6 +660,7 @@ _swift_processBacktracingSetting(llvm::StringRef key, std::free(const_cast(_swift_backtraceSettings.swiftBacktracePath)); _swift_backtraceSettings.swiftBacktracePath = path; +#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) } else { swift::warning(0, "swift runtime: unknown backtracing setting '%.*s'\n", diff --git a/stdlib/public/runtime/CMakeLists.txt b/stdlib/public/runtime/CMakeLists.txt index 6b886e30b9c48..e5adea1fa1a8a 100644 --- a/stdlib/public/runtime/CMakeLists.txt +++ b/stdlib/public/runtime/CMakeLists.txt @@ -18,6 +18,11 @@ if(SWIFT_RUNTIME_ENABLE_LEAK_CHECKER) set(swift_runtime_leaks_sources Leaks.mm) endif() +if(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) + list(APPEND swift_runtime_compile_flags + "-DSWIFT_RUNTIME_FIXED_BACKTRACER_PATH=\"${SWIFT_RUNTIME_FIXED_BACKTRACER_PATH}\"") +endif() + set(swift_runtime_objc_sources ErrorObject.mm SwiftObject.mm diff --git a/utils/build-script-impl b/utils/build-script-impl index eb1b110e12c05..9721000de0eed 100755 --- a/utils/build-script-impl +++ b/utils/build-script-impl @@ -236,6 +236,7 @@ KNOWN_SETTINGS=( swift-enable-experimental-string-processing "1" "whether to build experimental string processing feature" swift-earlyswiftsyntax "0" "use the early SwiftSyntax" swift-enable-backtracing "1" "whether to build the backtracing support" + swift-runtime-fixed-backtracer-path "" "if set, use a fixed path for the backtracer" ## FREESTANDING Stdlib Options 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 ) fi + if [[ "${SWIFT_RUNTIME_FIXED_BACKTRACER_PATH}" ]] ; then + swift_cmake_options=( + "${swift_cmake_options[@]}" + -DSWIFT_RUNTIME_FIXED_BACKTRACER_PATH:STRING="${SWIFT_RUNTIME_FIXED_BACKTRACER_PATH}" + ) + fi + if [[ "${EXTRA_SWIFT_ARGS}" ]] ; then swift_cmake_options=( "${swift_cmake_options[@]}" @@ -2050,6 +2058,13 @@ for host in "${ALL_HOSTS[@]}"; do ) fi + if [[ "${SWIFT_RUNTIME_FIXED_BACKTRACER_PATH}" ]] ; then + cmake_options=( + "${cmake_options[@]}" + -DSWIFT_RUNTIME_FIXED_BACKTRACER_PATH:STRING="${SWIFT_RUNTIME_FIXED_BACKTRACER_PATH}" + ) + fi + # SWIFT_THREADING_PACKAGE can be: # # - Empty diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py index 3b33deaf0047f..022da31d33219 100644 --- a/utils/build_swift/build_swift/driver_arguments.py +++ b/utils/build_swift/build_swift/driver_arguments.py @@ -455,6 +455,8 @@ def create_argument_parser(): option('--swift-enable-backtracing', toggle_true, default=True, help='enable backtracing support') + option('--swift-runtime-fixed-backtracer-path', store, + help='if set, provide a fixed path for the Swift backtracer') option('--compiler-vendor', store, choices=['none', 'apple'], diff --git a/utils/build_swift/tests/expected_options.py b/utils/build_swift/tests/expected_options.py index 2a74476b45b16..f96914666034a 100644 --- a/utils/build_swift/tests/expected_options.py +++ b/utils/build_swift/tests/expected_options.py @@ -239,6 +239,7 @@ 'swift_darwin_supported_archs': None, 'swift_freestanding_is_darwin': False, 'swift_profile_instr_use': None, + 'swift_runtime_fixed_backtracer_path': None, 'swift_stdlib_assertions': True, 'swift_stdlib_build_variant': 'Debug', 'swift_tools_ld64_lto_codegen_only_for_supporting_targets': False, @@ -752,6 +753,7 @@ class BuildScriptImplOption(_BaseOption): PathOption('--cmake-c-launcher'), PathOption('--cmake-cxx-launcher'), PathOption('--swift-profile-instr-use'), + PathOption('--swift-runtime-fixed-backtracer-path'), IntOption('--benchmark-num-o-iterations'), IntOption('--benchmark-num-onone-iterations'), diff --git a/utils/swift_build_support/swift_build_support/build_script_invocation.py b/utils/swift_build_support/swift_build_support/build_script_invocation.py index f7e3e1f3e53e2..470cf9eaa685c 100644 --- a/utils/swift_build_support/swift_build_support/build_script_invocation.py +++ b/utils/swift_build_support/swift_build_support/build_script_invocation.py @@ -386,6 +386,13 @@ def convert_to_impl_arguments(self): if args.maccatalyst_ios_tests: impl_args += ["--darwin-test-maccatalyst-ios-like=1"] + # Provide a fixed backtracer path, if required + if args.swift_runtime_fixed_backtracer_path is not None: + impl_args += [ + '--swift-runtime-fixed-backtracer-path=%s' % + args.swift_runtime_fixed_backtracer_path + ] + # If we have extra_cmake_options, combine all of them together and then # add them as one command. if args.extra_cmake_options: