[android] Use emulated thread-local storage for API 28 and earlier

Android before API 29 and a few other platforms don't support native TLS, so
fall back to LLVM's emulated TLS there, just like clang does. Also, make sure
`-Xcc -f{no-,}emulated-tls` flags passed in are applied to control what the
Swift compiler does.
This commit is contained in:
Finagolfin
2024-12-29 23:07:38 +05:30
parent 55189bae8e
commit c69a12ce39
3 changed files with 27 additions and 0 deletions

View File

@@ -143,6 +143,11 @@ swift::getIRTargetOptions(const IRGenOptions &Opts, ASTContext &Ctx) {
// Set UseInitArray appropriately.
TargetOpts.UseInitArray = Clang->getCodeGenOpts().UseInitArray;
// Set emulated TLS in inlined C/C++ functions based on what clang is doing,
// ie either setting the default based on the OS or -Xcc -f{no-,}emulated-tls
// command-line flags.
TargetOpts.EmulatedTLS = Clang->getCodeGenOpts().EmulatedTLS;
// WebAssembly doesn't support atomics yet, see
// https://github.com/apple/swift/issues/54533 for more details.
if (Clang->getTargetInfo().getTriple().isOSBinFormatWasm())

7
test/IRGen/Inputs/tls.h Normal file
View File

@@ -0,0 +1,7 @@
#include "shims/SwiftStdint.h"
static inline __swift_uint32_t _swift_stdlib_gettid() {
static __thread __swift_uint32_t tid = 0;
return tid;
}

View File

@@ -0,0 +1,15 @@
// RUN: %target-swift-frontend -Xcc -femulated-tls %s -S -import-objc-header %S/Inputs/tls.h | %FileCheck %s --check-prefix=EMUTLS --check-prefix=EMUTLS-%target-os
// RUN: %target-swift-frontend -Xcc -fno-emulated-tls %s -S -import-objc-header %S/Inputs/tls.h | %FileCheck %s --check-prefix=NOEMUTLS
_swift_stdlib_gettid()
// EMUTLS: __emutls_v._swift_stdlib_gettid.tid
// EMUTLS-linux-android: __emutls_get_address
// EMUTLS-linux-gnu: __emutls_get_address
// EMUTLS-macosx: __emutls_get_address
// EMUTLS-openbsd: __emutls_get_address
// EMUTLS-windows-msvc: __emutls_get_address
// EMUTLS-wasi-NOT: __emutls_get_address
// NOEMUTLS-NOT: __emutls_v._swift_stdlib_gettid.tid
// NOEMUTLS-NOT: __emutls_get_address