From d948af0d3212670a8808c52c480d771bbb83ad18 Mon Sep 17 00:00:00 2001 From: Alastair Houghton Date: Thu, 5 Oct 2023 16:11:20 +0100 Subject: [PATCH 1/3] [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 212bf2bcfde42..74f22d481c1e9 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) @@ -924,6 +934,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( @@ -2602,6 +2617,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 06940e6ad6cc365f94f29696452edaa1d1b1ae60 Mon Sep 17 00:00:00 2001 From: Alastair Houghton Date: Thu, 5 Oct 2023 18:04:58 +0100 Subject: [PATCH 2/3] [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 From efbf21a0e0ded1e7257613d14890e50fc7565132 Mon Sep 17 00:00:00 2001 From: Alastair Houghton Date: Thu, 5 Oct 2023 21:21:58 +0100 Subject: [PATCH 3/3] [Test] Fully remove config.swift_host_lib_dir. Somehow #68858 managed to remove `config.swift_host_lib_dir` without removing the corresponding `config.substitutions.append`. Fix. rdar://116112040 --- test/lit.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/test/lit.cfg b/test/lit.cfg index d77fc71ce810f..01160b29a8afb 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -582,7 +582,6 @@ else: config.substitutions.append( ('%llvm_obj_root', config.llvm_obj_root) ) config.substitutions.append( ('%swift-lib-dir', config.swift_lib_dir) ) -config.substitutions.append( ('%swift-host-lib-dir', config.swift_host_lib_dir)) config.substitutions.append( ('%swift-libexec-dir', config.swift_lib_dir) ) config.substitutions.append( ('%swift-plugin-dir', config.swift_plugin_dir) ) config.substitutions.append( ('%llvm_src_root', config.llvm_src_root) )