Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions stdlib/cmake/modules/StdlibOptions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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.")
23 changes: 22 additions & 1 deletion stdlib/public/runtime/Backtrace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -359,6 +375,7 @@ BacktraceInitializer::BacktraceInitializer() {
::GetLastError());
_swift_backtraceSettings.enabled = OnOffTty::Off;
}
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)

_swift_backtraceSetupEnvironment();

Expand All @@ -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,
Expand All @@ -400,6 +418,7 @@ BacktraceInitializer::BacktraceInitializer() {
}
#endif // PROTECT_BACKTRACE_SETTINGS
}
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)

_swift_backtraceSetupEnvironment();

Expand Down Expand Up @@ -632,6 +651,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
"swift runtime: unknown output-to setting '%.*s'\n",
static_cast<int>(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);
Expand All @@ -640,6 +660,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,

std::free(const_cast<char *>(_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",
Expand Down
5 changes: 5 additions & 0 deletions stdlib/public/runtime/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 15 additions & 0 deletions utils/build-script-impl
Original file line number Diff line number Diff line change
Expand Up @@ -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)"
Expand Down Expand Up @@ -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[@]}"
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions utils/build_swift/build_swift/driver_arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'],
Expand Down
2 changes: 2 additions & 0 deletions utils/build_swift/tests/expected_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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'),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down