Skip to content

Commit 4c0e141

Browse files
authored
Merge pull request #79390 from al45tair/eng/PR-144497613
[Backtracing] Add warning suppression option, enable it for tests.
2 parents 42db3dc + 71abe6f commit 4c0e141

File tree

13 files changed

+101
-42
lines changed

13 files changed

+101
-42
lines changed

docs/Backtracing.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ follows:
105105
| | | Otherwise, Swift will locate the binary relative |
106106
| | | to the runtime library, or using ``SWIFT_ROOT``. |
107107
+-----------------+---------+--------------------------------------------------+
108+
| warnings | enabled | Set to ``suppressed`` to disable warning output |
109+
| | | related to the state of the backtracer. This is |
110+
| | | sometimes useful for testing. |
111+
+-----------------+---------+--------------------------------------------------+
108112

109113
(*) On macOS, this defaults to ``no`` rather than ``yes``.
110114

stdlib/public/runtime/Backtrace.cpp

Lines changed: 70 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ SWIFT_RUNTIME_STDLIB_INTERNAL BacktraceSettings _swift_backtraceSettings = {
135135
// symbolicate
136136
Symbolication::Full,
137137

138+
// suppressWarnings
139+
false,
140+
138141
// swiftBacktracePath
139142
NULL,
140143

@@ -333,9 +336,11 @@ BacktraceInitializer::BacktraceInitializer() {
333336

334337
if (!_swift_backtraceSettings.swiftBacktracePath) {
335338
if (_swift_backtraceSettings.enabled == OnOffTty::On) {
336-
swift::warning(0,
337-
"swift runtime: unable to locate swift-backtrace; "
338-
"disabling backtracing.\n");
339+
if (!_swift_backtraceSettings.suppressWarnings) {
340+
swift::warning(0,
341+
"swift runtime: unable to locate swift-backtrace; "
342+
"disabling backtracing.\n");
343+
}
339344
}
340345
_swift_backtraceSettings.enabled = OnOffTty::Off;
341346
}
@@ -354,9 +359,11 @@ BacktraceInitializer::BacktraceInitializer() {
354359

355360
#if !SWIFT_BACKTRACE_ON_CRASH_SUPPORTED
356361
if (_swift_backtraceSettings.enabled != OnOffTty::Off) {
357-
swift::warning(0,
358-
"swift runtime: backtrace-on-crash is not supported on "
359-
"this platform.\n");
362+
if (!_swift_backtraceSettings.suppressWarnings) {
363+
swift::warning(0,
364+
"swift runtime: backtrace-on-crash is not supported on "
365+
"this platform.\n");
366+
}
360367
_swift_backtraceSettings.enabled = OnOffTty::Off;
361368
}
362369
#else
@@ -371,9 +378,11 @@ BacktraceInitializer::BacktraceInitializer() {
371378
// /path/to/some/setuid/binary
372379
//
373380
// i.e. when you're trying to force matters.
374-
swift::warning(0,
375-
"swift runtime: backtrace-on-crash is not supported for "
376-
"privileged executables.\n");
381+
if (!_swift_backtraceSettings.suppressWarnings) {
382+
swift::warning(0,
383+
"swift runtime: backtrace-on-crash is not supported for "
384+
"privileged executables.\n");
385+
}
377386
_swift_backtraceSettings.enabled = OnOffTty::Off;
378387
}
379388

@@ -457,10 +466,12 @@ BacktraceInitializer::BacktraceInitializer() {
457466
swiftBacktracePath,
458467
SWIFT_BACKTRACE_BUFFER_SIZE);
459468
if (!len) {
460-
swift::warning(0,
461-
"swift runtime: unable to convert path to "
462-
"swift-backtrace: %08lx; disabling backtracing.\n",
463-
::GetLastError());
469+
if (!_swift_backtraceSettings.suppressWarnings) {
470+
swift::warning(0,
471+
"swift runtime: unable to convert path to "
472+
"swift-backtrace: %08lx; disabling backtracing.\n",
473+
::GetLastError());
474+
}
464475
_swift_backtraceSettings.enabled = OnOffTty::Off;
465476
}
466477
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
@@ -470,9 +481,11 @@ BacktraceInitializer::BacktraceInitializer() {
470481
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
471482
size_t len = strlen(_swift_backtraceSettings.swiftBacktracePath);
472483
if (len > SWIFT_BACKTRACE_BUFFER_SIZE - 1) {
473-
swift::warning(0,
474-
"swift runtime: path to swift-backtrace is too long; "
475-
"disabling backtracing.\n");
484+
if (!_swift_backtraceSettings.suppressWarnings) {
485+
swift::warning(0,
486+
"swift runtime: path to swift-backtrace is too long; "
487+
"disabling backtracing.\n");
488+
}
476489
_swift_backtraceSettings.enabled = OnOffTty::Off;
477490
} else {
478491
memcpy(swiftBacktracePath,
@@ -489,19 +502,23 @@ BacktraceInitializer::BacktraceInitializer() {
489502
#if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
490503
if (!writeProtectMemory(swiftBacktracePath,
491504
sizeof(swiftBacktracePath))) {
505+
if (!_swift_backtraceSettings.suppressWarnings) {
492506
swift::warning(0,
493507
"swift runtime: unable to protect path to "
494508
"swift-backtrace at %p; disabling backtracing.\n",
495509
swiftBacktracePath);
496-
_swift_backtraceSettings.enabled = OnOffTty::Off;
510+
}
511+
_swift_backtraceSettings.enabled = OnOffTty::Off;
497512
}
498513
#endif
499514
if (!writeProtectMemory(swiftBacktraceEnv,
500515
sizeof(swiftBacktraceEnv))) {
501-
swift::warning(0,
502-
"swift runtime: unable to protect environment "
503-
"for swift-backtrace at %p; disabling backtracing.\n",
504-
swiftBacktraceEnv);
516+
if (!_swift_backtraceSettings.suppressWarnings) {
517+
swift::warning(0,
518+
"swift runtime: unable to protect environment "
519+
"for swift-backtrace at %p; disabling backtracing.\n",
520+
swiftBacktraceEnv);
521+
}
505522
_swift_backtraceSettings.enabled = OnOffTty::Off;
506523
}
507524
#endif
@@ -512,9 +529,11 @@ BacktraceInitializer::BacktraceInitializer() {
512529
if (_swift_backtraceSettings.enabled == OnOffTty::On) {
513530
ErrorCode err = _swift_installCrashHandler();
514531
if (err != 0) {
515-
swift::warning(0,
516-
"swift runtime: crash handler installation failed; "
517-
"disabling backtracing.\n");
532+
if (!_swift_backtraceSettings.suppressWarnings) {
533+
swift::warning(0,
534+
"swift runtime: crash handler installation failed; "
535+
"disabling backtracing.\n");
536+
}
518537
}
519538
}
520539
#endif
@@ -631,12 +650,14 @@ _swift_processBacktracingSetting(llvm::StringRef key,
631650
_swift_backtraceSettings.timeout = count * 3600;
632651

633652
if (_swift_backtraceSettings.timeout < 0) {
634-
swift::warning(0,
635-
"swift runtime: bad backtracing timeout %ds\n",
636-
_swift_backtraceSettings.timeout);
653+
if (!_swift_backtraceSettings.suppressWarnings) {
654+
swift::warning(0,
655+
"swift runtime: bad backtracing timeout %ds\n",
656+
_swift_backtraceSettings.timeout);
657+
}
637658
_swift_backtraceSettings.timeout = 0;
638659
}
639-
} else {
660+
} else if (!_swift_backtraceSettings.suppressWarnings) {
640661
swift::warning(0,
641662
"swift runtime: bad backtracing timeout '%.*s'\n",
642663
static_cast<int>(value.size()), value.data());
@@ -648,7 +669,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
648669
_swift_backtraceSettings.algorithm = UnwindAlgorithm::Fast;
649670
else if (value.equals_insensitive("precise"))
650671
_swift_backtraceSettings.algorithm = UnwindAlgorithm::Precise;
651-
else {
672+
else if (!_swift_backtraceSettings.suppressWarnings) {
652673
swift::warning(0,
653674
"swift runtime: unknown unwind algorithm '%.*s'\n",
654675
static_cast<int>(value.size()), value.data());
@@ -665,7 +686,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
665686
_swift_backtraceSettings.preset = Preset::Medium;
666687
else if (value.equals_insensitive("full"))
667688
_swift_backtraceSettings.preset = Preset::Full;
668-
else {
689+
else if (!_swift_backtraceSettings.suppressWarnings) {
669690
swift::warning(0,
670691
"swift runtime: unknown backtracing preset '%.*s'\n",
671692
static_cast<int>(value.size()), value.data());
@@ -675,7 +696,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
675696
_swift_backtraceSettings.threads = ThreadsToShow::All;
676697
else if (value.equals_insensitive("crashed"))
677698
_swift_backtraceSettings.threads = ThreadsToShow::Crashed;
678-
else {
699+
else if (!_swift_backtraceSettings.suppressWarnings) {
679700
swift::warning(0,
680701
"swift runtime: unknown threads setting '%.*s'\n",
681702
static_cast<int>(value.size()), value.data());
@@ -687,7 +708,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
687708
_swift_backtraceSettings.registers = RegistersToShow::All;
688709
else if (value.equals_insensitive("crashed"))
689710
_swift_backtraceSettings.registers = RegistersToShow::Crashed;
690-
else {
711+
else if (!_swift_backtraceSettings.suppressWarnings) {
691712
swift::warning(0,
692713
"swift runtime: unknown registers setting '%.*s'\n",
693714
static_cast<int>(value.size()), value.data());
@@ -699,7 +720,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
699720
_swift_backtraceSettings.images = ImagesToShow::All;
700721
else if (value.equals_insensitive("mentioned"))
701722
_swift_backtraceSettings.images = ImagesToShow::Mentioned;
702-
else {
723+
else if (!_swift_backtraceSettings.suppressWarnings) {
703724
swift::warning(0,
704725
"swift runtime: unknown registers setting '%.*s'\n",
705726
static_cast<int>(value.size()), value.data());
@@ -711,7 +732,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
711732
_swift_backtraceSettings.limit = -1;
712733
else if (!value.getAsInteger(0, limit) && limit > 0)
713734
_swift_backtraceSettings.limit = limit;
714-
else {
735+
else if (!_swift_backtraceSettings.suppressWarnings) {
715736
swift::warning(0,
716737
"swift runtime: bad backtrace limit '%.*s'\n",
717738
static_cast<int>(value.size()), value.data());
@@ -721,7 +742,7 @@ _swift_processBacktracingSetting(llvm::StringRef key,
721742
// (If you think the next line is wrong, see above.)
722743
if (!value.getAsInteger(0, top) && top >= 0)
723744
_swift_backtraceSettings.top = top;
724-
else {
745+
else if (!_swift_backtraceSettings.suppressWarnings) {
725746
swift::warning(0,
726747
"swift runtime: bad backtrace top count '%.*s'\n",
727748
static_cast<int>(value.size()), value.data());
@@ -758,7 +779,20 @@ _swift_processBacktracingSetting(llvm::StringRef key,
758779
std::free(const_cast<char *>(_swift_backtraceSettings.swiftBacktracePath));
759780
_swift_backtraceSettings.swiftBacktracePath = path;
760781
#endif // !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH)
761-
} else {
782+
} else if (key.equals_insensitive("warnings")) {
783+
if (value.equals_insensitive("suppressed")
784+
|| value.equals_insensitive("disabled")
785+
|| value.equals_insensitive("off"))
786+
_swift_backtraceSettings.suppressWarnings = true;
787+
else if (value.equals_insensitive("enabled")
788+
|| value.equals_insensitive("on"))
789+
_swift_backtraceSettings.suppressWarnings = false;
790+
else if (!_swift_backtraceSettings.suppressWarnings) {
791+
swift::warning(0,
792+
"swift runtime: unknown warnings setting '%.*s'\n",
793+
static_cast<int>(value.size()), value.data());
794+
}
795+
} else if (!_swift_backtraceSettings.suppressWarnings) {
762796
swift::warning(0,
763797
"swift runtime: unknown backtracing setting '%.*s'\n",
764798
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
@@ -121,6 +121,7 @@ struct BacktraceSettings {
121121
bool cache;
122122
OutputTo outputTo;
123123
Symbolication symbolicate;
124+
bool suppressWarnings;
124125
const char *swiftBacktracePath;
125126
const char *outputPath;
126127
};

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/PlaygroundTransform/lit.local.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ config.target_playground_build_run_swift_parameterized = SubstituteCaptures(
2424
escape_for_substitute_captures(config.target_run))
2525
)
2626

27-
config.substitutions.append(('%target-playground-build-run-swift\(([^)]+)\)',
27+
config.substitutions.append((r'%target-playground-build-run-swift\(([^)]+)\)',
2828
config.target_playground_build_run_swift_parameterized))

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')
@@ -2973,7 +2973,7 @@ if hasattr(config, 'target_link_sdk_future_version'):
29732973
config.substitutions.append(('%target-link-sdk-future-version',
29742974
config.target_link_sdk_future_version))
29752975

2976-
run_filecheck = '%s %s --allow-unused-prefixes --sanitize BUILD_DIR=%s --sanitize SOURCE_DIR=%s --use-filecheck %s %s %s' % (
2976+
run_filecheck = '%s %s --allow-unused-prefixes --sanitize BUILD_DIR=%s --sanitize SOURCE_DIR=%s --ignore-runtime-warnings --use-filecheck %s %s %s' % (
29772977
shell_quote(sys.executable),
29782978
shell_quote(config.PathSanitizingFileCheck),
29792979
# 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

validation-test/Python/line-directive.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: split-file %s %t
3+
// RUN: export SWIFT_BACKTRACE=
34

45
// RUN: %{python} %utils/line-directive
56
// RUN: %{python} %utils/line-directive -- %{python} %t/unicode.py

validation-test/Python/update_checkout.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
// than once for each supported Apple device.
55

66
// REQUIRES: OS=macosx
7+
// RUN: export SWIFT_BACKTRACE=
78

89
// RUN: %{python} %utils/update_checkout/run_tests.py

0 commit comments

Comments
 (0)