From 55c3401f56bfa5b371e66f062aad880e718a63de Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Mon, 11 Jul 2016 15:25:13 +0300 Subject: [PATCH 1/3] translator: add double and fix variable bugs --- .../translator/llvm/LLVMBuilder.kt | 6 ++--- .../translator/llvm/LLVMExpression.kt | 2 +- .../translator/llvm/types/LLVMDoubleType.kt | 24 +++++++++++++++++++ .../translator/llvm/types/LLVMIntType.kt | 11 +++++++++ .../translator/llvm/types/LLVMType.kt | 3 +++ 5 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt index 520bb70cb30..a6af3933ed5 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -30,9 +30,9 @@ class LLVMBuilder { fun addPrimitiveBinaryOperation(operation: IElementType, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMVariable { val newVar = getNewVariable(::LLVMIntType) val llvmOperator = when (operation) { - KtTokens.PLUS -> "add nsw i32" - KtTokens.MINUS -> "sub nsw i32" - KtTokens.MUL -> "mul nsw i32" + KtTokens.PLUS -> firstOp.type?.operatorPlus(newVar, firstOp, secondOp)?.generateExpression(this) + KtTokens.MINUS -> firstOp.type?.operatorMinus(newVar, firstOp, secondOp)?.generateExpression(this) + KtTokens.MUL -> firstOp.type?.operatorTimes(newVar, firstOp, secondOp)?.generateExpression(this) else -> throw UnsupportedOperationException("Unkbown binary operator") } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt index b70b8074ff7..51338c88d98 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt @@ -6,7 +6,7 @@ import kotlin.reflect.KFunction0 class LLVMExpression(val variableType: KFunction0, val llvmCode: String) : LLVMNode() { fun generateExpression(builder: LLVMBuilder): LLVMVariable { val newVar = builder.getNewVariable(variableType); - builder.addLLVMCode("%$newVar = $llvmCode"); + builder.addLLVMCode("$newVar = $llvmCode"); return newVar } } \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt new file mode 100644 index 00000000000..74593ed5880 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt @@ -0,0 +1,24 @@ +package org.kotlinnative.translator.llvm.types + +import org.kotlinnative.translator.llvm.LLVMExpression +import org.kotlinnative.translator.llvm.LLVMVariable + + +class LLVMDoubleType() : LLVMType() { + + override fun operatorMinus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { + //TODO switch by types: int + double = int + return LLVMExpression(::LLVMIntType, "fsub double i32 $firstOp, $secondOp") + } + + override fun operatorTimes(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { + //TODO switch by types: int + double = int + return LLVMExpression(::LLVMIntType, "fmul double i32 $firstOp, $secondOp") + } + + override fun operatorPlus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { + //TODO switch by types: int + double = int + return LLVMExpression(::LLVMIntType, "fadd double $firstOp, $secondOp") + } + +} \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt index fb9d09a9689..5698fe35e9e 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt @@ -5,6 +5,17 @@ import org.kotlinnative.translator.llvm.LLVMVariable class LLVMIntType() : LLVMType() { + + override fun operatorMinus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { + //TODO switch by types: int + double = int + return LLVMExpression(::LLVMIntType, "sub nsw i32 $firstOp, $secondOp") + } + + override fun operatorTimes(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { + //TODO switch by types: int + double = int + return LLVMExpression(::LLVMIntType, "mul nsw i32 $firstOp, $secondOp") + } + override fun operatorPlus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int return LLVMExpression(::LLVMIntType, "add nsw i32 $firstOp, $secondOp") diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt index 760c58b2664..0b29bbca433 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt @@ -4,5 +4,8 @@ import org.kotlinnative.translator.llvm.LLVMExpression import org.kotlinnative.translator.llvm.LLVMVariable abstract class LLVMType() { + abstract fun operatorPlus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression; + abstract fun operatorTimes(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression; + abstract fun operatorMinus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression; } From 0586473bb648dcbcc7d6db2357e9b2fa6210e17f Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Mon, 11 Jul 2016 15:50:30 +0300 Subject: [PATCH 2/3] translator: reorginize code, fix double expression, add assigment llvm --- .../kotlinnative/translator/llvm/LLVMBuilder.kt | 14 +++++++++----- .../kotlinnative/translator/llvm/LLVMExpression.kt | 10 ++++------ .../translator/llvm/types/LLVMDoubleType.kt | 6 +++--- .../translator/llvm/types/LLVMIntType.kt | 6 +++--- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt index a6af3933ed5..5b2d46c0d5d 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -29,17 +29,21 @@ class LLVMBuilder { fun addPrimitiveBinaryOperation(operation: IElementType, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMVariable { val newVar = getNewVariable(::LLVMIntType) - val llvmOperator = when (operation) { - KtTokens.PLUS -> firstOp.type?.operatorPlus(newVar, firstOp, secondOp)?.generateExpression(this) - KtTokens.MINUS -> firstOp.type?.operatorMinus(newVar, firstOp, secondOp)?.generateExpression(this) - KtTokens.MUL -> firstOp.type?.operatorTimes(newVar, firstOp, secondOp)?.generateExpression(this) + val llvmExpression = when (operation) { + KtTokens.PLUS -> firstOp.type!!.operatorPlus(newVar, firstOp, secondOp) + KtTokens.MINUS -> firstOp.type!!.operatorMinus(newVar, firstOp, secondOp) + KtTokens.MUL -> firstOp.type!!.operatorTimes(newVar, firstOp, secondOp) else -> throw UnsupportedOperationException("Unkbown binary operator") } - llvmCode.appendln("$newVar = $llvmOperator $firstOp, $secondOp") + addAssignment(newVar, llvmExpression) + return newVar } + fun addAssignment(llvmVariable: LLVMNode, assignExpression: LLVMNode) { + llvmCode.appendln("$llvmVariable = $assignExpression") + } fun clean() { llvmCode = StringBuilder() diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt index 51338c88d98..f6a870466d6 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt @@ -1,12 +1,10 @@ package org.kotlinnative.translator.llvm import org.kotlinnative.translator.llvm.types.LLVMType -import kotlin.reflect.KFunction0 -class LLVMExpression(val variableType: KFunction0, val llvmCode: String) : LLVMNode() { - fun generateExpression(builder: LLVMBuilder): LLVMVariable { - val newVar = builder.getNewVariable(variableType); - builder.addLLVMCode("$newVar = $llvmCode"); - return newVar +class LLVMExpression(val variableType: LLVMType, val llvmCode: String) : LLVMNode() { + + override fun toString(): String { + return llvmCode } } \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt index 74593ed5880..a30461a35e6 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt @@ -8,17 +8,17 @@ class LLVMDoubleType() : LLVMType() { override fun operatorMinus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "fsub double i32 $firstOp, $secondOp") + return LLVMExpression(LLVMDoubleType(), "fsub double i32 $firstOp, $secondOp") } override fun operatorTimes(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "fmul double i32 $firstOp, $secondOp") + return LLVMExpression(LLVMDoubleType(), "fmul double i32 $firstOp, $secondOp") } override fun operatorPlus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "fadd double $firstOp, $secondOp") + return LLVMExpression(LLVMDoubleType(), "fadd double $firstOp, $secondOp") } } \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt index 5698fe35e9e..5e1b9c831b6 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt @@ -8,17 +8,17 @@ class LLVMIntType() : LLVMType() { override fun operatorMinus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "sub nsw i32 $firstOp, $secondOp") + return LLVMExpression(LLVMIntType(), "sub nsw i32 $firstOp, $secondOp") } override fun operatorTimes(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "mul nsw i32 $firstOp, $secondOp") + return LLVMExpression(LLVMIntType(), "mul nsw i32 $firstOp, $secondOp") } override fun operatorPlus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "add nsw i32 $firstOp, $secondOp") + return LLVMExpression(LLVMIntType(), "add nsw i32 $firstOp, $secondOp") } } \ No newline at end of file From ac76e305eb08efd892c0f05e18b40c8b5e693182 Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Mon, 11 Jul 2016 15:54:57 +0300 Subject: [PATCH 3/3] translator: quick fix for kfunction --- .../kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt index 5b2d46c0d5d..52bb3b0f8df 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -4,15 +4,14 @@ import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.lexer.KtTokens import org.kotlinnative.translator.llvm.types.LLVMIntType import org.kotlinnative.translator.llvm.types.LLVMType -import kotlin.reflect.KFunction0 class LLVMBuilder { private var llvmCode: StringBuilder = StringBuilder() private var variableCount = 0 - fun getNewVariable(type: KFunction0?): LLVMVariable { + fun getNewVariable(type: LLVMType?): LLVMVariable { variableCount++ - return LLVMVariable("%var$variableCount", type?.invoke()) + return LLVMVariable("%var$variableCount", type) } fun addLLVMCode(code: String) { @@ -28,7 +27,7 @@ class LLVMBuilder { } fun addPrimitiveBinaryOperation(operation: IElementType, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMVariable { - val newVar = getNewVariable(::LLVMIntType) + val newVar = getNewVariable(LLVMIntType()) val llvmExpression = when (operation) { KtTokens.PLUS -> firstOp.type!!.operatorPlus(newVar, firstOp, secondOp) KtTokens.MINUS -> firstOp.type!!.operatorMinus(newVar, firstOp, secondOp)