From 423d393c5dc0ce102fe96a1783eaaf4b648b3c6f Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Wed, 13 Jul 2016 16:52:10 +0300 Subject: [PATCH] translator: fix assignment argument variables --- .../kotlin/org/kotlinnative/translator/FunctionCodegen.kt | 8 ++++---- .../org/kotlinnative/translator/llvm/LLVMBuilder.kt | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt index 432e073c5a5..3300e1488f1 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt @@ -297,11 +297,11 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction val assignExpression = evaluateExpression(eq.getNextSiblingIgnoringWhitespaceAndComments(), scopeDepth) ?: return null when (assignExpression) { - //TODO resolving is LLVMVariable -> { - assignExpression.kotlinName = identifier!!.text - assignExpression.pointer = false - variableManager.addVariable(identifier.text, assignExpression, scopeDepth) + val allocVar = variableManager.getVariable(identifier!!.text, LLVMIntType(), pointer = true) + codeBuilder.allocVar(allocVar) + variableManager.addVariable(identifier.text, allocVar, scopeDepth) + codeBuilder.copyVariableValue(assignExpression, allocVar) } is LLVMConstant -> { val newVar = variableManager.getVariable(identifier!!.text, LLVMIntType(), pointer = true) 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 74f118c31bc..6da8a8a8a19 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -117,6 +117,13 @@ class LLVMBuilder(val arm: Boolean) { llvmCode.appendln(code) } + fun copyVariableValue(from: LLVMVariable, to: LLVMVariable) { + val tmp = getNewVariable(from.type, from.pointer) + llvmCode.appendln("$tmp = load ${tmp.type}, ${from.getType()} $from, align ${tmp.type.align}") + llvmCode.appendln("store ${to.type} $tmp, ${to.getType()} $to, align ${tmp.type.align}") + + } + fun loadArgument(llvmVariable: LLVMVariable, store: Boolean = true): LLVMVariable { val allocVar = LLVMVariable("${llvmVariable.label}.addr", llvmVariable.type, llvmVariable.kotlinName, true) addVariableByRef(allocVar, llvmVariable, store)