From 95eaf3d2340e4ff412ae389973299519a3a8fe0c Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Tue, 13 Sep 2022 12:33:58 +0200 Subject: [PATCH] [K/N] Add lowered suspend function mangling to avoid clashes --- .../common/serialization/mangle/MangleConstant.kt | 1 + .../common/serialization/mangle/ir/IrMangleComputer.kt | 5 +++++ .../kotlin/backend/konan/serialization/KonanMangler.kt | 10 ++++++++++ .../tests/filecheck/suspend_returnNothing.kt | 2 +- 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/MangleConstant.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/MangleConstant.kt index 9c7814588c5..85853ab5986 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/MangleConstant.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/MangleConstant.kt @@ -21,6 +21,7 @@ enum class MangleConstant(val prefix: Char, val separator: Char, val suffix: Cha const val ERROR_MARK = "" const val ERROR_DECLARATION = "" const val STATIC_MEMBER_MARK = "#static" + const val SUSPEND_FUNCTION_MARK = "#suspend" const val TYPE_PARAMETER_MARKER_NAME = "" const val TYPE_PARAMETER_MARKER_NAME_SETTER = "" const val BACKING_FIELD_NAME = "" diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt index e9258b24bb1..a283264a9bd 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt @@ -28,6 +28,7 @@ abstract class IrMangleComputer(protected val builder: StringBuilder, private va private var isRealExpect = false open fun IrFunction.platformSpecificFunctionName(): String? = null + open fun IrFunction.platformSpecificFunctionMarks(): List = emptyList() open fun IrFunction.specialValueParamPrefix(param: IrValueParameter): String = "" @@ -112,6 +113,10 @@ abstract class IrMangleComputer(protected val builder: StringBuilder, private va builder.appendSignature(MangleConstant.STATIC_MEMBER_MARK) } + platformSpecificFunctionMarks().forEach { + builder.appendSignature(it) + } + extensionReceiverParameter?.let { if (!it.isHidden) { builder.appendSignature(MangleConstant.EXTENSION_RECEIVER_PREFIX) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt index b791394fadd..54194d2ab6f 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMangler.kt @@ -1,6 +1,7 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.common.serialization.mangle.KotlinExportChecker +import org.jetbrains.kotlin.backend.common.serialization.mangle.MangleConstant import org.jetbrains.kotlin.backend.common.serialization.mangle.MangleMode import org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor.DescriptorBasedKotlinManglerImpl import org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor.DescriptorExportCheckerVisitor @@ -76,6 +77,11 @@ abstract class AbstractKonanIrMangler(private val withReturnType: Boolean) : IrB return null } + override fun IrFunction.platformSpecificFunctionMarks(): List = when (origin) { + IrDeclarationOrigin.LOWERED_SUSPEND_FUNCTION -> listOfSuspendFunctionMark + else -> emptyList() + } + override fun IrFunction.specialValueParamPrefix(param: IrValueParameter): String { // TODO: there are clashes originating from ObjectiveC interop. // kotlinx.cinterop.ObjCClassOf.create(format: kotlin.String): T defined in platform.Foundation in file Foundation.kt @@ -84,6 +90,10 @@ abstract class AbstractKonanIrMangler(private val withReturnType: Boolean) : IrB return if (this.hasObjCMethodAnnotation || this.hasObjCFactoryAnnotation || this.isObjCClassMethod()) "${param.name}:" else "" } + + companion object { + val listOfSuspendFunctionMark = listOf(MangleConstant.SUSPEND_FUNCTION_MARK) + } } } diff --git a/kotlin-native/backend.native/tests/filecheck/suspend_returnNothing.kt b/kotlin-native/backend.native/tests/filecheck/suspend_returnNothing.kt index 359b68b49f7..e9558eec71b 100644 --- a/kotlin-native/backend.native/tests/filecheck/suspend_returnNothing.kt +++ b/kotlin-native/backend.native/tests/filecheck/suspend_returnNothing.kt @@ -19,7 +19,7 @@ suspend fun suspendForever(): Int = suspendCoroutineUninterceptedOrReturn { // CHECK-LABEL: define %struct.ObjHeader* @"kfun:$fooCOROUTINE // CHECK-NOT: ; Function Attrs: {{.*}}noreturn -// CHECK-LABEL: define %struct.ObjHeader* @"kfun:#foo(){}kotlin.Nothing" +// CHECK-LABEL: define %struct.ObjHeader* @"kfun:#foo#suspend(kotlin.coroutines.Continuation){}kotlin.Any" suspend fun foo(): Nothing { suspendForever() throw Error()