diff --git a/translator/.idea/modules/ast-kotlin_test.iml b/translator/.idea/modules/ast-kotlin_test.iml index 8717ed3e558..9dd3eef3c3e 100644 --- a/translator/.idea/modules/ast-kotlin_test.iml +++ b/translator/.idea/modules/ast-kotlin_test.iml @@ -10,7 +10,6 @@ - diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt index 40c6242420e..54c2a713392 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt @@ -16,10 +16,8 @@ class ClassCodegen(val state: TranslationState, val clazz: KtClass, val codeBuil val annotation: Boolean val native: Boolean - val fields = ArrayList() + val fields = ArrayList() val fieldsIndex = HashMap() - val name = "%class.${clazz.name}" - val constructorName = "@${clazz.name}" val type: LLVMType = LLVMReferenceType(clazz.name.toString(), "class") val size: Int @@ -100,7 +98,7 @@ class ClassCodegen(val state: TranslationState, val clazz: KtClass, val codeBuil val argument = codeBuilder.getNewVariable(it.type) codeBuilder.loadVariable(argument, LLVMVariable("${it.label}.addr", it.type, scope = LLVMLocalScope(), pointer = 1)) val classField = codeBuilder.getNewVariable(it.type, pointer = 1) - codeBuilder.loadClassField(classField, LLVMVariable("instance.addr", type, scope = LLVMLocalScope(), pointer = 1), it.offset) + codeBuilder.loadClassField(classField, LLVMVariable("instance.addr", type, scope = LLVMLocalScope(), pointer = 1), (it as LLVMClassVariable).offset) codeBuilder.storeVariable(classField, argument) } } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt index 3f185b7d394..04304b57a91 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt @@ -4,7 +4,6 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.KtNodeTypes -import org.jetbrains.kotlin.context.GlobalContext import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments @@ -97,7 +96,12 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction } private fun generateLoadArguments() { - args.forEach { + args.forEach(fun(it: LLVMVariable) { + if (it.type is LLVMFunctionType) { + variableManager.addVariable(it.label, LLVMVariable(it.label, it.type, it.label, LLVMLocalScope(), pointer = 1), 2) + return + } + if (it.type !is LLVMReferenceType || (it.type as LLVMReferenceType).isReturn) { val loadVariable = LLVMVariable("${it.label}", it.type, it.label, LLVMLocalScope(), pointer = 0) val allocVar = codeBuilder.loadArgument(loadVariable) @@ -105,13 +109,13 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction } else { variableManager.addVariable(it.label, LLVMVariable(it.label, it.type, it.label, LLVMLocalScope(), pointer = 0), 2) } - } + }) } private fun evaluateCodeBlock(expr: PsiElement?, startLabel: LLVMLabel? = null, finishLabel: LLVMLabel? = null, scopeDepth: Int = 0) { codeBuilder.markWithLabel(startLabel) expressionWalker(expr, scopeDepth) - codeBuilder.addUnconditionJump(finishLabel ?: return) + codeBuilder.addUnconditionalJump(finishLabel ?: return) } private fun expressionWalker(expr: PsiElement?, scopeDepth: Int) { @@ -184,7 +188,7 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction val arrayReceivedVariable = codeBuilder.loadAndGetVariable(arrayNameVariable) val arrayElementType = (arrayNameVariable.type as LLVMArray).basicType() val indexVariable = codeBuilder.getNewVariable(arrayElementType, pointer = 1) - codeBuilder.loadVariableOffset(indexVariable, arrayReceivedVariable, arrayIndex); + codeBuilder.loadVariableOffset(indexVariable, arrayReceivedVariable, arrayIndex) return indexVariable } @@ -195,68 +199,44 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction private fun evaluateCallExpression(expr: KtCallExpression, scopeDepth: Int): LLVMSingleValue? { val function = expr.firstChild.firstChild.text + val names = parseArgList(expr, scopeDepth) if (state.functions.containsKey(function)) { - return evaluateFunctionCallExpression(expr, scopeDepth) + val descriptor = state.functions[function] ?: return null + return evaluateFunctionCallExpression(LLVMVariable(function, descriptor.returnType.type, scope = LLVMGlobalScope()), names, descriptor.args) } if (state.classes.containsKey(function)) { - return evaluateConstructorCallExpression(expr, scopeDepth) + val descriptor = state.classes[function] ?: return null + return evaluateConstructorCallExpression(function, names, descriptor.fields, descriptor.type) + } + + val localFunction = variableManager.getLLVMvalue(function) + if (localFunction != null) { + val type = localFunction.type as LLVMFunctionType + return evaluateFunctionCallExpression(LLVMVariable(function, type.returnType.type, scope = LLVMLocalScope()), names, type.arguments) } return null } - private fun evaluateConstructorCallExpression(expr: KtCallExpression, scopeDepth: Int): LLVMSingleValue? { - val function = expr.firstChild.firstChild - val descriptor = state.classes[function.text] ?: return null - val names = parseArgList(expr, scopeDepth).mapIndexed { i: Int, v: LLVMSingleValue -> - when (v) { - is LLVMVariable -> LLVMVariable(v.toString(), descriptor.fields[i].type, pointer = descriptor.fields[i].pointer) - else -> v - } - }.toList() + private fun evaluateFunctionCallExpression(function: LLVMVariable, names: List, args: List): LLVMSingleValue? { - val result = codeBuilder.getNewVariable(returnType.type) - codeBuilder.allocVar(result) - result.pointer = 1 + val names = names.mapIndexed(fun(i: Int, value: LLVMSingleValue): LLVMSingleValue { + var result = value - val args = ArrayList() - args.add(result) - args.addAll(names) - - codeBuilder.addLLVMCode(LLVMCall( - LLVMVoidType(), - descriptor.constructorName, - args - ).toString()) - - return result - } - - private fun evaluateFunctionCallExpression(expr: KtCallExpression, scopeDepth: Int): LLVMSingleValue? { - val function = expr.firstChild.firstChild - - val descriptor = state.functions[function.text] ?: return null - val names = parseArgList(expr, scopeDepth).mapIndexed(fun(i: Int, llvmSingleValue: LLVMSingleValue): LLVMSingleValue { - var result = llvmSingleValue - - if (result.pointer > 0 && descriptor.args[i].pointer == 0) { - result = codeBuilder.getNewVariable(descriptor.args[i].type) - codeBuilder.loadVariable(result, llvmSingleValue as LLVMVariable) + if (result.pointer > 0 && args[i].pointer == 0) { + result = codeBuilder.getNewVariable(args[i].type) + codeBuilder.loadVariable(result, value as LLVMVariable) } return result }).toList() - val returnType = descriptor.returnType.type + val returnType = function.type when (returnType) { is LLVMVoidType -> { - codeBuilder.addLLVMCode(LLVMCall( - LLVMVoidType(), - "@${descriptor.name}", - names - ).toString()) + codeBuilder.addLLVMCode(LLVMCall(LLVMVoidType(), function.toString(), names).toString()) } is LLVMReferenceType -> { val result = codeBuilder.getNewVariable(returnType) @@ -267,21 +247,13 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction args.add(result) args.addAll(names) - codeBuilder.addLLVMCode(LLVMCall( - LLVMVoidType(), - "@${descriptor.name}", - args - ).toString()) + codeBuilder.addLLVMCode(LLVMCall(LLVMVoidType(), function.toString(), args).toString()) return result } else -> { val result = codeBuilder.getNewVariable(returnType) - codeBuilder.addAssignment(result, LLVMCall( - returnType, - "@${descriptor.name}", - names - )) + codeBuilder.addAssignment(result, LLVMCall(returnType, function.toString(), names)) val resultPtr = codeBuilder.getNewVariable(returnType) codeBuilder.allocVar(resultPtr) @@ -294,6 +266,24 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction return null } + private fun evaluateConstructorCallExpression(name: String, names: ArrayList, fields: ArrayList, retType: LLVMType): LLVMSingleValue? { + val result = codeBuilder.getNewVariable(retType) + codeBuilder.allocVar(result) + result.pointer = 1 + + val args = ArrayList() + args.add(result) + args.addAll(names) + + codeBuilder.addLLVMCode(LLVMCall( + LLVMVoidType(), + name, + args + ).toString()) + + return result + } + private fun parseArgList(expr: KtCallExpression, scopeDepth: Int): ArrayList { val args = expr.getValueArgumentsInParentheses() val result = ArrayList() @@ -360,7 +350,7 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction val bodyLabel = codeBuilder.getNewLabel(prefix = "while") val exitLabel = codeBuilder.getNewLabel(prefix = "while") - codeBuilder.addUnconditionJump(conditionLabel) + codeBuilder.addUnconditionalJump(conditionLabel) codeBuilder.markWithLabel(conditionLabel) val conditionResult = evaluateBinaryExpression(condition, scopeDepth + 1) @@ -398,11 +388,11 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction codeBuilder.markWithLabel(thenLabel) val thenResultExpression = evaluateExpression(thenExpression, scopeDepth + 1) codeBuilder.storeVariable(variable, thenResultExpression ?: return null) - codeBuilder.addUnconditionJump(endLabel) + codeBuilder.addUnconditionalJump(endLabel) codeBuilder.markWithLabel(elseLabel) val elseResultExpression = evaluateExpression(elseExpression, scopeDepth + 1) codeBuilder.storeVariable(variable, elseResultExpression ?: return null) - codeBuilder.addUnconditionJump(endLabel) + codeBuilder.addUnconditionalJump(endLabel) codeBuilder.markWithLabel(endLabel) return variable } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt index ed7c0ae4db2..09b17b5155c 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt @@ -21,7 +21,7 @@ class PropertyCodegen(val state: TranslationState, val property: KtProperty, val val variableType = LLVMMapStandardType(property.name ?: return, kotlinType).type val variable = LLVMVariable(property.name.toString(), variableType, property.name.toString(), LLVMGlobalScope(), pointer = 1) variableManager.addGlobalVariable(property.name.toString(), variable) - codeBuilder.declareGlovalVariable(variable, variableType.parseArg(value.toString())) + codeBuilder.declareGlobalVariable(variable, variableType.parseArg(value.toString())) } } 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 1233d4458e3..ad6a82166d2 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -167,7 +167,7 @@ class LLVMBuilder(val arm: Boolean) { llvmLocalCode.appendln("store ${allocVariable.type} $constantValue, ${allocVariable.getType()} $allocVariable, align ${allocVariable.type.align}") } - fun declareGlovalVariable(variable: LLVMVariable, defaultValue: String = variable.type.defaultValue) { + fun declareGlobalVariable(variable: LLVMVariable, defaultValue: String = variable.type.defaultValue) { llvmLocalCode.appendln("$variable = global ${variable.type} $defaultValue, align ${variable.type.align}") } @@ -183,7 +183,7 @@ class LLVMBuilder(val arm: Boolean) { llvmLocalCode.appendln("br ${condition.getType()} $condition, label $thenLabel, label $elseLabel") } - fun addUnconditionJump(label: LLVMLabel) { + fun addUnconditionalJump(label: LLVMLabel) { llvmLocalCode.appendln("br label $label") } 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 b609cedf9c7..19dbbddbbab 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt @@ -1,6 +1,5 @@ package org.kotlinnative.translator.llvm -import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.builtins.isFunctionTypeOrSubtype import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.isUnit