From 968fc9ec03abdbd261b94a785756be73aa7fd4fd Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Mon, 11 Jul 2016 14:19:48 +0300 Subject: [PATCH] translator: add primitive types and basic for operators. --- .../org/kotlinnative/translator/FunctionCodegen.kt | 5 +++-- .../org/kotlinnative/translator/llvm/LLVMBuilder.kt | 9 ++++++--- .../kotlinnative/translator/llvm/LLVMExpression.kt | 12 ++++++++++++ .../org/kotlinnative/translator/llvm/LLVMNode.kt | 3 +++ .../kotlinnative/translator/llvm/LLVMVariable.kt | 5 ++++- .../translator/llvm/types/LLVMIntType.kt | 13 +++++++++++++ .../kotlinnative/translator/llvm/types/LLVMType.kt | 8 ++++++++ .../kotlinnative/translator/llvm/types/LLVMTypes.kt | 9 +++++++++ 8 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMNode.kt create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMTypes.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt index a7bfd810136..554978830fd 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt @@ -14,6 +14,7 @@ import org.kotlinnative.translator.llvm.LLVMBuilder import org.kotlinnative.translator.llvm.LLVMDescriptorGenerate import org.kotlinnative.translator.llvm.LLVMMapStandardType import org.kotlinnative.translator.llvm.LLVMVariable +import org.kotlinnative.translator.llvm.types.LLVMIntType import org.kotlinnative.translator.utils.FunctionArgument @@ -84,7 +85,7 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction private fun evaluateConstantExpression(expr: KtConstantExpression): LLVMVariable { val node = expr.node - return LLVMVariable(node.firstChildNode.text) + return LLVMVariable(node.firstChildNode.text, ::LLVMIntType.invoke()) } private fun evaluatePsiElement(element: PsiElement): LLVMVariable? { @@ -99,7 +100,7 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction private fun evaluateLeafPsiElement(element: LeafPsiElement): LLVMVariable? { return when (element.elementType) { KtTokens.RETURN_KEYWORD -> evaluateReturnInstruction(element) - else -> LLVMVariable("") + else -> null } } 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 a363acaa1b1..520bb70cb30 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -2,14 +2,17 @@ package org.kotlinnative.translator.llvm 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 - private fun getNewVariable(): LLVMVariable { + fun getNewVariable(type: KFunction0?): LLVMVariable { variableCount++ - return LLVMVariable("%var$variableCount") + return LLVMVariable("%var$variableCount", type?.invoke()) } fun addLLVMCode(code: String) { @@ -25,7 +28,7 @@ class LLVMBuilder { } fun addPrimitiveBinaryOperation(operation: IElementType, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMVariable { - val newVar = getNewVariable() + val newVar = getNewVariable(::LLVMIntType) val llvmOperator = when (operation) { KtTokens.PLUS -> "add nsw i32" KtTokens.MINUS -> "sub nsw i32" diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt new file mode 100644 index 00000000000..b70b8074ff7 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt @@ -0,0 +1,12 @@ +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 + } +} \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMNode.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMNode.kt new file mode 100644 index 00000000000..402b191f78e --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMNode.kt @@ -0,0 +1,3 @@ +package org.kotlinnative.translator.llvm + +abstract class LLVMNode \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt index d0e0c0f72ae..5985324c56c 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt @@ -1,6 +1,9 @@ package org.kotlinnative.translator.llvm -data class LLVMVariable(val label: String){ +import org.kotlinnative.translator.llvm.types.LLVMType + +class LLVMVariable(val label: String, val type: LLVMType?) : LLVMNode() { + override fun toString(): String { return label } 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 new file mode 100644 index 00000000000..fb9d09a9689 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt @@ -0,0 +1,13 @@ +package org.kotlinnative.translator.llvm.types + +import org.kotlinnative.translator.llvm.LLVMExpression +import org.kotlinnative.translator.llvm.LLVMVariable + + +class LLVMIntType() : LLVMType() { + 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") + } + +} \ No newline at end of file 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 new file mode 100644 index 00000000000..760c58b2664 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt @@ -0,0 +1,8 @@ +package org.kotlinnative.translator.llvm.types; + +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; +} diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMTypes.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMTypes.kt new file mode 100644 index 00000000000..d08f35c5e38 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMTypes.kt @@ -0,0 +1,9 @@ +package org.kotlinnative.translator.llvm.types + +//TODO skeleton for typeList + +enum class LLVMTypes { + int, double, float, char +} + +val typesMap = mapOf(Pair(LLVMTypes.int, ::LLVMIntType));