Skip to content

Commit d333657

Browse files
authored
Merge pull request #68906 from al45tair/eng/PR-115278959-5.9.1
[Linux] Provide a statically linked swift-backtrace binary.
2 parents 0398ad1 + 9c3d366 commit d333657

File tree

5 files changed

+141
-12
lines changed

5 files changed

+141
-12
lines changed

stdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,8 +1518,14 @@ function(add_swift_target_library_single target name)
15181518
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
15191519
target_link_directories(${target_static} PRIVATE
15201520
${library_search_directories})
1521+
1522+
_list_add_string_suffix(
1523+
"${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}"
1524+
"-static"
1525+
target_private_libs)
1526+
15211527
target_link_libraries("${target_static}" PRIVATE
1522-
${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES})
1528+
${target_private_libs})
15231529

15241530
# Force executables linker language to be CXX so that we do not link using the
15251531
# host toolchain swiftc.
@@ -2539,7 +2545,8 @@ endfunction()
25392545
# The Swift installation component that this executable belongs to.
25402546
# Defaults to never_install.
25412547
function(_add_swift_target_executable_single name)
2542-
set(options)
2548+
set(options
2549+
NOSWIFTRT)
25432550
set(single_parameter_options
25442551
ARCHITECTURE
25452552
SDK
@@ -2617,6 +2624,15 @@ function(_add_swift_target_executable_single name)
26172624
${SWIFTEXE_SINGLE_SOURCES}
26182625
${SWIFTEXE_SINGLE_EXTERNAL_SOURCES})
26192626

2627+
# ELF and COFF need swiftrt
2628+
if(("${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_OBJECT_FORMAT}" STREQUAL "ELF" OR
2629+
"${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_OBJECT_FORMAT}" STREQUAL "COFF")
2630+
AND NOT SWIFTEXE_SINGLE_NOSWIFTRT)
2631+
target_sources(${name}
2632+
PRIVATE
2633+
$<TARGET_OBJECTS:swiftImageRegistrationObject${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_OBJECT_FORMAT}-${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}-${SWIFTEXE_SINGLE_ARCHITECTURE}>)
2634+
endif()
2635+
26202636
add_dependencies_multiple_targets(
26212637
TARGETS "${name}"
26222638
DEPENDS
@@ -2680,6 +2696,24 @@ function(_add_swift_target_executable_single name)
26802696
set_target_properties(${name} PROPERTIES FOLDER "Swift executables")
26812697
endfunction()
26822698

2699+
# Conditionally append -static to a name, if that variant is a valid target
2700+
function(append_static name result_var_name)
2701+
cmake_parse_arguments(APPEND_TARGET
2702+
"STATIC_SWIFT_STDLIB"
2703+
""
2704+
""
2705+
${ARGN})
2706+
if(STATIC_SWIFT_STDLIB)
2707+
if(TARGET "${name}-static")
2708+
set("${result_var_name}" "${name}-static" PARENT_SCOPE)
2709+
else()
2710+
set("${result_var_name}" "${name}" PARENT_SCOPE)
2711+
endif()
2712+
else()
2713+
set("${result_var_name}" "${name}" PARENT_SCOPE)
2714+
endif()
2715+
endfunction()
2716+
26832717
# Add an executable for each target variant. Executables are given suffixes
26842718
# with the variant SDK and ARCH.
26852719
#
@@ -2688,7 +2722,9 @@ function(add_swift_target_executable name)
26882722
set(SWIFTEXE_options
26892723
EXCLUDE_FROM_ALL
26902724
BUILD_WITH_STDLIB
2691-
BUILD_WITH_LIBEXEC)
2725+
BUILD_WITH_LIBEXEC
2726+
PREFER_STATIC
2727+
NOSWIFTRT)
26922728
set(SWIFTEXE_single_parameter_options
26932729
INSTALL_IN_COMPONENT)
26942730
set(SWIFTEXE_multiple_parameter_options
@@ -2874,8 +2910,12 @@ function(add_swift_target_executable name)
28742910
list(APPEND swiftexe_module_dependency_targets
28752911
"swift${mod}${MODULE_VARIANT_SUFFIX}")
28762912

2877-
list(APPEND swiftexe_link_libraries_targets
2878-
"swift${mod}${VARIANT_SUFFIX}")
2913+
set(library_target "swift${mod}${VARIANT_SUFFIX}")
2914+
if(SWIFTEXE_TARGET_PREFER_STATIC AND TARGET "${library_target}-static")
2915+
set(library_target "${library_target}-static")
2916+
endif()
2917+
2918+
list(APPEND swiftexe_link_libraries_targets "${library_target}")
28792919
endforeach()
28802920

28812921
# Don't add the ${arch} to the suffix. We want to link against fat
@@ -2887,6 +2927,7 @@ function(add_swift_target_executable name)
28872927

28882928
_add_swift_target_executable_single(
28892929
${VARIANT_NAME}
2930+
${SWIFTEXE_TARGET_NOSWIFTRT_keyword}
28902931
${SWIFTEXE_TARGET_SOURCES}
28912932
DEPENDS
28922933
${SWIFTEXE_TARGET_DEPENDS_with_suffix}

stdlib/cmake/modules/SwiftSource.cmake

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -903,11 +903,6 @@ function(_compile_swift_files
903903

904904
# First generate the obj dirs
905905
list(REMOVE_DUPLICATES dirs_to_create)
906-
add_custom_command_target(
907-
create_dirs_dependency_target
908-
COMMAND "${CMAKE_COMMAND}" -E make_directory ${dirs_to_create}
909-
OUTPUT ${dirs_to_create}
910-
COMMENT "Generating dirs for ${first_output}")
911906

912907
# Then we can compile both the object files and the swiftmodule files
913908
# in parallel in this target for the object file, and ...
@@ -937,6 +932,7 @@ function(_compile_swift_files
937932

938933
add_custom_command_target(
939934
dependency_target
935+
COMMAND "${CMAKE_COMMAND}" -E make_directory ${dirs_to_create}
940936
COMMAND
941937
${set_environment_args}
942938
"$<TARGET_FILE:Python3::Interpreter>" "${line_directive_tool}" "@${file_path}" --

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)