diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt index 6577b7a3d50..23532e64d88 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt @@ -95,6 +95,19 @@ internal sealed class ExceptionHandler { abstract class Local : ExceptionHandler() { abstract val unwind: LLVMBasicBlockRef } + + open fun genThrow( + functionGenerationContext: FunctionGenerationContext, + kotlinException: LLVMValueRef + ): Unit = with(functionGenerationContext) { + call( + context.llvm.throwExceptionFunction, + listOf(kotlinException), + Lifetime.IRRELEVANT, + this@ExceptionHandler + ) + unreachable() + } } internal enum class ThreadState { @@ -790,7 +803,11 @@ internal class FunctionGenerationContext(val function: LLVMValueRef, return LLVMBuildExtractElement(builder, vector, index, name)!! } - fun filteringExceptionHandler(codeContext: CodeContext, foreignExceptionMode: ForeignExceptionMode.Mode, switchThreadState: Boolean): ExceptionHandler { + fun filteringExceptionHandler( + outerHandler: ExceptionHandler, + foreignExceptionMode: ForeignExceptionMode.Mode, + switchThreadState: Boolean + ): ExceptionHandler { val lpBlock = basicBlockInFunction("filteringExceptionHandler", position()?.start) val wrapExceptionMode = context.config.target.family.isAppleFamily && @@ -830,8 +847,8 @@ internal class FunctionGenerationContext(val function: LLVMValueRef, condBr(isObjCException, forwardNativeExceptionBlock, fatalForeignExceptionBlock) appendingTo(forwardNativeExceptionBlock) { - val exception = createForeignException(landingpad, codeContext.exceptionHandler) - codeContext.genThrow(exception) + val exception = createForeignException(landingpad, outerHandler) + outerHandler.genThrow(this, exception) } } } else { @@ -840,7 +857,7 @@ internal class FunctionGenerationContext(val function: LLVMValueRef, appendingTo(forwardKotlinExceptionBlock) { // Rethrow Kotlin exception to real handler. - codeContext.genThrow(extractKotlinException(landingpad)) + outerHandler.genThrow(this, extractKotlinException(landingpad)) } appendingTo(fatalForeignExceptionBlock) { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 3f106039c1d..4f655aa2318 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -106,7 +106,7 @@ internal class RTTIGeneratorVisitor(context: Context) : IrElementVisitorVoid { /** * Defines how to generate context-dependent operations. */ -internal interface CodeContext { +private interface CodeContext { /** * Generates `return` [value] operation. @@ -121,8 +121,6 @@ internal interface CodeContext { val exceptionHandler: ExceptionHandler - fun genThrow(exception: LLVMValueRef) - val stackLocalsManager: StackLocalsManager /** @@ -240,8 +238,6 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map("mode")) - functionGenerationContext.filteringExceptionHandler(currentCodeContext, foreignExceptionMode, needsNativeThreadState) + functionGenerationContext.filteringExceptionHandler( + currentCodeContext.exceptionHandler, + foreignExceptionMode, + needsNativeThreadState + ) } ?: currentCodeContext.exceptionHandler if (needsNativeThreadState) {