From 61c28db886bc583a9d0ee044ec5aa89eeebd5c17 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Mon, 19 Dec 2016 16:33:17 +0700 Subject: [PATCH] backend: improve Nothing type handling --- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 14 +++++++------- .../kotlin/backend/konan/llvm/LlvmUtils.kt | 4 ++++ 2 files changed, 11 insertions(+), 7 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 d425435f7f7..9c01b8b2c2e 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 @@ -272,16 +272,16 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid //-------------------------------------------------------------------------// - fun evaluateBreak(destination: IrBreak): LLVMValueRef? { + fun evaluateBreak(destination: IrBreak): LLVMValueRef { currentCodeContext.genBreak(destination) - return null + return codegen.kNothingFakeValue } //-------------------------------------------------------------------------// - fun evaluateContinue(destination: IrContinue): LLVMValueRef? { + fun evaluateContinue(destination: IrContinue): LLVMValueRef { currentCodeContext.genContinue(destination) - return null + return codegen.kNothingFakeValue } //-------------------------------------------------------------------------// @@ -860,10 +860,10 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid //-------------------------------------------------------------------------// - private fun evaluateThrow(tmpVariableName: String, expression: IrThrow): LLVMValueRef? { + private fun evaluateThrow(tmpVariableName: String, expression: IrThrow): LLVMValueRef { val exception = evaluateExpression(codegen.newVar(), expression.value)!! currentCodeContext.genThrow(exception) - return null + return codegen.kNothingFakeValue } //-------------------------------------------------------------------------// @@ -1516,7 +1516,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid } currentCodeContext.genReturn(expression.returnTarget, ret) - return null + return codegen.kNothingFakeValue } //-------------------------------------------------------------------------// diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmUtils.kt index 3af832c993e..044048dd4a6 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmUtils.kt @@ -128,6 +128,10 @@ internal val kImmInt64One = Int64(1).llvm internal val ContextUtils.kNullObjHeaderPtr: LLVMValueRef get() = LLVMConstNull(this.kObjHeaderPtr)!! +// Nothing type has no values, but we do generate unreachable code and thus need some fake value: +internal val ContextUtils.kNothingFakeValue: LLVMValueRef + get() = LLVMGetUndef(kObjHeaderPtr)!! + internal fun pointerType(pointeeType: LLVMTypeRef) = LLVMPointerType(pointeeType, 0)!! internal fun structType(vararg types: LLVMTypeRef): LLVMTypeRef = structType(types.toList())