From d88ff9ac08b842057fbd0559a7e9a55c082345cb Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Thu, 24 Nov 2016 18:32:56 +0300 Subject: [PATCH] CODEGEN: buggy fixing: visitReturn - shouldn't emit anything, just pass execution to evaluateReturn evaluateThrow - should ends with unreachable statement evaluateReturn - should actually emit ret instruction only for non-Unit return type of statement (cherry picked from commit 0221353f05fa20826c817a9195210825535193c4) --- .../jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index c0efe0d48fd..68bb8774354 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -279,9 +279,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid override fun visitReturn(expression: IrReturn) { logger.log("visitReturn : ${ir2string(expression)}") - val tmpVarName = codegen.newVar() // Generate new tmp name. - val value = evaluateExpression(tmpVarName, expression.value) // - codegen.ret(value) + evaluateExpression("", expression) } //-------------------------------------------------------------------------// @@ -374,7 +372,8 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid val objPointer = evaluateExpression(codegen.newVar(), expression.value) val objHeaderPtr = codegen.bitcast(kObjHeaderPtr, objPointer!!, codegen.newVar()) val args = listOf(objHeaderPtr) // Create arg list. - return codegen.call(context.throwExceptionFunction, args, "") + codegen.call(context.throwExceptionFunction, args, "") + return codegen.unreachable() } //-------------------------------------------------------------------------// @@ -612,6 +611,8 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid private fun evaluateReturn(value: IrReturn): LLVMValueRef? { logger.log("evaluateReturn : ${ir2string(value)}") val ret = evaluateExpression(codegen.newVar(), value.value) + if (KotlinBuiltIns.isUnit(value.value.type)) + return ret return codegen.ret(ret) }