Skip to content

Commit e55f033

Browse files
authored
Merge pull request #81803 from al45tair/eng/PR-152074531
[6.1][Backtracing] Add warning suppression option, enable it for tests.
2 parents 1c054d7 + 155c0df commit e55f033

File tree

12 files changed

+100
-41
lines changed

12 files changed

+100
-41
lines changed

docs/Backtracing.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ follows:
113113
| | | Otherwise, Swift will locate the binary relative |
114114
| | | to the runtime library, or using ``SWIFT_ROOT``. |
115115
+-----------------+---------+--------------------------------------------------+
116+
| warnings | enabled | Set to ``suppressed`` to disable warning output |
117+
| | | related to the state of the backtracer. This is |
118+
| | | sometimes useful for testing. |
119+
+-----------------+---------+--------------------------------------------------+
116120

117121
(*) On macOS, this defaults to ``no`` rather than ``yes``.
118122

stdlib/public/runtime/Backtrace.cpp

Lines changed: 70 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ SWIFT_RUNTIME_STDLIB_INTERNAL BacktraceSettings _swift_backtraceSettings = {
138138
// format
139139
OutputFormat::Text,
140140

141+
// suppressWarnings
142+
false,
143+
141144
// swiftBacktracePath
142145
NULL,
143146

@@ -336,9 +339,11 @@ BacktraceInitializer::BacktraceInitializer() {
336339

337340
if (!_swift_backtraceSettings.swiftBacktracePath) {
338341
if (_swift_backtraceSettings.enabled == OnOffTty::On) {
339-
swift::warning(0,
340-
"swift runtime: unable to locate swift-backtrace; "
341-
"disabling backtracing.\n");
342+
if (!_swift_backtraceSettings.suppressWarnings) {
343+
swift::warning(0,
344+
"swift runtime: unable to locate swift-backtrace; "
345+
"disabling backtracing.\n");
346+
}
342347
}
343348
_swift_backtraceSettings.enabled = OnOffTty::Off;
344349
}
@@ -357,9 +362,11 @@ BacktraceInitializer::BacktraceInitializer() {
357362

358363
#if !SWIFT_BACKTRACE_ON_CRASH_SUPPORTED
359364
if (_swift_backtraceSettings.enabled != OnOffTty::Off) {
360-
swift::warning(0,
361-
"swift runtime: backtrace-on-crash is not supported on "
362-
"this platform.\n");
365+
if (!_swift_backtraceSettings.suppressWarnings) {
366+
swift::warning(0,
367+
"swift runtime: backtrace-on-crash is not supported on "
368+
"this platform.\n");
369+
}
363370
_swift_backtraceSettings.enabled = OnOffTty::Off;
364371
}
365372
#else
@@ -374,9 +381,11 @@ BacktraceInitializer::BacktraceInitializer() {
374381
// /path/to/some/setuid/binary
375382
//
376383
// i.e. when you're trying to force matters.
377-
swift::warning(0,
378-
"swift runtime: backtrace-on-crash is not supported for "
379-
"privileged executables.\n");
384+
if (!_swift_backtraceSettings.suppressWarnings) {
385+
swift::warning(0,
386+
"swift runtime: backtrace-on-crash is not supported for "
387+
"privileged executables.\n");
388+
}
380389
_swift_backtraceSettings.enabled = OnOffTty::Off;
381390
}
382391

@@ -460,10 +469,12 @@ BacktraceInitializer::BacktraceInitializer() {
460469
swiftBacktracePath,
461470
SWIFT_BACKTRACE_BUFFER_SIZE);
462471
if (!len) {
463-
swift::warning(0,
464-
"swift runtime: unable to convert path to "
465-
"swift-backtrace: %08lx; disabling backtracing.\n",
466-
::GetLastError());
472+
if (!_swift_backtraceSettings.suppressWarnings) {
473+
swift::warning(0,
474+
"swift runtime: unable to convert path to "
475+
"swift-backtrace: %08lx; disabling backtracing.\n",
476+
::GetLastError());
477+
}
467478
_swift_backtraceSettings.enabled = OnOffTty::Off;
468479
}
469480
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
@@ -473,9 +484,11 @@ BacktraceInitializer::BacktraceInitializer() {
473484
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
474485
size_t len = strlen(_swift_backtraceSettings.swiftBacktracePath);
475486
if (len > SWIFT_BACKTRACE_BUFFER_SIZE - 1) {
476-
swift::warning(0,
477-
"swift runtime: path to swift-backtrace is too long; "
478-
"disabling backtracing.\n");
487+
if (!_swift_backtraceSettings.suppressWarnings) {
488+
swift::warning(0,
489+
"swift runtime: path to swift-backtrace is too long; "
490+
"disabling backtracing.\n");
491+
}
479492
_swift_backtraceSettings.enabled = OnOffTty::Off;
480493
} else {
481494
memcpy(swiftBacktracePath,
@@ -492,19 +505,23 @@ BacktraceInitializer::BacktraceInitializer() {
492505
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
493506
if (!writeProtectMemory(swiftBacktracePath,
494507
sizeof(swiftBacktracePath))) {
508+
if (!_swift_backtraceSettings.suppressWarnings) {
495509
swift::warning(0,
496510
"swift runtime: unable to protect path to "
497511
"swift-backtrace at %p; disabling backtracing.\n",
498512
swiftBacktracePath);
499-
_swift_backtraceSettings.enabled = OnOffTty::Off;
513+
}
514+
_swift_backtraceSettings.enabled = OnOffTty::Off;
500515
}
501516
#endif
502517
if (!writeProtectMemory(swiftBacktraceEnv,
503518
sizeof(swiftBacktraceEnv))) {
504-
swift::warning(0,
505-
"swift runtime: unable to protect environment "
506-
"for swift-backtrace at %p; disabling backtracing.\n",
507-
swiftBacktraceEnv);
519+
if (!_swift_backtraceSettings.suppressWarnings) {
520+
swift::warning(0,
521+
"swift runtime: unable to protect environment "
522+
"for swift-backtrace at %p; disabling backtracing.\n",
523+
swiftBacktraceEnv);
524+
}
508525
_swift_backtraceSettings.enabled = OnOffTty::Off;
509526
}
510527
#endif
@@ -515,9 +532,11 @@ BacktraceInitializer::BacktraceInitializer() {
515532
if (_swift_backtraceSettings.enabled == OnOffTty::On) {
516533
ErrorCode err = _swift_installCrashHandler();
517534
if (err != 0) {
518-
swift::warning(0,
519-
"swift runtime: crash handler installation failed; "
520-
"disabling backtracing.\n");
535+
if (!_swift_backtraceSettings.suppressWarnings) {
536+
swift::warning(0,
537+
"swift runtime: crash handler installation failed; "
538+
"disabling backtracing.\n");
539+
}
521540
}
522541
}
523542
#endif
@@ -634,12 +653,14 @@ _swift_processBacktracingSetting(llvm::StringRef key,
634653
_swift_backtraceSettings.timeout = count * 3600;
635654

636655
if (_swift_backtraceSettings.timeout < 0) {
637-
swift::warning(0,
638-
"swift runtime: bad backtracing timeout %ds\n",
639-
_swift_backtraceSettings.timeout);
656+
if (!_swift_backtraceSettings.suppressWarnings) {
657+
swift::warning(0,
658+
"swift runtime: bad backtracing timeout %ds\n",
659+
_swift_backtraceSettings.timeout);
660+
}
640661
_swift_backtraceSettings.timeout = 0;
641662
}
642-
} else {
663+
} else if (!_swift_backtraceSettings.suppressWarnings) {
643664
swift::warning(0,
644665
"swift runtime: bad backtracing timeout '%.*s'\n",
645666
static_cast<int>(value.size()), value.data());
@@ -651,7 +672,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
651672
_swift_backtraceSettings.algorithm = UnwindAlgorithm::Fast;
652673
else if (value.equals_insensitive("precise"))
653674
_swift_backtraceSettings.algorithm = UnwindAlgorithm::Precise;
654-
else {
675+
else if (!_swift_backtraceSettings.suppressWarnings) {
655676
swift::warning(0,
656677
"swift runtime: unknown unwind algorithm '%.*s'\n",
657678
static_cast<int>(value.size()), value.data());
@@ -668,7 +689,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
668689
_swift_backtraceSettings.preset = Preset::Medium;
669690
else if (value.equals_insensitive("full"))
670691
_swift_backtraceSettings.preset = Preset::Full;
671-
else {
692+
else if (!_swift_backtraceSettings.suppressWarnings) {
672693
swift::warning(0,
673694
"swift runtime: unknown backtracing preset '%.*s'\n",
674695
static_cast<int>(value.size()), value.data());
@@ -678,7 +699,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
678699
_swift_backtraceSettings.threads = ThreadsToShow::All;
679700
else if (value.equals_insensitive("crashed"))
680701
_swift_backtraceSettings.threads = ThreadsToShow::Crashed;
681-
else {
702+
else if (!_swift_backtraceSettings.suppressWarnings) {
682703
swift::warning(0,
683704
"swift runtime: unknown threads setting '%.*s'\n",
684705
static_cast<int>(value.size()), value.data());
@@ -690,7 +711,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
690711
_swift_backtraceSettings.registers = RegistersToShow::All;
691712
else if (value.equals_insensitive("crashed"))
692713
_swift_backtraceSettings.registers = RegistersToShow::Crashed;
693-
else {
714+
else if (!_swift_backtraceSettings.suppressWarnings) {
694715
swift::warning(0,
695716
"swift runtime: unknown registers setting '%.*s'\n",
696717
static_cast<int>(value.size()), value.data());
@@ -702,7 +723,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
702723
_swift_backtraceSettings.images = ImagesToShow::All;
703724
else if (value.equals_insensitive("mentioned"))
704725
_swift_backtraceSettings.images = ImagesToShow::Mentioned;
705-
else {
726+
else if (!_swift_backtraceSettings.suppressWarnings) {
706727
swift::warning(0,
707728
"swift runtime: unknown registers setting '%.*s'\n",
708729
static_cast<int>(value.size()), value.data());
@@ -714,7 +735,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
714735
_swift_backtraceSettings.limit = -1;
715736
else if (!value.getAsInteger(0, limit) && limit > 0)
716737
_swift_backtraceSettings.limit = limit;
717-
else {
738+
else if (!_swift_backtraceSettings.suppressWarnings) {
718739
swift::warning(0,
719740
"swift runtime: bad backtrace limit '%.*s'\n",
720741
static_cast<int>(value.size()), value.data());
@@ -724,7 +745,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
724745
// (If you think the next line is wrong, see above.)
725746
if (!value.getAsInteger(0, top) && top >= 0)
726747
_swift_backtraceSettings.top = top;
727-
else {
748+
else if (!_swift_backtraceSettings.suppressWarnings) {
728749
swift::warning(0,
729750
"swift runtime: bad backtrace top count '%.*s'\n",
730751
static_cast<int>(value.size()), value.data());
@@ -771,7 +792,20 @@ _swift_processBacktracingSetting(llvm::StringRef key,
771792
std::free(const_cast<char *>(_swift_backtraceSettings.swiftBacktracePath));
772793
_swift_backtraceSettings.swiftBacktracePath = path;
773794
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
774-
} else {
795+
} else if (key.equals_insensitive("warnings")) {
796+
if (value.equals_insensitive("suppressed")
797+
|| value.equals_insensitive("disabled")
798+
|| value.equals_insensitive("off"))
799+
_swift_backtraceSettings.suppressWarnings = true;
800+
else if (value.equals_insensitive("enabled")
801+
|| value.equals_insensitive("on"))
802+
_swift_backtraceSettings.suppressWarnings = false;
803+
else if (!_swift_backtraceSettings.suppressWarnings) {
804+
swift::warning(0,
805+
"swift runtime: unknown warnings setting '%.*s'\n",
806+
static_cast<int>(value.size()), value.data());
807+
}
808+
} else if (!_swift_backtraceSettings.suppressWarnings) {
775809
swift::warning(0,
776810
"swift runtime: unknown backtracing setting '%.*s'\n",
777811
static_cast<int>(key.size()), key.data());

stdlib/public/runtime/BacktracePrivate.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ struct BacktraceSettings {
127127
OutputTo outputTo;
128128
Symbolication symbolicate;
129129
OutputFormat format;
130+
bool suppressWarnings;
130131
const char *swiftBacktracePath;
131132
const char *outputPath;
132133
};

test/IRGen/lit.local.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ config.substitutions.insert(0, ('%build-irgen-test-overlays',
55
'%target-swift-frontend -enable-objc-interop -disable-objc-attr-requires-foundation-module -emit-module -enable-library-evolution -o %t -sdk %S/Inputs %S/Inputs/ObjectiveC.swift && '
66
'%target-swift-frontend -enable-objc-interop -emit-module -enable-library-evolution -o %t -sdk %S/Inputs %S/Inputs/Foundation.swift -I %t'))
77

8-
config.substitutions.insert(0, ('%build-irgen-test-overlays\(mock-sdk-directory: ([^)]+)\)',
8+
config.substitutions.insert(0, (r'%build-irgen-test-overlays\(mock-sdk-directory: ([^)]+)\)',
99
SubstituteCaptures(r'%target-swift-frontend -enable-objc-interop -disable-objc-attr-requires-foundation-module -emit-module -enable-library-evolution -o %t -sdk \1 \1/ObjectiveC.swift && '
1010
r'%target-swift-frontend -enable-objc-interop -emit-module -enable-library-evolution -o %t -sdk \1 \1/Foundation.swift -I %t')))
1111

test/Interop/lit.local.cfg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,12 @@ config.substitutions.insert(0, ('%target-interop-build-clang', '%target-clang -
5959
config.substitutions.insert(0, ('%target-interop-build-clangxx', '%target-clangxx --std=gnu++14 ' + clang_opt))
6060

6161
# Test parsing of the generated C++ header in different C++ language modes.
62-
config.substitutions.insert(0, ('%check-interop-cxx-header-in-clang\(([^)]+)\)',
62+
config.substitutions.insert(0, (r'%check-interop-cxx-header-in-clang\(([^)]+)\)',
6363
SubstituteCaptures(r'%check-cxx-header-in-clang -std=c++14 -Wno-padded -Wno-c11-extensions -D_LIBCPP_CSTDLIB ' + clang_compile_opt + r'\1 && '
6464
r'%check-cxx-header-in-clang -std=c++17 -Wno-padded -Wno-c11-extensions -D_LIBCPP_CSTDLIB ' + clang_compile_opt + r'\1 && '
6565
r'%check-cxx-header-in-clang -std=c++20 -Wno-padded -Wno-c11-extensions -D_LIBCPP_CSTDLIB ' + clang_compile_opt + r'\1')))
6666

6767
# Test parsing of the generated C header in different C language modes.
68-
config.substitutions.insert(0, ('%check-interop-c-header-in-clang\(([^)]+)\)',
68+
config.substitutions.insert(0, (r'%check-interop-c-header-in-clang\(([^)]+)\)',
6969
SubstituteCaptures(r'%check-c-header-in-clang -std=c99 -Wno-padded -Wno-c11-extensions -Wno-pre-c11-compat \1 && '
7070
r'%check-c-header-in-clang -std=c11 -Wno-padded -Wno-pre-c11-compat \1')))

test/ModuleInterface/ModuleCache/module-cache-diagnostics.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// RUN: %empty-directory(%t)
22
// RUN: %empty-directory(%t/modulecache)
3+
// RUN: export SWIFT_BACKTRACE=
34

45
// rdar://88830153
56
// https://github.com/apple/swift/issues/58134

test/lit.cfg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ if backtracing is not None:
551551

552552
backtrace_on_crash = lit_config.params.get('backtrace_on_crash', None)
553553
if backtrace_on_crash is not None:
554-
config.environment['SWIFT_BACKTRACE'] = 'enable=on'
554+
config.environment['SWIFT_BACKTRACE'] = 'enable=on,warnings=suppressed'
555555

556556
# Make an explicit setting in the environment override whatever we did above
557557
swift_backtrace = os.environ.get('SWIFT_BACKTRACE')
@@ -2988,7 +2988,7 @@ if hasattr(config, 'target_link_sdk_future_version'):
29882988
config.substitutions.append(('%target-link-sdk-future-version',
29892989
config.target_link_sdk_future_version))
29902990

2991-
run_filecheck = '%s %s --allow-unused-prefixes --sanitize BUILD_DIR=%s --sanitize SOURCE_DIR=%s --use-filecheck %s %s %s' % (
2991+
run_filecheck = '%s %s --allow-unused-prefixes --sanitize BUILD_DIR=%s --sanitize SOURCE_DIR=%s --ignore-runtime-warnings --use-filecheck %s %s %s' % (
29922992
shell_quote(sys.executable),
29932993
shell_quote(config.PathSanitizingFileCheck),
29942994
# LLVM Lit performs realpath with the config path, so all paths are relative

test/remote-run/exit-code.test-sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
REQUIRES: shell
22

3+
RUN: export SWIFT_BACKTRACE=
34
RUN: not %debug-remote-run false >%t.txt 2>%t.errs.txt
45
RUN: test -f %t.txt -a ! -s %t.txt
56
RUN: test -f %t.errs.txt -a ! -s %t.errs.txt

utils/PathSanitizingFileCheck

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ constants.""")
6161
"to standard output",
6262
action="store_true")
6363

64+
parser.add_argument(
65+
"--ignore-runtime-warnings",
66+
help="Ignore warnings from the Swift runtime",
67+
action="store_true")
68+
6469
args, unknown_args = parser.parse_known_args()
6570

6671
if args.enable_windows_compatibility:
@@ -82,6 +87,16 @@ constants.""")
8287
slashes_re, re.escape(pattern)),
8388
replacement, stdin)
8489

90+
# Because we force the backtracer on in the tests, we can get runtime
91+
# warnings about privileged programs. Suppress those, and also the
92+
# warning it might emit if backtracing isn't supported on the test platform.
93+
# Additionally, suppress warnings about unknown backtracer options, since
94+
# we might want to add new ones to the lit tests and we should ignore
95+
# messages from the system copy of the runtime in that case.
96+
if args.ignore_runtime_warnings:
97+
stdin = re.sub(r'^swift runtime: (backtrace-on-crash is not '
98+
r'supported|unknown) .*\n', "", stdin, flags=re.M)
99+
85100
if args.dry_run:
86101
print(stdin)
87102
return 0

validation-test/BuildSystem/swift-xcodegen.test

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# RUN: %empty-directory(%t/out)
44
# RUN: export PATH="%original_path_env"
55
# RUN: export SWIFTCI_USE_LOCAL_DEPS=1
6+
# RUN: export SWIFT_BACKTRACE=
67

78
# REQUIRES: OS=macosx
89
# REQUIRES: standalone_build

0 commit comments

Comments
 (0)