From 7b7f77eeaae43aed86d261a528a16bd968687679 Mon Sep 17 00:00:00 2001 From: Alastair Houghton Date: Thu, 5 Oct 2023 16:11:20 +0100 Subject: [PATCH 1/2] [Linux] Enable frame pointers when building Swift libraries. Turn on frame pointers for the Swift runtime libraries. This makes backtraces that go through the runtimes more reliable without having to parse DWARF data. rdar://116112040 --- stdlib/cmake/modules/AddSwiftStdlib.cmake | 19 ++++++++ test/Backtracing/FatalError.swift | 53 +++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 test/Backtracing/FatalError.swift diff --git a/stdlib/cmake/modules/AddSwiftStdlib.cmake b/stdlib/cmake/modules/AddSwiftStdlib.cmake index c499f09a23037..78e3f385f0007 100644 --- a/stdlib/cmake/modules/AddSwiftStdlib.cmake +++ b/stdlib/cmake/modules/AddSwiftStdlib.cmake @@ -134,6 +134,11 @@ function(_add_target_variant_c_compile_link_flags) "-fcoverage-mapping") endif() + # Use frame pointers on Linux + if("${CFLAGS_SDK}" STREQUAL "LINUX") + list(APPEND result "-fno-omit-frame-pointer") + endif() + _compute_lto_flag("${CFLAGS_ENABLE_LTO}" _lto_flag_out) if (_lto_flag_out) list(APPEND result "${_lto_flag_out}") @@ -310,6 +315,11 @@ function(_add_target_variant_c_compile_flags) "-fcoverage-mapping") endif() + # Use frame pointers on Linux + if("${CFLAGS_SDK}" STREQUAL "LINUX") + list(APPEND result "-fno-omit-frame-pointer") + endif() + if((CFLAGS_ARCH STREQUAL "armv7" OR CFLAGS_ARCH STREQUAL "aarch64") AND (CFLAGS_SDK STREQUAL "LINUX" OR CFLAGS_SDK STREQUAL "ANDROID")) list(APPEND result -funwind-tables) @@ -943,6 +953,11 @@ function(add_swift_target_library_single target name) set(install_in_component "${SWIFTLIB_SINGLE_INSTALL_IN_COMPONENT}") endif() + # Use frame pointers on Linux + if ("${SWIFTLIB_SINGLE_SDK}" STREQUAL "LINUX") + list(APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS "-Xcc" "-fno-omit-frame-pointer") + endif() + # FIXME: don't actually depend on the libraries in SWIFTLIB_SINGLE_LINK_LIBRARIES, # just any swiftmodule files that are associated with them. handle_swift_sources( @@ -2634,6 +2649,10 @@ function(_add_swift_target_executable_single name) -vfsoverlay;"${SWIFT_WINDOWS_VFS_OVERLAY}") endif() + if ("${SWIFTEXE_SINGLE_SDK}" STREQUAL "LINUX") + list(APPEND SWIFTEXE_SINGLE_COMPILE_FLAGS "-Xcc" "-fno-omit-frame-pointer") + endif() + handle_swift_sources( dependency_target unused_module_dependency_target diff --git a/test/Backtracing/FatalError.swift b/test/Backtracing/FatalError.swift new file mode 100644 index 0000000000000..f6ef95fa2afd8 --- /dev/null +++ b/test/Backtracing/FatalError.swift @@ -0,0 +1,53 @@ +// RUN: %empty-directory(%t) +// RUN: %target-build-swift %s -parse-as-library -Onone -g -o %t/FatalError +// RUN: %target-codesign %t/FatalError +// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/FatalError 2>&1 || true) | %FileCheck %s + +// UNSUPPORTED: use_os_stdlib +// UNSUPPORTED: back_deployment_runtime +// UNSUPPORTED: asan +// REQUIRES: executable_test +// REQUIRES: backtracing +// REQUIRES: OS=macosx || OS=linux-gnu + +func level1() { + level2() +} + +func level2() { + level3() +} + +func level3() { + level4() +} + +func level4() { + level5() +} + +func level5() { + fatalError("Going to crash") +} + +@main +struct FatalError { + static func main() { + level1() + } +} + +// CHECK: *** Program crashed: Illegal instruction at 0x{{[0-9a-f]+}} *** + +// CHECK: Thread 0 "FatalError" crashed: + +// CHECK: 0 0x{{[0-9a-f]+}} _assertionFailure(_:_:file:line:flags:) + {{[0-9]+}} in libswiftCore.so at {{.*}}/AssertCommon.swift:{{[0-9]+}}:{{[0-9]+}} +// CHECK-NEXT: 1 [ra] 0x{{[0-9a-f]+}} level5() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:30:3 +// CHECK-NEXT: 2 [ra] 0x{{[0-9a-f]+}} level4() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:26:3 +// CHECK-NEXT: 3 [ra] 0x{{[0-9a-f]+}} level3() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:22:3 +// CHECK-NEXT: 4 [ra] 0x{{[0-9a-f]+}} level2() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:18:3 +// CHECK-NEXT: 5 [ra] 0x{{[0-9a-f]+}} level1() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:14:3 +// CHECK-NEXT: 6 [ra] 0x{{[0-9a-f]+}} static FatalError.main() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:36:5 +// CHECK-NEXT: 7 [ra] [system] 0x{{[0-9a-f]+}} static FatalError.$main() + {{[0-9]+}} in FatalError at {{.*}}/ +// CHECK-NEXT: 8 [ra] 0x{{[0-9a-f]+}} main + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift + From 2cbc064a9e67b35a93e182b396682384601dabb5 Mon Sep 17 00:00:00 2001 From: Alastair Houghton Date: Thu, 5 Oct 2023 18:04:58 +0100 Subject: [PATCH 2/2] [Backtracing][Tests] Tweak the new fatalError test slightly. The test needs tweaking a little to work on Linux and macOS. rdar://116112040 --- test/Backtracing/FatalError.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Backtracing/FatalError.swift b/test/Backtracing/FatalError.swift index f6ef95fa2afd8..87446786325f3 100644 --- a/test/Backtracing/FatalError.swift +++ b/test/Backtracing/FatalError.swift @@ -39,9 +39,9 @@ struct FatalError { // CHECK: *** Program crashed: Illegal instruction at 0x{{[0-9a-f]+}} *** -// CHECK: Thread 0 "FatalError" crashed: +// CHECK: Thread 0 {{(".*" )?}}crashed: -// CHECK: 0 0x{{[0-9a-f]+}} _assertionFailure(_:_:file:line:flags:) + {{[0-9]+}} in libswiftCore.so at {{.*}}/AssertCommon.swift:{{[0-9]+}}:{{[0-9]+}} +// CHECK: 0 0x{{[0-9a-f]+}} _assertionFailure(_:_:file:line:flags:) + {{[0-9]+}} in libswiftCore.{{so|dylib}} // CHECK-NEXT: 1 [ra] 0x{{[0-9a-f]+}} level5() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:30:3 // CHECK-NEXT: 2 [ra] 0x{{[0-9a-f]+}} level4() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:26:3 // CHECK-NEXT: 3 [ra] 0x{{[0-9a-f]+}} level3() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:22:3