translator: add primitive types and basic for operators.

This commit is contained in:
Alexey Stepanov
2016-07-11 14:19:48 +03:00
parent 599a7f77c1
commit 968fc9ec03
8 changed files with 58 additions and 6 deletions
@@ -14,6 +14,7 @@ import org.kotlinnative.translator.llvm.LLVMBuilder
import org.kotlinnative.translator.llvm.LLVMDescriptorGenerate import org.kotlinnative.translator.llvm.LLVMDescriptorGenerate
import org.kotlinnative.translator.llvm.LLVMMapStandardType import org.kotlinnative.translator.llvm.LLVMMapStandardType
import org.kotlinnative.translator.llvm.LLVMVariable import org.kotlinnative.translator.llvm.LLVMVariable
import org.kotlinnative.translator.llvm.types.LLVMIntType
import org.kotlinnative.translator.utils.FunctionArgument import org.kotlinnative.translator.utils.FunctionArgument
@@ -84,7 +85,7 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction
private fun evaluateConstantExpression(expr: KtConstantExpression): LLVMVariable { private fun evaluateConstantExpression(expr: KtConstantExpression): LLVMVariable {
val node = expr.node val node = expr.node
return LLVMVariable(node.firstChildNode.text) return LLVMVariable(node.firstChildNode.text, ::LLVMIntType.invoke())
} }
private fun evaluatePsiElement(element: PsiElement): LLVMVariable? { private fun evaluatePsiElement(element: PsiElement): LLVMVariable? {
@@ -99,7 +100,7 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction
private fun evaluateLeafPsiElement(element: LeafPsiElement): LLVMVariable? { private fun evaluateLeafPsiElement(element: LeafPsiElement): LLVMVariable? {
return when (element.elementType) { return when (element.elementType) {
KtTokens.RETURN_KEYWORD -> evaluateReturnInstruction(element) KtTokens.RETURN_KEYWORD -> evaluateReturnInstruction(element)
else -> LLVMVariable("") else -> null
} }
} }
@@ -2,14 +2,17 @@ package org.kotlinnative.translator.llvm
import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.lexer.KtTokens 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 { class LLVMBuilder {
private var llvmCode: StringBuilder = StringBuilder() private var llvmCode: StringBuilder = StringBuilder()
private var variableCount = 0 private var variableCount = 0
private fun getNewVariable(): LLVMVariable { fun getNewVariable(type: KFunction0<LLVMType>?): LLVMVariable {
variableCount++ variableCount++
return LLVMVariable("%var$variableCount") return LLVMVariable("%var$variableCount", type?.invoke())
} }
fun addLLVMCode(code: String) { fun addLLVMCode(code: String) {
@@ -25,7 +28,7 @@ class LLVMBuilder {
} }
fun addPrimitiveBinaryOperation(operation: IElementType, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMVariable { fun addPrimitiveBinaryOperation(operation: IElementType, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMVariable {
val newVar = getNewVariable() val newVar = getNewVariable(::LLVMIntType)
val llvmOperator = when (operation) { val llvmOperator = when (operation) {
KtTokens.PLUS -> "add nsw i32" KtTokens.PLUS -> "add nsw i32"
KtTokens.MINUS -> "sub nsw i32" KtTokens.MINUS -> "sub nsw i32"
@@ -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<LLVMType>, val llvmCode: String) : LLVMNode() {
fun generateExpression(builder: LLVMBuilder): LLVMVariable {
val newVar = builder.getNewVariable(variableType);
builder.addLLVMCode("%$newVar = $llvmCode");
return newVar
}
}
@@ -0,0 +1,3 @@
package org.kotlinnative.translator.llvm
abstract class LLVMNode
@@ -1,6 +1,9 @@
package org.kotlinnative.translator.llvm 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 { override fun toString(): String {
return label return label
} }
@@ -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")
}
}
@@ -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;
}
@@ -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));