diff --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt --- a/compiler-rt/CMakeLists.txt +++ b/compiler-rt/CMakeLists.txt @@ -121,6 +121,8 @@ endif() if ("${COMPILER_RT_DEFAULT_TARGET_TRIPLE}" MATCHES ".*android.*") set(ANDROID 1) + string(REGEX MATCH "-target(=| +)[^ ]+android([0-9]+)" ANDROID_API_LEVEL "${CMAKE_C_FLAGS}") + set(ANDROID_API_LEVEL ${CMAKE_MATCH_2}) endif() pythonize_bool(ANDROID) @@ -275,6 +277,10 @@ endif() # Provide some common commmandline flags for Sanitizer runtimes. +if(${ANDROID_API_LEVEL} GREATER_EQUAL 28) + list(APPEND SANITIZER_COMMON_CFLAGS -fno-emulated-tls) + list(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS -fno-emulated-tls) +endif() if(NOT WIN32) append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC SANITIZER_COMMON_CFLAGS) endif() diff --git a/compiler-rt/lib/lsan/CMakeLists.txt b/compiler-rt/lib/lsan/CMakeLists.txt --- a/compiler-rt/lib/lsan/CMakeLists.txt +++ b/compiler-rt/lib/lsan/CMakeLists.txt @@ -1,6 +1,7 @@ include_directories(..) set(LSAN_CFLAGS ${SANITIZER_COMMON_CFLAGS}) +set(LSAN_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}) append_rtti_flag(OFF LSAN_CFLAGS) set(LSAN_COMMON_SOURCES @@ -61,7 +62,7 @@ RTSanitizerCommonCoverage RTSanitizerCommonSymbolizer CFLAGS ${LSAN_CFLAGS} - LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} + LINK_FLAGS ${LSAN_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} LINK_LIBS ${LSAN_LINK_LIBS} PARENT_TARGET lsan) else() @@ -78,6 +79,7 @@ $ ADDITIONAL_HEADERS ${LSAN_HEADERS} CFLAGS ${LSAN_CFLAGS} + LINK_FLAGS ${LSAN_LINK_FLAGS} PARENT_TARGET lsan) endforeach() endif() diff --git a/compiler-rt/test/lit.common.cfg.py b/compiler-rt/test/lit.common.cfg.py --- a/compiler-rt/test/lit.common.cfg.py +++ b/compiler-rt/test/lit.common.cfg.py @@ -355,6 +355,7 @@ try: android_api_level_str = subprocess.check_output([adb, "shell", "getprop", "ro.build.version.sdk"], env=env).rstrip() + android_api_codename = subprocess.check_output([adb, "shell", "getprop", "ro.build.version.codename"], env=env).rstrip().decode("utf-8") except (subprocess.CalledProcessError, OSError): lit_config.fatal("Failed to read ro.build.version.sdk (using '%s' as adb)" % adb) try: @@ -365,6 +366,8 @@ config.available_features.add('android-26') if android_api_level >= 28: config.available_features.add('android-28') + if android_api_level >= 31 or android_api_codename == 'S': + config.available_features.add('android-thread-properties-api') # Prepare the device. android_tmpdir = '/data/local/tmp/Output' @@ -385,7 +388,7 @@ env={'LANG': 'C'}) sout, _ = ldd_ver_cmd.communicate() ver_line = sout.splitlines()[0] - if ver_line.startswith(b"ldd "): + if not config.android and ver_line.startswith(b"ldd "): from distutils.version import LooseVersion ver = LooseVersion(ver_line.split()[-1].decode()) # 2.27 introduced some incompatibilities diff --git a/compiler-rt/test/lit.common.configured.in b/compiler-rt/test/lit.common.configured.in --- a/compiler-rt/test/lit.common.configured.in +++ b/compiler-rt/test/lit.common.configured.in @@ -40,6 +40,7 @@ set_default("use_lto", config.use_thinlto) set_default("use_newpm", False) set_default("android", @ANDROID_PYBOOL@) +set_default("android_ndk_version", @ANDROID_NDK_VERSION@) set_default("android_serial", "@ANDROID_SERIAL_FOR_TESTING@") set_default("android_files_to_push", []) set_default("have_rpc_xdr_h", @HAVE_RPC_XDR_H@) diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/use_tls_test.cpp b/compiler-rt/test/sanitizer_common/TestCases/Linux/use_tls_test.cpp new file mode 100644 --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/use_tls_test.cpp @@ -0,0 +1,21 @@ +// Test that executable with ELF-TLS will link/run successfully on aarch64 +// RUN: %clangxx -fno-emulated-tls %s -o %t +// RUN: %run %t 2>&1 +// REQUIRES: android-28 + +#include +#include + +__thread void *tls_var; +int var; + +void set_var() { + var = 123; + tls_var = &var; +} +int main() { + set_var(); + fprintf(stderr, "Test alloc: %p\n", tls_var); + fflush(stderr); + return 0; +}