Skip to content

Commit 0bc76da

Browse files
committed
[Backtracing] Add warning suppression option, enable it for tests.
The backtracing code will warn you if you attempt to forcibly enable backtracing for a privileged executable. This is apparently upsetting the Driver/filelists.swift test. Since we want to force it on for tests, so that we will definitely get backtraces, add an option to suppress warning messages, and turn that on for tests as well. rdar://144497613
1 parent 09003d6 commit 0bc76da

File tree

8 files changed

+96
-42
lines changed

8 files changed

+96
-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/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

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

0 commit comments

Comments
 (0)