From 15e6101608d06ea8251b226178fefec4876b3d11 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Fri, 14 Jan 2022 16:06:20 +0300 Subject: [PATCH] [IR, Native] Support partial linkage in backend ^KT-50775 --- .../src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt | 1 + .../backend/konan/lower/BuiltinOperatorLowering.kt | 9 +++++++++ .../main/kotlin/kotlin/native/internal/RuntimeUtils.kt | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt index 8dcd5de3b59..c86fa2096b7 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt @@ -232,6 +232,7 @@ internal class KonanSymbols( override val throwNullPointerException = internalFunction("ThrowNullPointerException") val throwNoWhenBranchMatchedException = internalFunction("ThrowNoWhenBranchMatchedException") + val throwIrLinkageError = internalFunction("ThrowIrLinkageError") override val throwTypeCastException = internalFunction("ThrowTypeCastException") diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt index 1eff73ea203..deca3431492 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt @@ -57,6 +57,15 @@ internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass, context.ir.symbols.throwNoWhenBranchMatchedException.owner.typeParameters.size, context.ir.symbols.throwNoWhenBranchMatchedException.owner.valueParameters.size) + irBuiltins.linkageErrorSymbol -> { + val newExpression = IrCallImpl.fromSymbolOwner( + expression.startOffset, expression.endOffset, + context.ir.symbols.throwIrLinkageError + ) + newExpression.putValueArgument(0, expression.getValueArgument(0)) // error message + newExpression + } + else -> expression } } diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/RuntimeUtils.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/RuntimeUtils.kt index 558b479be8b..1f827611e16 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/RuntimeUtils.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/RuntimeUtils.kt @@ -112,6 +112,13 @@ internal fun ThrowFileFailedToInitializeException() { throw FileFailedToInitializeException("There was an error during file initialization") } +internal class IrLinkageError(message: String?) : Error(message) + +@PublishedApi +internal fun ThrowIrLinkageError(message: String?): Nothing { + throw IrLinkageError(message) +} + @ExportForCppRuntime internal fun PrintThrowable(throwable: Throwable) { println(throwable)