diff --git a/runtime/src/main/cpp/Atomic.cpp b/runtime/src/main/cpp/Atomic.cpp index add924bc1ab..3a01721f5f1 100644 --- a/runtime/src/main/cpp/Atomic.cpp +++ b/runtime/src/main/cpp/Atomic.cpp @@ -95,14 +95,13 @@ KLong Kotlin_AtomicLong_addAndGet(KRef thiz, KLong delta) { return addAndGetImpl(thiz, delta); } -#ifdef __mips +#if KONAN_NO_64BIT_ATOMIC static int lock64 = 0; #endif KLong Kotlin_AtomicLong_compareAndSwap(KRef thiz, KLong expectedValue, KLong newValue) { -#ifdef __mips +#if KONAN_NO_64BIT_ATOMIC // Potentially huge performance penalty, but correct. - // TODO: reconsider, once target MIPS can do proper 64-bit CAS. while (compareAndSwap(&lock64, 0, 1) != 0); volatile KLong* address = getValueLocation(thiz); KLong old = *address; @@ -117,9 +116,8 @@ KLong Kotlin_AtomicLong_compareAndSwap(KRef thiz, KLong expectedValue, KLong new } KBoolean Kotlin_AtomicLong_compareAndSet(KRef thiz, KLong expectedValue, KLong newValue) { -#ifdef __mips +#if KONAN_NO_64BIT_ATOMIC // Potentially huge performance penalty, but correct. - // TODO: reconsider, once target MIPS can do proper 64-bit CAS. KBoolean result = false; while (compareAndSwap(&lock64, 0, 1) != 0); volatile KLong* address = getValueLocation(thiz); @@ -136,9 +134,8 @@ KBoolean Kotlin_AtomicLong_compareAndSet(KRef thiz, KLong expectedValue, KLong n } void Kotlin_AtomicLong_set(KRef thiz, KLong newValue) { -#ifdef __mips +#if KONAN_NO_64BIT_ATOMIC // Potentially huge performance penalty, but correct. - // TODO: reconsider, once target MIPS can do proper 64-bit atomic store. while (compareAndSwap(&lock64, 0, 1) != 0); volatile KLong* address = getValueLocation(thiz); *address = newValue; @@ -149,9 +146,8 @@ void Kotlin_AtomicLong_set(KRef thiz, KLong newValue) { } KLong Kotlin_AtomicLong_get(KRef thiz) { -#ifdef __mips +#if KONAN_NO_64BIT_ATOMIC // Potentially huge performance penalty, but correct. - // TODO: reconsider, once target MIPS can do proper 64-bit atomic store. while (compareAndSwap(&lock64, 0, 1) != 0); volatile KLong* address = getValueLocation(thiz); KLong value = *address; diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt index b39a071f0eb..a7633c4890c 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt @@ -135,12 +135,16 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con KonanTarget.LINUX_MIPS32 -> listOf("-DUSE_GCC_UNWIND=1", "-DUSE_ELF_SYMBOLS=1", - "-DELFSIZE=32") + "-DELFSIZE=32", + // TODO: reconsider, once target MIPS can do proper 64-bit load/store/CAS. + "-DKONAN_NO_64BIT_ATOMIC=1") KonanTarget.LINUX_MIPSEL32 -> listOf("-DUSE_GCC_UNWIND=1", "-DUSE_ELF_SYMBOLS=1", - "-DELFSIZE=32") + "-DELFSIZE=32", + // TODO: reconsider, once target MIPS can do proper 64-bit load/store/CAS. + "-DKONAN_NO_64BIT_ATOMIC=1") KonanTarget.MINGW_X64 -> listOf("-DUSE_GCC_UNWIND=1", @@ -155,11 +159,22 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con "-DKONAN_CORE_SYMBOLICATION=1", "-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1") - KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64 -> + KonanTarget.IOS_ARM32 -> listOf("-DKONAN_OBJC_INTEROP=1", "-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1", "-DKONAN_REPORT_BACKTRACE_TO_IOS_CRASH_LOG=1", - "-DMACHSIZE=${target.architecture.bitness}") + "-DMACHSIZE=32", + // While not 100% correct here, using atomic ops on iOS armv7 requires 8 byte alignment, + // and general ABI requires 4-byte alignment on 64-bit long fields as mentioned in + // https://developer.apple.com/library/archive/documentation/Xcode/Conceptual/iPhoneOSABIReference/Articles/ARMv6FunctionCallingConventions.html#//apple_ref/doc/uid/TP40009021-SW1 + // See https://github.com/ktorio/ktor/issues/941 for the context. + "-DKONAN_NO_64BIT_ATOMIC=1") + + KonanTarget.IOS_ARM64 -> + listOf("-DKONAN_OBJC_INTEROP=1", + "-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1", + "-DKONAN_REPORT_BACKTRACE_TO_IOS_CRASH_LOG=1", + "-DMACHSIZE=64") KonanTarget.IOS_X64 -> listOf("-DKONAN_OBJC_INTEROP=1",