From b3e1fbdbb49f27189b23e4507c0ed77d6514bcaa Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Thu, 14 Jul 2016 11:12:12 +0300 Subject: [PATCH] translator: add scope for LLVMVariable --- .../kotlinnative/translator/ClassCodegen.kt | 19 ++++++++----------- .../translator/FunctionCodegen.kt | 6 +++--- .../translator/PropertyCodegen.kt | 3 ++- .../translator/VariableManager.kt | 3 ++- .../translator/llvm/LLVMBuilder.kt | 4 ++-- .../translator/llvm/LLVMVariable.kt | 4 ++-- 6 files changed, 19 insertions(+), 20 deletions(-) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt index 6c1bbc6ab2e..8967cef7c63 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt @@ -8,10 +8,7 @@ import org.jetbrains.kotlin.psi.KtUserType import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.annotations.argumentValue import org.kotlinnative.translator.exceptions.TranslationException -import org.kotlinnative.translator.llvm.LLVMBuilder -import org.kotlinnative.translator.llvm.LLVMClassVariable -import org.kotlinnative.translator.llvm.LLVMFunctionDescriptor -import org.kotlinnative.translator.llvm.LLVMVariable +import org.kotlinnative.translator.llvm.* import org.kotlinnative.translator.llvm.types.* import java.util.* @@ -71,7 +68,7 @@ class ClassCodegen(val state: TranslationState, val clazz: KtClass, val codeBuil val refType = type.makeClone() as LLVMReferenceType refType.addParam("sret") - val thisField = LLVMVariable("instance", refType, clazz.name, true) + val thisField = LLVMVariable("instance", refType, clazz.name, pointer = true) argFields.add(thisField) argFields.addAll(fields) @@ -88,11 +85,11 @@ class ClassCodegen(val state: TranslationState, val clazz: KtClass, val codeBuil private fun generateLoadArguments(thisField: LLVMVariable) { - val thisVariable = LLVMVariable("%${thisField.label}", thisField.type, thisField.label, true) + val thisVariable = LLVMVariable(thisField.label, thisField.type, thisField.label, LLVMLocalScope(), pointer = true) codeBuilder.loadArgument(thisVariable, false) fields.forEach { - val loadVariable = LLVMVariable("%${it.label}", it.type, it.label) + val loadVariable = LLVMVariable(it.label, it.type, it.label, LLVMLocalScope()) codeBuilder.loadArgument(loadVariable) } } @@ -100,16 +97,16 @@ class ClassCodegen(val state: TranslationState, val clazz: KtClass, val codeBuil private fun generateAssignments() { fields.forEach { val argument = codeBuilder.getNewVariable(it.type) - codeBuilder.loadVariable(argument, LLVMVariable("%${it.label}.addr", it.type, pointer = true)) + codeBuilder.loadVariable(argument, LLVMVariable("${it.label}.addr", it.type, scope = LLVMLocalScope(), pointer = true)) val classField = codeBuilder.getNewVariable(it.type, true) - codeBuilder.loadClassField(classField, LLVMVariable("%instance.addr", type, pointer = true), it.offset) + codeBuilder.loadClassField(classField, LLVMVariable("instance.addr", type, scope = LLVMLocalScope(), pointer = true), it.offset) codeBuilder.storeVariable(classField, argument) } } private fun generateReturn() { - val dst = LLVMVariable("%instance", type, pointer = true) - val src = LLVMVariable("%instance.addr", type, pointer = true) + val dst = LLVMVariable("instance", type, scope = LLVMLocalScope(), pointer = true) + val src = LLVMVariable("instance.addr", type, scope = LLVMLocalScope(), pointer = true) val castedDst = codeBuilder.bitcast(dst, LLVMCharType()) val castedSrc = codeBuilder.bitcast(src, LLVMCharType()) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt index 61a4442dc8c..12ffbd59b17 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt @@ -66,7 +66,7 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction private fun generateLoadArguments() { args?.forEach { - val loadVariable = LLVMVariable("%${it.label}", it.type, it.label, false) + val loadVariable = LLVMVariable(it.label, it.type, it.label, LLVMLocalScope(), false) val allocVar = codeBuilder.loadArgument(loadVariable) variableManager.addVariable(it.label, allocVar, 2) } @@ -323,14 +323,14 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction variableManager.addVariable(identifier.text, newVar, scopeDepth) } is LLVMConstructorCall -> { - val result = variableManager.getVariable(identifier!!.text, assignExpression.type, pointer = false) + val result = variableManager.receiveVariable(identifier!!.text, assignExpression.type, pointer = false) codeBuilder.allocVar(result) result.pointer = true codeBuilder.addLLVMCode(assignExpression.call(result).toString()) variableManager.addVariable(identifier.text, result, scopeDepth) } else -> { - codeBuilder.addAssignment(LLVMVariable("%${identifier!!.text}", LLVMIntType(), identifier.text), assignExpression) + codeBuilder.addAssignment(LLVMVariable(identifier!!.text, LLVMIntType(), identifier.text, LLVMLocalScope()), assignExpression) } } return null diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt index 6cb214b9c71..837155a5743 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt @@ -4,6 +4,7 @@ import org.jetbrains.kotlin.js.descriptorUtils.nameIfStandardType import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.BindingContext import org.kotlinnative.translator.llvm.LLVMBuilder +import org.kotlinnative.translator.llvm.LLVMGlobalScope import org.kotlinnative.translator.llvm.LLVMMapStandardType import org.kotlinnative.translator.llvm.LLVMVariable @@ -23,7 +24,7 @@ class PropertyCodegen(val state: TranslationState, val property: KtProperty, val //[TODO] compile time initizializer if (kotlinType.nameIfStandardType != null) { val variableType = LLVMMapStandardType(property.name ?: return, kotlinType).type - val variable = LLVMVariable("@" + property.name, variableType, property.name.toString(), pointer = true) + val variable = LLVMVariable(property.name.toString(), variableType, property.name.toString(), LLVMGlobalScope(), pointer = true) variableManager.addGlobalVariable(property.name.toString(), variable) codeBuilder.declareGlovalVariable(variable, variableType.parseArg(value.toString())) } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt b/translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt index c72be95ad4c..4e84ed2293c 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt @@ -1,5 +1,6 @@ package org.kotlinnative.translator +import org.kotlinnative.translator.llvm.LLVMLocalScope import org.kotlinnative.translator.llvm.LLVMVariable import org.kotlinnative.translator.llvm.types.LLVMType import java.util.* @@ -32,7 +33,7 @@ class VariableManager { val ourVersion = variableVersion.getOrDefault(name, 0) + 1 variableVersion.put(name, ourVersion) - return LLVMVariable("%managed.$name.$ourVersion", type, name, pointer) + return LLVMVariable("managed.$name.$ourVersion", type, name, LLVMLocalScope(), pointer) } } \ No newline at end of file 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 a3cc1bba7b6..340cbebf124 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -26,7 +26,7 @@ class LLVMBuilder(val arm: Boolean) { fun getNewVariable(type: LLVMType, pointer: Boolean = false, kotlinName: String? = null): LLVMVariable { variableCount++ - return LLVMVariable("%var$variableCount", type, kotlinName, pointer) + return LLVMVariable("var$variableCount", type, kotlinName, LLVMLocalScope(), pointer) } fun getNewLabel(scope: LLVMScope = LLVMLocalScope(), prefix: String): LLVMLabel { @@ -125,7 +125,7 @@ class LLVMBuilder(val arm: Boolean) { } fun loadArgument(llvmVariable: LLVMVariable, store: Boolean = true): LLVMVariable { - val allocVar = LLVMVariable("${llvmVariable.label}.addr", llvmVariable.type, llvmVariable.kotlinName, true) + val allocVar = LLVMVariable("${llvmVariable.label}.addr", llvmVariable.type, llvmVariable.kotlinName, LLVMLocalScope(), true) addVariableByRef(allocVar, llvmVariable, store) return allocVar } 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 a98bdb25570..2ad7a5c0d84 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt @@ -2,9 +2,9 @@ package org.kotlinnative.translator.llvm import org.kotlinnative.translator.llvm.types.LLVMType -open class LLVMVariable(val label: String, override val type: LLVMType, var kotlinName: String? = null, override var pointer: Boolean = false) : LLVMSingleValue() { +open class LLVMVariable(val label: String, override val type: LLVMType, var kotlinName: String? = null, val scope: LLVMScope = LLVMLocalScope(), override var pointer: Boolean = false) : LLVMSingleValue() { override fun getType(): String = type.toString() + if (pointer) "*" else "" - override fun toString(): String = label + override fun toString(): String = "$scope$label" } \ No newline at end of file