mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[Backtracing] Make the backtracer work for fully-static Linux.
The backtracer and its build system need a couple of changes to make them work with the new fully-static Linux support. rdar://123507656
This commit is contained in:
@@ -92,5 +92,5 @@ add_swift_target_library(swift_Backtracing ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I
|
|||||||
INSTALL_IN_COMPONENT stdlib
|
INSTALL_IN_COMPONENT stdlib
|
||||||
MACCATALYST_BUILD_FLAVOR "zippered"
|
MACCATALYST_BUILD_FLAVOR "zippered"
|
||||||
|
|
||||||
TARGET_SDKS OSX LINUX
|
TARGET_SDKS OSX LINUX LINUX_STATIC
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -708,10 +708,10 @@ extension arm_gprs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
to[31] = mctx.sp
|
to[31] = UInt64(mctx.sp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gprs.pc = mctx.pc
|
gprs.pc = UInt64(mctx.pc)
|
||||||
gprs.valid = 0x1ffffffff
|
gprs.valid = 0x1ffffffff
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,13 @@
|
|||||||
set(darwin)
|
set(darwin)
|
||||||
set(wincrt_sdk)
|
set(wincrt_sdk)
|
||||||
set(glibc)
|
set(glibc)
|
||||||
|
set(musl)
|
||||||
|
|
||||||
if(SWIFT_BUILD_SDK_OVERLAY)
|
if(SWIFT_BUILD_SDK_OVERLAY)
|
||||||
set(darwin Darwin)
|
set(darwin Darwin)
|
||||||
set(wincrt_sdk CRT WinSDK)
|
set(wincrt_sdk CRT WinSDK)
|
||||||
set(glibc Glibc)
|
set(glibc Glibc)
|
||||||
|
set(musl Musl)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Similarly, we only want the _Backtracing dependency if we're building
|
# Similarly, we only want the _Backtracing dependency if we're building
|
||||||
@@ -44,6 +46,7 @@ add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
|
|||||||
SWIFT_MODULE_DEPENDS_OSX ${darwin}
|
SWIFT_MODULE_DEPENDS_OSX ${darwin}
|
||||||
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
|
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
|
||||||
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
|
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
|
||||||
|
SWIFT_MODULE_DEPENDS_LINUX_STATIC ${musl}
|
||||||
|
|
||||||
INSTALL_IN_COMPONENT libexec
|
INSTALL_IN_COMPONENT libexec
|
||||||
COMPILE_FLAGS
|
COMPILE_FLAGS
|
||||||
@@ -52,7 +55,14 @@ add_swift_target_executable(swift-backtrace BUILD_WITH_LIBEXEC
|
|||||||
|
|
||||||
TARGET_SDKS OSX LINUX)
|
TARGET_SDKS OSX LINUX)
|
||||||
|
|
||||||
|
set(static_target_sdks)
|
||||||
if(SWIFT_BUILD_STATIC_STDLIB)
|
if(SWIFT_BUILD_STATIC_STDLIB)
|
||||||
|
list(APPEND static_target_sdks "LINUX")
|
||||||
|
endif()
|
||||||
|
if("LINUX_STATIC" IN_LIST SWIFT_SDKS)
|
||||||
|
list(APPEND static_target_sdks "LINUX_STATIC")
|
||||||
|
endif()
|
||||||
|
if(static_target_sdks)
|
||||||
add_swift_target_executable(swift-backtrace-static BUILD_WITH_LIBEXEC
|
add_swift_target_executable(swift-backtrace-static BUILD_WITH_LIBEXEC
|
||||||
PREFER_STATIC
|
PREFER_STATIC
|
||||||
|
|
||||||
@@ -63,11 +73,12 @@ if(SWIFT_BUILD_STATIC_STDLIB)
|
|||||||
SWIFT_MODULE_DEPENDS_OSX ${darwin}
|
SWIFT_MODULE_DEPENDS_OSX ${darwin}
|
||||||
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
|
SWIFT_MODULE_DEPENDS_WINDOWS ${wincrt_sdk}
|
||||||
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
|
SWIFT_MODULE_DEPENDS_LINUX ${glibc}
|
||||||
|
SWIFT_MODULE_DEPENDS_LINUX_STATIC ${musl}
|
||||||
|
|
||||||
INSTALL_IN_COMPONENT libexec
|
INSTALL_IN_COMPONENT libexec
|
||||||
COMPILE_FLAGS
|
COMPILE_FLAGS
|
||||||
${BACKTRACING_COMPILE_FLAGS}
|
${BACKTRACING_COMPILE_FLAGS}
|
||||||
-parse-as-library
|
-parse-as-library
|
||||||
|
|
||||||
TARGET_SDKS LINUX)
|
TARGET_SDKS ${static_target_sdks})
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -17,7 +17,11 @@
|
|||||||
|
|
||||||
#if os(Linux)
|
#if os(Linux)
|
||||||
|
|
||||||
|
#if canImport(Glibc)
|
||||||
import Glibc
|
import Glibc
|
||||||
|
#elseif canImport(Musl)
|
||||||
|
import Musl
|
||||||
|
#endif
|
||||||
|
|
||||||
import _Backtracing
|
import _Backtracing
|
||||||
@_spi(Internal) import _Backtracing
|
@_spi(Internal) import _Backtracing
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
import Darwin.C
|
import Darwin.C
|
||||||
#elseif canImport(Glibc)
|
#elseif canImport(Glibc)
|
||||||
import Glibc
|
import Glibc
|
||||||
|
#elseif canImport(Musl)
|
||||||
|
import Musl
|
||||||
#elseif canImport(CRT)
|
#elseif canImport(CRT)
|
||||||
import CRT
|
import CRT
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
import Darwin
|
import Darwin
|
||||||
#elseif canImport(Glibc)
|
#elseif canImport(Glibc)
|
||||||
import Glibc
|
import Glibc
|
||||||
|
#elseif canImport(Musl)
|
||||||
|
import Musl
|
||||||
#elseif canImport(CRT)
|
#elseif canImport(CRT)
|
||||||
import CRT
|
import CRT
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -16,6 +16,14 @@
|
|||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
|
||||||
|
#ifndef _GNU_SOURCE
|
||||||
|
#define _GNU_SOURCE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _LARGEFILE64_SOURCE
|
||||||
|
#define _LARGEFILE64_SOURCE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <linux/capability.h>
|
#include <linux/capability.h>
|
||||||
#include <linux/futex.h>
|
#include <linux/futex.h>
|
||||||
|
|
||||||
|
|||||||
@@ -525,6 +525,18 @@ _swift_initRuntimePath(void *) {
|
|||||||
int ret = ::dladdr((void *)_swift_initRuntimePath, &dli);
|
int ret = ::dladdr((void *)_swift_initRuntimePath, &dli);
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
|
#ifdef __linux__
|
||||||
|
// If we don't find anything, try reading /proc/self/exe as a fallback;
|
||||||
|
// this is needed with Musl when statically linking because in that case
|
||||||
|
// dladdr() does nothing.
|
||||||
|
char pathBuf[4096];
|
||||||
|
ssize_t len = readlink("/proc/self/exe", pathBuf, sizeof(pathBuf));
|
||||||
|
if (len > 0 && len < sizeof(pathBuf)) {
|
||||||
|
runtimePath = ::strdup(pathBuf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
swift::fatalError(/* flags = */ 0,
|
swift::fatalError(/* flags = */ 0,
|
||||||
"Unable to obtain Swift runtime path\n");
|
"Unable to obtain Swift runtime path\n");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user