translator: add primitive types and basic for operators.
This commit is contained in:
@@ -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));
|
||||||
Reference in New Issue
Block a user