diff --git a/compiler-rt/lib/builtins/cpu_model.c b/compiler-rt/lib/builtins/cpu_model.c --- a/compiler-rt/lib/builtins/cpu_model.c +++ b/compiler-rt/lib/builtins/cpu_model.c @@ -798,6 +798,10 @@ #ifndef HWCAP_ATOMICS #define HWCAP_ATOMICS (1 << 8) #endif +#if defined(__ANDROID__) +#include +#include +#endif static void CONSTRUCTOR_ATTRIBUTE init_have_lse_atomics(void) { #if defined(__FreeBSD__) unsigned long hwcap; @@ -805,8 +809,20 @@ __aarch64_have_lse_atomics = result == 0 && (hwcap & HWCAP_ATOMICS) != 0; #else unsigned long hwcap = getauxval(AT_HWCAP); - __aarch64_have_lse_atomics = (hwcap & HWCAP_ATOMICS) != 0; -#endif + _Bool result = (hwcap & HWCAP_ATOMICS) != 0; +#if defined(__ANDROID__) + if (result) { + char arch[PROP_VALUE_MAX]; + if (__system_property_get("ro.arch", arch) > 0 && + strncmp(arch, "exynos9810", sizeof("exynos9810") - 1) == 0) { + // Some cores of Exynos 9810 are ARMv8.2 and others are ARMv8.0, + // so disable the lse atomics completely. + result = false; + } + } +#endif // defined(__ANDROID__) + __aarch64_have_lse_atomics = result; +#endif // defined(__FreeBSD__) } #endif // defined(__has_include) #endif // __has_include()