Skip to content

Commit d948af0

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 255f28a commit d948af0

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)
@@ -924,6 +934,11 @@ function(add_swift_target_library_single target name)
924934
set(install_in_component "${SWIFTLIB_SINGLE_INSTALL_IN_COMPONENT}")
925935
endif()
926936

937+
# Use frame pointers on Linux
938+
if ("${SWIFTLIB_SINGLE_SDK}" STREQUAL "LINUX")
939+
list(APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS "-Xcc" "-fno-omit-frame-pointer")
940+
endif()
941+
927942
# FIXME: don't actually depend on the libraries in SWIFTLIB_SINGLE_LINK_LIBRARIES,
928943
# just any swiftmodule files that are associated with them.
929944
handle_swift_sources(
@@ -2602,6 +2617,10 @@ function(_add_swift_target_executable_single name)
26022617
-vfsoverlay;"${SWIFT_WINDOWS_VFS_OVERLAY}")
26032618
endif()
26042619

2620+
if ("${SWIFTEXE_SINGLE_SDK}" STREQUAL "LINUX")
2621+
list(APPEND SWIFTEXE_SINGLE_COMPILE_FLAGS "-Xcc" "-fno-omit-frame-pointer")
2622+
endif()
2623+
26052624
handle_swift_sources(
26062625
dependency_target
26072626
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)