[K/N] Implement isExperimentalMM intrinsic

This commit is contained in:
Pavel Kunyavskiy
2021-07-07 17:02:08 +03:00
committed by Space
parent 55ec6729b0
commit eec8fdf16a
5 changed files with 35 additions and 0 deletions

View File

@@ -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>): 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>): LLVMValueRef {
val varargExpression = callSite.getValueArgument(0) as IrVararg
val vararg = args.single()

View File

@@ -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"

View File

@@ -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)
}
}

View File

@@ -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

View File

@@ -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"