[K/N] Replace thread state switching in objC interop before setting frame in kandingpad block

This commit is contained in:
Elena Lepilkina
2021-10-13 15:23:12 +03:00
committed by Space
parent c228bfb18f
commit 28e30f7a45
@@ -894,7 +894,7 @@ internal abstract class FunctionGenerationContext(
fun extractValue(aggregate: LLVMValueRef, index: Int, name: String = ""): LLVMValueRef = fun extractValue(aggregate: LLVMValueRef, index: Int, name: String = ""): LLVMValueRef =
LLVMBuildExtractValue(builder, aggregate, index, name)!! 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 val personalityFunction = context.llvm.gxxPersonalityFunction.llvmValue
// Type of `landingpad` instruction result (depends on personality function): // 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)!! val landingpad = LLVMBuildLandingPad(builder, landingpadType, personalityFunction, numClauses, name)!!
if (switchThreadState) {
switchThreadState(Runnable)
}
call(context.llvm.setCurrentFrameFunction, listOf(slotsPhi!!)) call(context.llvm.setCurrentFrameFunction, listOf(slotsPhi!!))
setCurrentFrameIsCalled = true setCurrentFrameIsCalled = true
handleEpilogueForExperimentalMM(context.llvm.Kotlin_mm_safePointExceptionUnwind) handleEpilogueForExperimentalMM(context.llvm.Kotlin_mm_safePointExceptionUnwind)
@@ -924,17 +927,13 @@ internal abstract class FunctionGenerationContext(
foreignExceptionMode == ForeignExceptionMode.Mode.OBJC_WRAP foreignExceptionMode == ForeignExceptionMode.Mode.OBJC_WRAP
appendingTo(lpBlock) { appendingTo(lpBlock) {
val landingpad = gxxLandingpad(2) val landingpad = gxxLandingpad(2, switchThreadState = switchThreadState)
LLVMAddClause(landingpad, kotlinExceptionRtti.llvm) LLVMAddClause(landingpad, kotlinExceptionRtti.llvm)
if (wrapExceptionMode) { if (wrapExceptionMode) {
LLVMAddClause(landingpad, objcNSExceptionRtti.llvm) LLVMAddClause(landingpad, objcNSExceptionRtti.llvm)
} }
LLVMAddClause(landingpad, LLVMConstNull(kInt8Ptr)) LLVMAddClause(landingpad, LLVMConstNull(kInt8Ptr))
if (switchThreadState) {
switchThreadState(Runnable)
}
val fatalForeignExceptionBlock = basicBlock("fatalForeignException", position()?.start) val fatalForeignExceptionBlock = basicBlock("fatalForeignException", position()?.start)
val forwardKotlinExceptionBlock = basicBlock("forwardKotlinException", position()?.start) val forwardKotlinExceptionBlock = basicBlock("forwardKotlinException", position()?.start)