[K/N] Implement isExperimentalMM intrinsic
This commit is contained in:
+6
@@ -2,6 +2,7 @@ package org.jetbrains.kotlin.backend.konan.llvm
|
|||||||
|
|
||||||
import kotlinx.cinterop.cValuesOf
|
import kotlinx.cinterop.cValuesOf
|
||||||
import llvm.*
|
import llvm.*
|
||||||
|
import org.jetbrains.kotlin.backend.konan.MemoryModel
|
||||||
import org.jetbrains.kotlin.backend.konan.RuntimeNames
|
import org.jetbrains.kotlin.backend.konan.RuntimeNames
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.getAnnotationStringValue
|
import org.jetbrains.kotlin.backend.konan.descriptors.getAnnotationStringValue
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.isTypedIntrinsic
|
import org.jetbrains.kotlin.backend.konan.descriptors.isTypedIntrinsic
|
||||||
@@ -63,6 +64,7 @@ internal enum class IntrinsicType {
|
|||||||
IDENTITY,
|
IDENTITY,
|
||||||
IMMUTABLE_BLOB,
|
IMMUTABLE_BLOB,
|
||||||
INIT_INSTANCE,
|
INIT_INSTANCE,
|
||||||
|
IS_EXPERIMENTAL_MM,
|
||||||
// Enums
|
// Enums
|
||||||
ENUM_VALUES,
|
ENUM_VALUES,
|
||||||
ENUM_VALUE_OF,
|
ENUM_VALUE_OF,
|
||||||
@@ -237,6 +239,7 @@ internal class IntrinsicGenerator(private val environment: IntrinsicGeneratorEnv
|
|||||||
IntrinsicType.IDENTITY -> emitIdentity(args)
|
IntrinsicType.IDENTITY -> emitIdentity(args)
|
||||||
IntrinsicType.GET_CONTINUATION -> emitGetContinuation()
|
IntrinsicType.GET_CONTINUATION -> emitGetContinuation()
|
||||||
IntrinsicType.INTEROP_MEMORY_COPY -> emitMemoryCopy(callSite, args)
|
IntrinsicType.INTEROP_MEMORY_COPY -> emitMemoryCopy(callSite, args)
|
||||||
|
IntrinsicType.IS_EXPERIMENTAL_MM -> emitIsExperimentalMM()
|
||||||
IntrinsicType.RETURN_IF_SUSPENDED,
|
IntrinsicType.RETURN_IF_SUSPENDED,
|
||||||
IntrinsicType.INTEROP_BITS_TO_FLOAT,
|
IntrinsicType.INTEROP_BITS_TO_FLOAT,
|
||||||
IntrinsicType.INTEROP_BITS_TO_DOUBLE,
|
IntrinsicType.INTEROP_BITS_TO_DOUBLE,
|
||||||
@@ -269,6 +272,9 @@ internal class IntrinsicGenerator(private val environment: IntrinsicGeneratorEnv
|
|||||||
private fun FunctionGenerationContext.emitIdentity(args: List<LLVMValueRef>): LLVMValueRef =
|
private fun FunctionGenerationContext.emitIdentity(args: List<LLVMValueRef>): LLVMValueRef =
|
||||||
args.single()
|
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 {
|
private fun FunctionGenerationContext.emitListOfInternal(callSite: IrCall, args: List<LLVMValueRef>): LLVMValueRef {
|
||||||
val varargExpression = callSite.getValueArgument(0) as IrVararg
|
val varargExpression = callSite.getValueArgument(0) as IrVararg
|
||||||
val vararg = args.single()
|
val vararg = args.single()
|
||||||
|
|||||||
@@ -4296,6 +4296,11 @@ task interop_sourceCodeStruct(type: KonanLocalTest) {
|
|||||||
source = "codegen/intrinsics/interop_sourceCodeStruct.kt"
|
source = "codegen/intrinsics/interop_sourceCodeStruct.kt"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
standaloneTest("isExperimentalMM") {
|
||||||
|
source = "codegen/intrinsics/isExperimentalMM.kt"
|
||||||
|
flags = [ "-tr" ]
|
||||||
|
}
|
||||||
|
|
||||||
interopTest("interop_cppClass") {
|
interopTest("interop_cppClass") {
|
||||||
disabled = (project.testTarget == 'wasm32') // No interop for wasm yet.
|
disabled = (project.testTarget == 'wasm32') // No interop for wasm yet.
|
||||||
source = "interop/cpp/cppClass.kt"
|
source = "interop/cpp/cppClass.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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,8 @@
|
|||||||
package kotlin.native
|
package kotlin.native
|
||||||
|
|
||||||
import kotlin.native.internal.GCUnsafeCall
|
import kotlin.native.internal.GCUnsafeCall
|
||||||
|
import kotlin.native.internal.TypedIntrinsic
|
||||||
|
import kotlin.native.internal.IntrinsicType
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Operating system family.
|
* Operating system family.
|
||||||
@@ -131,3 +133,7 @@ private external fun Platform_getCleanersLeakChecker(): Boolean
|
|||||||
|
|
||||||
@GCUnsafeCall("Konan_Platform_setCleanersLeakChecker")
|
@GCUnsafeCall("Konan_Platform_setCleanersLeakChecker")
|
||||||
private external fun Platform_setCleanersLeakChecker(value: Boolean): Unit
|
private external fun Platform_setCleanersLeakChecker(value: Boolean): Unit
|
||||||
|
|
||||||
|
@TypedIntrinsic(IntrinsicType.IS_EXPERIMENTAL_MM)
|
||||||
|
@ExperimentalStdlibApi
|
||||||
|
external fun isExperimentalMM(): Boolean
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ class IntrinsicType {
|
|||||||
const val IDENTITY = "IDENTITY"
|
const val IDENTITY = "IDENTITY"
|
||||||
const val IMMUTABLE_BLOB = "IMMUTABLE_BLOB"
|
const val IMMUTABLE_BLOB = "IMMUTABLE_BLOB"
|
||||||
const val INIT_INSTANCE = "INIT_INSTANCE"
|
const val INIT_INSTANCE = "INIT_INSTANCE"
|
||||||
|
const val IS_EXPERIMENTAL_MM = "IS_EXPERIMENTAL_MM"
|
||||||
|
|
||||||
// Enums
|
// Enums
|
||||||
const val ENUM_VALUES = "ENUM_VALUES"
|
const val ENUM_VALUES = "ENUM_VALUES"
|
||||||
|
|||||||
Reference in New Issue
Block a user