diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt index 1ca324af79b..04e46901f5a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt @@ -2,6 +2,7 @@ package org.jetbrains.kotlin.backend.konan.llvm import kotlinx.cinterop.cValuesOf import llvm.* +import org.jetbrains.kotlin.backend.konan.MemoryModel import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.backend.konan.descriptors.getAnnotationStringValue import org.jetbrains.kotlin.backend.konan.descriptors.isTypedIntrinsic @@ -63,6 +64,7 @@ internal enum class IntrinsicType { IDENTITY, IMMUTABLE_BLOB, INIT_INSTANCE, + IS_EXPERIMENTAL_MM, // Enums ENUM_VALUES, ENUM_VALUE_OF, @@ -237,6 +239,7 @@ internal class IntrinsicGenerator(private val environment: IntrinsicGeneratorEnv IntrinsicType.IDENTITY -> emitIdentity(args) IntrinsicType.GET_CONTINUATION -> emitGetContinuation() IntrinsicType.INTEROP_MEMORY_COPY -> emitMemoryCopy(callSite, args) + IntrinsicType.IS_EXPERIMENTAL_MM -> emitIsExperimentalMM() IntrinsicType.RETURN_IF_SUSPENDED, IntrinsicType.INTEROP_BITS_TO_FLOAT, IntrinsicType.INTEROP_BITS_TO_DOUBLE, @@ -269,6 +272,9 @@ internal class IntrinsicGenerator(private val environment: IntrinsicGeneratorEnv private fun FunctionGenerationContext.emitIdentity(args: List): LLVMValueRef = args.single() + private fun FunctionGenerationContext.emitIsExperimentalMM(): LLVMValueRef = + Int1(if (context.memoryModel == MemoryModel.EXPERIMENTAL) 1 else 0).llvm + private fun FunctionGenerationContext.emitListOfInternal(callSite: IrCall, args: List): LLVMValueRef { val varargExpression = callSite.getValueArgument(0) as IrVararg val vararg = args.single() diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index b1e513e9aac..f0be8b1bc99 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -4296,6 +4296,11 @@ task interop_sourceCodeStruct(type: KonanLocalTest) { source = "codegen/intrinsics/interop_sourceCodeStruct.kt" } +standaloneTest("isExperimentalMM") { + source = "codegen/intrinsics/isExperimentalMM.kt" + flags = [ "-tr" ] +} + interopTest("interop_cppClass") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/cpp/cppClass.kt" diff --git a/kotlin-native/backend.native/tests/codegen/intrinsics/isExperimentalMM.kt b/kotlin-native/backend.native/tests/codegen/intrinsics/isExperimentalMM.kt new file mode 100644 index 00000000000..ae93fb6d8f8 --- /dev/null +++ b/kotlin-native/backend.native/tests/codegen/intrinsics/isExperimentalMM.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +import kotlin.test.* +import kotlin.native.Platform + +@Test +@OptIn(kotlin.ExperimentalStdlibApi::class) +fun testIsExperimentalMM() { + if (isExperimentalMM()) { + assertEquals(Platform.memoryModel, MemoryModel.EXPERIMENTAL) + } else { + assertNotEquals(Platform.memoryModel, MemoryModel.EXPERIMENTAL) + } +} \ No newline at end of file diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/Platform.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/Platform.kt index 5cf45f52e53..8327bf8cfb6 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/Platform.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/Platform.kt @@ -5,6 +5,8 @@ package kotlin.native import kotlin.native.internal.GCUnsafeCall +import kotlin.native.internal.TypedIntrinsic +import kotlin.native.internal.IntrinsicType /** * Operating system family. @@ -131,3 +133,7 @@ private external fun Platform_getCleanersLeakChecker(): Boolean @GCUnsafeCall("Konan_Platform_setCleanersLeakChecker") private external fun Platform_setCleanersLeakChecker(value: Boolean): Unit + +@TypedIntrinsic(IntrinsicType.IS_EXPERIMENTAL_MM) +@ExperimentalStdlibApi +external fun isExperimentalMM(): Boolean diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/IntrinsicType.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/IntrinsicType.kt index 25edf9928d0..116a80bd41f 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/IntrinsicType.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/IntrinsicType.kt @@ -54,6 +54,7 @@ class IntrinsicType { const val IDENTITY = "IDENTITY" const val IMMUTABLE_BLOB = "IMMUTABLE_BLOB" const val INIT_INSTANCE = "INIT_INSTANCE" + const val IS_EXPERIMENTAL_MM = "IS_EXPERIMENTAL_MM" // Enums const val ENUM_VALUES = "ENUM_VALUES"