mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[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:
@@ -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
7
test/IRGen/Inputs/tls.h
Normal 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;
|
||||
}
|
||||
15
test/IRGen/emulated-tls.swift
Normal file
15
test/IRGen/emulated-tls.swift
Normal 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
|
||||
Reference in New Issue
Block a user