From 28e30f7a457c823dbbdca132b97c2f081b8bae73 Mon Sep 17 00:00:00 2001 From: Elena Lepilkina Date: Wed, 13 Oct 2021 15:23:12 +0300 Subject: [PATCH] [K/N] Replace thread state switching in objC interop before setting frame in kandingpad block --- .../kotlin/backend/konan/llvm/CodeGenerator.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) 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 1f629f5d07d..5fb753af793 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 @@ -894,7 +894,7 @@ internal abstract class FunctionGenerationContext( fun extractValue(aggregate: LLVMValueRef, index: Int, name: String = ""): LLVMValueRef = LLVMBuildExtractValue(builder, aggregate, index, name)!! - fun gxxLandingpad(numClauses: Int, name: String = ""): LLVMValueRef { + fun gxxLandingpad(numClauses: Int, name: String = "", switchThreadState: Boolean = false): LLVMValueRef { val personalityFunction = context.llvm.gxxPersonalityFunction.llvmValue // Type of `landingpad` instruction result (depends on personality function): @@ -902,6 +902,9 @@ internal abstract class FunctionGenerationContext( val landingpad = LLVMBuildLandingPad(builder, landingpadType, personalityFunction, numClauses, name)!! + if (switchThreadState) { + switchThreadState(Runnable) + } call(context.llvm.setCurrentFrameFunction, listOf(slotsPhi!!)) setCurrentFrameIsCalled = true handleEpilogueForExperimentalMM(context.llvm.Kotlin_mm_safePointExceptionUnwind) @@ -924,17 +927,13 @@ internal abstract class FunctionGenerationContext( foreignExceptionMode == ForeignExceptionMode.Mode.OBJC_WRAP appendingTo(lpBlock) { - val landingpad = gxxLandingpad(2) + val landingpad = gxxLandingpad(2, switchThreadState = switchThreadState) LLVMAddClause(landingpad, kotlinExceptionRtti.llvm) if (wrapExceptionMode) { LLVMAddClause(landingpad, objcNSExceptionRtti.llvm) } LLVMAddClause(landingpad, LLVMConstNull(kInt8Ptr)) - if (switchThreadState) { - switchThreadState(Runnable) - } - val fatalForeignExceptionBlock = basicBlock("fatalForeignException", position()?.start) val forwardKotlinExceptionBlock = basicBlock("forwardKotlinException", position()?.start)