From 114a939c77cff1a4f189bc3cc6959d0f3f9742a5 Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Tue, 19 Jul 2016 17:20:42 +0300 Subject: [PATCH] translator: add resolve Byte, Char and Boolean types, fix char type, add byte type --- .../kotlinnative/translator/BlockCodegen.kt | 2 +- .../translator/llvm/generators.kt | 3 ++ .../translator/llvm/types/LLVMByteType.kt | 2 +- .../translator/llvm/types/LLVMCharType.kt | 29 +++++++++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index dacd836d6c2..9b462bc73e8 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -380,7 +380,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM return null } - val newVar = variableManager.receiveVariable(identifier, assignExpression.type!!, LLVMRegisterScope(), pointer = 1) + val newVar = variableManager.receiveVariable(identifier, LLVMMapStandardType(identifier, variable.type).type, LLVMRegisterScope(), pointer = 1) codeBuilder.addConstant(newVar, assignExpression) variableManager.addVariable(identifier, newVar, scopeDepth) } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt index 3f8b2afc7c2..6efabf0d40d 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt @@ -16,6 +16,9 @@ fun LLVMMapStandardType(name: String, type: KotlinType, scope: LLVMScope = LLVMR type.isFunctionTypeOrSubtype -> LLVMVariable(name, LLVMFunctionType(type), type.toString(), scope, pointer = 1) type.toString() == "Int" -> LLVMVariable(name, LLVMIntType(), type.toString(), scope) type.toString() == "Double" -> LLVMVariable(name, LLVMDoubleType(), type.toString(), scope) + type.toString() == "Byte" -> LLVMVariable(name, LLVMByteType(), type.toString(), scope) + type.toString() == "Char" -> LLVMVariable(name, LLVMCharType(), type.toString(), scope) + type.toString() == "Boolean" -> LLVMVariable(name, LLVMBooleanType(), type.toString(), scope) type.isUnit() -> LLVMVariable("", LLVMVoidType(), "", scope) type.isMarkedNullable -> LLVMVariable(name, LLVMReferenceType("${type.toString().dropLast(1)}"), name, scope, pointer = 1) else -> LLVMVariable(name, LLVMReferenceType("$type"), name, scope, pointer = 1) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt index 5ddbda01d76..a30fc5de74a 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt @@ -3,7 +3,7 @@ package org.kotlinnative.translator.llvm.types import org.kotlinnative.translator.llvm.LLVMExpression import org.kotlinnative.translator.llvm.LLVMSingleValue -class LLVMCharType() : LLVMType() { +class LLVMByteType() : LLVMType() { override fun operatorLt(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = LLVMExpression(LLVMBooleanType(), "icmp slt i8 $firstOp, $secondOp") diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt new file mode 100644 index 00000000000..5ddbda01d76 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt @@ -0,0 +1,29 @@ +package org.kotlinnative.translator.llvm.types + +import org.kotlinnative.translator.llvm.LLVMExpression +import org.kotlinnative.translator.llvm.LLVMSingleValue + +class LLVMCharType() : LLVMType() { + override fun operatorLt(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMBooleanType(), "icmp slt i8 $firstOp, $secondOp") + + override fun operatorGt(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMBooleanType(), "icmp sgt i8 $firstOp, $secondOp") + + override fun operatorLeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMBooleanType(), "icmp sle i8 $firstOp, $secondOp") + + override fun operatorGeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMBooleanType(), "icmp sge i8 $firstOp, $secondOp") + + override fun operatorEq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMBooleanType(), "icmp eq i8 $firstOp, $secondOp") + + override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMBooleanType(), "icmp ne i8 $firstOp, $secondOp") + + override val align = 1 + override val size: Byte = 1 + override fun toString(): String = "i8" + override val defaultValue = "0" +}