Skip to content

Commit 8ca4314

Browse files
authored
Merge pull request #68826 from al45tair/eng/PR-115278959
[Linux] Provide a statically linked swift-backtrace binary.
2 parents bf1bfbe + 9d5ce54 commit 8ca4314

File tree

4 files changed

+140
-7
lines changed

4 files changed

+140
-7
lines changed

stdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,8 +1550,14 @@ function(add_swift_target_library_single target name)
15501550
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
15511551
target_link_directories(${target_static} PRIVATE
15521552
${library_search_directories})
1553+
1554+
_list_add_string_suffix(
1555+
"${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}"
1556+
"-static"
1557+
target_private_libs)
1558+
15531559
target_link_libraries("${target_static}" PRIVATE
1554-
${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES})
1560+
${target_private_libs})
15551561

15561562
# Force executables linker language to be CXX so that we do not link using the
15571563
# host toolchain swiftc.
@@ -2571,7 +2577,8 @@ endfunction()
25712577
# The Swift installation component that this executable belongs to.
25722578
# Defaults to never_install.
25732579
function(_add_swift_target_executable_single name)
2574-
set(options)
2580+
set(options
2581+
NOSWIFTRT)
25752582
set(single_parameter_options
25762583
ARCHITECTURE
25772584
SDK
@@ -2649,6 +2656,15 @@ function(_add_swift_target_executable_single name)
26492656
${SWIFTEXE_SINGLE_SOURCES}
26502657
${SWIFTEXE_SINGLE_EXTERNAL_SOURCES})
26512658

2659+
# ELF and COFF need swiftrt
2660+
if(("${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_OBJECT_FORMAT}" STREQUAL "ELF" OR
2661+
"${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_OBJECT_FORMAT}" STREQUAL "COFF")
2662+
AND NOT SWIFTEXE_SINGLE_NOSWIFTRT)
2663+
target_sources(${name}
2664+
PRIVATE
2665+
$<TARGET_OBJECTS:swiftImageRegistrationObject${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_OBJECT_FORMAT}-${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}-${SWIFTEXE_SINGLE_ARCHITECTURE}>)
2666+
endif()
2667+
26522668
add_dependencies_multiple_targets(
26532669
TARGETS "${name}"
26542670
DEPENDS
@@ -2712,6 +2728,24 @@ function(_add_swift_target_executable_single name)
27122728
set_target_properties(${name} PROPERTIES FOLDER "Swift executables")
27132729
endfunction()
27142730

2731+
# Conditionally append -static to a name, if that variant is a valid target
2732+
function(append_static name result_var_name)
2733+
cmake_parse_arguments(APPEND_TARGET
2734+
"STATIC_SWIFT_STDLIB"
2735+
""
2736+
""
2737+
${ARGN})
2738+
if(STATIC_SWIFT_STDLIB)
2739+
if(TARGET "${name}-static")
2740+
set("${result_var_name}" "${name}-static" PARENT_SCOPE)
2741+
else()
2742+
set("${result_var_name}" "${name}" PARENT_SCOPE)
2743+
endif()
2744+
else()
2745+
set("${result_var_name}" "${name}" PARENT_SCOPE)
2746+
endif()
2747+
endfunction()
2748+
27152749
# Add an executable for each target variant. Executables are given suffixes
27162750
# with the variant SDK and ARCH.
27172751
#
@@ -2720,7 +2754,9 @@ function(add_swift_target_executable name)
27202754
set(SWIFTEXE_options
27212755
EXCLUDE_FROM_ALL
27222756
BUILD_WITH_STDLIB
2723-
BUILD_WITH_LIBEXEC)
2757+
BUILD_WITH_LIBEXEC
2758+
PREFER_STATIC
2759+
NOSWIFTRT)
27242760
set(SWIFTEXE_single_parameter_options
27252761
INSTALL_IN_COMPONENT)
27262762
set(SWIFTEXE_multiple_parameter_options
@@ -2906,8 +2942,12 @@ function(add_swift_target_executable name)
29062942
list(APPEND swiftexe_module_dependency_targets
29072943
"swift${mod}${MODULE_VARIANT_SUFFIX}")
29082944

2909-
list(APPEND swiftexe_link_libraries_targets
2910-
"swift${mod}${VARIANT_SUFFIX}")
2945+
set(library_target "swift${mod}${VARIANT_SUFFIX}")
2946+
if(SWIFTEXE_TARGET_PREFER_STATIC AND TARGET "${library_target}-static")
2947+
set(library_target "${library_target}-static")
2948+
endif()
2949+
2950+
list(APPEND swiftexe_link_libraries_targets "${library_target}")
29112951
endforeach()
29122952

29132953
# Don't add the ${arch} to the suffix. We want to link against fat
@@ -2919,6 +2959,7 @@ function(add_swift_target_executable name)
29192959

29202960
_add_swift_target_executable_single(
29212961
${VARIANT_NAME}
2962+
${SWIFTEXE_TARGET_NOSWIFTRT_keyword}
29222963
${SWIFTEXE_TARGET_SOURCES}
29232964
DEPENDS
29242965
${SWIFTEXE_TARGET_DEPENDS_with_suffix}

stdlib/public/Backtracing/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ add_swift_target_library(swift_Backtracing ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I
7878

7979
SWIFT_MODULE_DEPENDS ${concurrency}
8080

81-
LINK_LIBRARIES ${swift_backtracing_link_libraries}
81+
PRIVATE_LINK_LIBRARIES ${swift_backtracing_link_libraries}
8282

8383
SWIFT_COMPILE_FLAGS
8484
${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}

stdlib/public/libexec/swift-backtrace/CMakeLists.txt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,18 @@ set(BACKTRACING_COMPILE_FLAGS
2626
"-Xcc;-I${SWIFT_SOURCE_DIR}/include"
2727
"-Xcc;-I${CMAKE_BINARY_DIR}/include")
2828

29-
add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
29+
set(BACKTRACING_SOURCES
3030
main.swift
3131
AnsiColor.swift
3232
TargetMacOS.swift
3333
TargetLinux.swift
3434
Themes.swift
3535
Utils.swift
36+
)
37+
38+
39+
add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
40+
${BACKTRACING_SOURCES}
3641

3742
SWIFT_MODULE_DEPENDS ${backtracing}
3843

@@ -47,3 +52,22 @@ add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
4752

4853
TARGET_SDKS OSX LINUX)
4954

55+
if(SWIFT_BUILD_STATIC_STDLIB)
56+
add_swift_target_executable(swift-backtrace-static BUILD_WITH_LIBEXEC
57+
PREFER_STATIC
58+
59+
${BACKTRACING_SOURCES}
60+
61+
SWIFT_MODULE_DEPENDS ${backtracing}
62+
63+
SWIFT_MODULE_DEPENDS_OSX ${darwin}
64+
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
65+
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
66+
67+
INSTALL_IN_COMPONENT libexec
68+
COMPILE_FLAGS
69+
${BACKTRACING_COMPILE_FLAGS}
70+
-parse-as-library
71+
72+
TARGET_SDKS LINUX)
73+
endif()
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-build-swift %s -parse-as-library %import-static-libdispatch -Onone -g -o %t/StaticBacktracer
3+
// RUN: %target-codesign %t/StaticBacktracer
4+
// RUN: /usr/bin/ldd %backtracer-static | %FileCheck %s --check-prefix LIBS
5+
// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no,swift-backtrace=%backtracer-static %target-run %t/StaticBacktracer 2>&1 || true) | %FileCheck %s
6+
7+
// UNSUPPORTED: use_os_stdlib
8+
// UNSUPPORTED: back_deployment_runtime
9+
// UNSUPPORTED: asan
10+
// REQUIRES: executable_test
11+
// REQUIRES: backtracing
12+
// REQUIRES: static_stdlib
13+
// REQUIRES: OS=linux-gnu
14+
15+
func level1() {
16+
level2()
17+
}
18+
19+
func level2() {
20+
level3()
21+
}
22+
23+
func level3() {
24+
level4()
25+
}
26+
27+
func level4() {
28+
level5()
29+
}
30+
31+
func level5() {
32+
print("About to crash")
33+
let ptr = UnsafeMutablePointer<Int>(bitPattern: 4)!
34+
ptr.pointee = 42
35+
}
36+
37+
@main
38+
struct StaticBacktracer {
39+
static func main() {
40+
level1()
41+
}
42+
}
43+
44+
// CHECK: *** Program crashed: Bad pointer dereference at 0x{{0+}}4 ***
45+
46+
// CHECK: Thread 0 {{(".*" )?}}crashed:
47+
48+
// CHECK: 0 0x{{[0-9a-f]+}} level5() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:34:15
49+
// CHECK-NEXT: 1 [ra] 0x{{[0-9a-f]+}} level4() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:28:3
50+
// CHECK-NEXT: 2 [ra] 0x{{[0-9a-f]+}} level3() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:24:3
51+
// CHECK-NEXT: 3 [ra] 0x{{[0-9a-f]+}} level2() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:20:3
52+
// CHECK-NEXT: 4 [ra] 0x{{[0-9a-f]+}} level1() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:16:3
53+
// CHECK-NEXT: 5 [ra] 0x{{[0-9a-f]+}} static StaticBacktracer.main() + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift:40:5
54+
// CHECK-NEXT: 6 [ra] [system] 0x{{[0-9a-f]+}} static StaticBacktracer.$main() + {{[0-9]+}} in StaticBacktracer at {{.*}}/<compiler-generated>
55+
// CHECK-NEXT: 7 [ra] 0x{{[0-9a-f]+}} main + {{[0-9]+}} in StaticBacktracer at {{.*}}/StaticBacktracer.swift
56+
57+
// CHECK: Registers:
58+
59+
// CHECK: Images ({{[0-9]+}} omitted):
60+
61+
// CHECK: {{0x[0-9a-f]+}}–{{0x[0-9a-f]+}}{{ +}}{{([0-9a-f]+|<no build ID>)}}{{ +}}StaticBacktracer{{ +}}{{.*}}/StaticBacktracer
62+
63+
// .............................................................................
64+
65+
// We mustn't have any Swift libraries dynamically linked here; that's the
66+
// entire point.
67+
68+
// LIBS-NOT: libswift{{.*}}.so

0 commit comments

Comments
 (0)