Skip to content

Commit 7b7f77e

Browse files
committed
[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
1 parent f7a8bc2 commit 7b7f77e

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

stdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ function(_add_target_variant_c_compile_link_flags)
134134
"-fcoverage-mapping")
135135
endif()
136136

137+
# Use frame pointers on Linux
138+
if("${CFLAGS_SDK}" STREQUAL "LINUX")
139+
list(APPEND result "-fno-omit-frame-pointer")
140+
endif()
141+
137142
_compute_lto_flag("${CFLAGS_ENABLE_LTO}" _lto_flag_out)
138143
if (_lto_flag_out)
139144
list(APPEND result "${_lto_flag_out}")
@@ -310,6 +315,11 @@ function(_add_target_variant_c_compile_flags)
310315
"-fcoverage-mapping")
311316
endif()
312317

318+
# Use frame pointers on Linux
319+
if("${CFLAGS_SDK}" STREQUAL "LINUX")
320+
list(APPEND result "-fno-omit-frame-pointer")
321+
endif()
322+
313323
if((CFLAGS_ARCH STREQUAL "armv7" OR CFLAGS_ARCH STREQUAL "aarch64") AND
314324
(CFLAGS_SDK STREQUAL "LINUX" OR CFLAGS_SDK STREQUAL "ANDROID"))
315325
list(APPEND result -funwind-tables)
@@ -943,6 +953,11 @@ function(add_swift_target_library_single target name)
943953
set(install_in_component "${SWIFTLIB_SINGLE_INSTALL_IN_COMPONENT}")
944954
endif()
945955

956+
# Use frame pointers on Linux
957+
if ("${SWIFTLIB_SINGLE_SDK}" STREQUAL "LINUX")
958+
list(APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS "-Xcc" "-fno-omit-frame-pointer")
959+
endif()
960+
946961
# FIXME: don't actually depend on the libraries in SWIFTLIB_SINGLE_LINK_LIBRARIES,
947962
# just any swiftmodule files that are associated with them.
948963
handle_swift_sources(
@@ -2634,6 +2649,10 @@ function(_add_swift_target_executable_single name)
26342649
-vfsoverlay;"${SWIFT_WINDOWS_VFS_OVERLAY}")
26352650
endif()
26362651

2652+
if ("${SWIFTEXE_SINGLE_SDK}" STREQUAL "LINUX")
2653+
list(APPEND SWIFTEXE_SINGLE_COMPILE_FLAGS "-Xcc" "-fno-omit-frame-pointer")
2654+
endif()
2655+
26372656
handle_swift_sources(
26382657
dependency_target
26392658
unused_module_dependency_target

test/Backtracing/FatalError.swift

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-build-swift %s -parse-as-library -Onone -g -o %t/FatalError
3+
// RUN: %target-codesign %t/FatalError
4+
// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/FatalError 2>&1 || true) | %FileCheck %s
5+
6+
// UNSUPPORTED: use_os_stdlib
7+
// UNSUPPORTED: back_deployment_runtime
8+
// UNSUPPORTED: asan
9+
// REQUIRES: executable_test
10+
// REQUIRES: backtracing
11+
// REQUIRES: OS=macosx || OS=linux-gnu
12+
13+
func level1() {
14+
level2()
15+
}
16+
17+
func level2() {
18+
level3()
19+
}
20+
21+
func level3() {
22+
level4()
23+
}
24+
25+
func level4() {
26+
level5()
27+
}
28+
29+
func level5() {
30+
fatalError("Going to crash")
31+
}
32+
33+
@main
34+
struct FatalError {
35+
static func main() {
36+
level1()
37+
}
38+
}
39+
40+
// CHECK: *** Program crashed: Illegal instruction at 0x{{[0-9a-f]+}} ***
41+
42+
// CHECK: Thread 0 "FatalError" crashed:
43+
44+
// CHECK: 0 0x{{[0-9a-f]+}} _assertionFailure(_:_:file:line:flags:) + {{[0-9]+}} in libswiftCore.so at {{.*}}/AssertCommon.swift:{{[0-9]+}}:{{[0-9]+}}
45+
// CHECK-NEXT: 1 [ra] 0x{{[0-9a-f]+}} level5() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:30:3
46+
// CHECK-NEXT: 2 [ra] 0x{{[0-9a-f]+}} level4() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:26:3
47+
// CHECK-NEXT: 3 [ra] 0x{{[0-9a-f]+}} level3() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:22:3
48+
// CHECK-NEXT: 4 [ra] 0x{{[0-9a-f]+}} level2() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:18:3
49+
// CHECK-NEXT: 5 [ra] 0x{{[0-9a-f]+}} level1() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:14:3
50+
// CHECK-NEXT: 6 [ra] 0x{{[0-9a-f]+}} static FatalError.main() + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift:36:5
51+
// CHECK-NEXT: 7 [ra] [system] 0x{{[0-9a-f]+}} static FatalError.$main() + {{[0-9]+}} in FatalError at {{.*}}/<compiler-generated>
52+
// CHECK-NEXT: 8 [ra] 0x{{[0-9a-f]+}} main + {{[0-9]+}} in FatalError at {{.*}}/FatalError.swift
53+

0 commit comments

Comments
 (0)