translator: add scope for LLVMVariable
This commit is contained in:
@@ -8,10 +8,7 @@ import org.jetbrains.kotlin.psi.KtUserType
|
|||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.annotations.argumentValue
|
import org.jetbrains.kotlin.resolve.annotations.argumentValue
|
||||||
import org.kotlinnative.translator.exceptions.TranslationException
|
import org.kotlinnative.translator.exceptions.TranslationException
|
||||||
import org.kotlinnative.translator.llvm.LLVMBuilder
|
import org.kotlinnative.translator.llvm.*
|
||||||
import org.kotlinnative.translator.llvm.LLVMClassVariable
|
|
||||||
import org.kotlinnative.translator.llvm.LLVMFunctionDescriptor
|
|
||||||
import org.kotlinnative.translator.llvm.LLVMVariable
|
|
||||||
import org.kotlinnative.translator.llvm.types.*
|
import org.kotlinnative.translator.llvm.types.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -71,7 +68,7 @@ class ClassCodegen(val state: TranslationState, val clazz: KtClass, val codeBuil
|
|||||||
val refType = type.makeClone() as LLVMReferenceType
|
val refType = type.makeClone() as LLVMReferenceType
|
||||||
refType.addParam("sret")
|
refType.addParam("sret")
|
||||||
|
|
||||||
val thisField = LLVMVariable("instance", refType, clazz.name, true)
|
val thisField = LLVMVariable("instance", refType, clazz.name, pointer = true)
|
||||||
|
|
||||||
argFields.add(thisField)
|
argFields.add(thisField)
|
||||||
argFields.addAll(fields)
|
argFields.addAll(fields)
|
||||||
@@ -88,11 +85,11 @@ class ClassCodegen(val state: TranslationState, val clazz: KtClass, val codeBuil
|
|||||||
|
|
||||||
private fun generateLoadArguments(thisField: LLVMVariable) {
|
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)
|
codeBuilder.loadArgument(thisVariable, false)
|
||||||
|
|
||||||
fields.forEach {
|
fields.forEach {
|
||||||
val loadVariable = LLVMVariable("%${it.label}", it.type, it.label)
|
val loadVariable = LLVMVariable(it.label, it.type, it.label, LLVMLocalScope())
|
||||||
codeBuilder.loadArgument(loadVariable)
|
codeBuilder.loadArgument(loadVariable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,16 +97,16 @@ class ClassCodegen(val state: TranslationState, val clazz: KtClass, val codeBuil
|
|||||||
private fun generateAssignments() {
|
private fun generateAssignments() {
|
||||||
fields.forEach {
|
fields.forEach {
|
||||||
val argument = codeBuilder.getNewVariable(it.type)
|
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)
|
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)
|
codeBuilder.storeVariable(classField, argument)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun generateReturn() {
|
private fun generateReturn() {
|
||||||
val dst = LLVMVariable("%instance", type, pointer = true)
|
val dst = LLVMVariable("instance", type, scope = LLVMLocalScope(), pointer = true)
|
||||||
val src = LLVMVariable("%instance.addr", type, pointer = true)
|
val src = LLVMVariable("instance.addr", type, scope = LLVMLocalScope(), pointer = true)
|
||||||
|
|
||||||
val castedDst = codeBuilder.bitcast(dst, LLVMCharType())
|
val castedDst = codeBuilder.bitcast(dst, LLVMCharType())
|
||||||
val castedSrc = codeBuilder.bitcast(src, LLVMCharType())
|
val castedSrc = codeBuilder.bitcast(src, LLVMCharType())
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction
|
|||||||
|
|
||||||
private fun generateLoadArguments() {
|
private fun generateLoadArguments() {
|
||||||
args?.forEach {
|
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)
|
val allocVar = codeBuilder.loadArgument(loadVariable)
|
||||||
variableManager.addVariable(it.label, allocVar, 2)
|
variableManager.addVariable(it.label, allocVar, 2)
|
||||||
}
|
}
|
||||||
@@ -323,14 +323,14 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction
|
|||||||
variableManager.addVariable(identifier.text, newVar, scopeDepth)
|
variableManager.addVariable(identifier.text, newVar, scopeDepth)
|
||||||
}
|
}
|
||||||
is LLVMConstructorCall -> {
|
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)
|
codeBuilder.allocVar(result)
|
||||||
result.pointer = true
|
result.pointer = true
|
||||||
codeBuilder.addLLVMCode(assignExpression.call(result).toString())
|
codeBuilder.addLLVMCode(assignExpression.call(result).toString())
|
||||||
variableManager.addVariable(identifier.text, result, scopeDepth)
|
variableManager.addVariable(identifier.text, result, scopeDepth)
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
codeBuilder.addAssignment(LLVMVariable("%${identifier!!.text}", LLVMIntType(), identifier.text), assignExpression)
|
codeBuilder.addAssignment(LLVMVariable(identifier!!.text, LLVMIntType(), identifier.text, LLVMLocalScope()), assignExpression)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import org.jetbrains.kotlin.js.descriptorUtils.nameIfStandardType
|
|||||||
import org.jetbrains.kotlin.psi.KtProperty
|
import org.jetbrains.kotlin.psi.KtProperty
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.kotlinnative.translator.llvm.LLVMBuilder
|
import org.kotlinnative.translator.llvm.LLVMBuilder
|
||||||
|
import org.kotlinnative.translator.llvm.LLVMGlobalScope
|
||||||
import org.kotlinnative.translator.llvm.LLVMMapStandardType
|
import org.kotlinnative.translator.llvm.LLVMMapStandardType
|
||||||
import org.kotlinnative.translator.llvm.LLVMVariable
|
import org.kotlinnative.translator.llvm.LLVMVariable
|
||||||
|
|
||||||
@@ -23,7 +24,7 @@ class PropertyCodegen(val state: TranslationState, val property: KtProperty, val
|
|||||||
//[TODO] compile time initizializer
|
//[TODO] compile time initizializer
|
||||||
if (kotlinType.nameIfStandardType != null) {
|
if (kotlinType.nameIfStandardType != null) {
|
||||||
val variableType = LLVMMapStandardType(property.name ?: return, kotlinType).type
|
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)
|
variableManager.addGlobalVariable(property.name.toString(), variable)
|
||||||
codeBuilder.declareGlovalVariable(variable, variableType.parseArg(value.toString()))
|
codeBuilder.declareGlovalVariable(variable, variableType.parseArg(value.toString()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.kotlinnative.translator
|
package org.kotlinnative.translator
|
||||||
|
|
||||||
|
import org.kotlinnative.translator.llvm.LLVMLocalScope
|
||||||
import org.kotlinnative.translator.llvm.LLVMVariable
|
import org.kotlinnative.translator.llvm.LLVMVariable
|
||||||
import org.kotlinnative.translator.llvm.types.LLVMType
|
import org.kotlinnative.translator.llvm.types.LLVMType
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -32,7 +33,7 @@ class VariableManager {
|
|||||||
val ourVersion = variableVersion.getOrDefault(name, 0) + 1
|
val ourVersion = variableVersion.getOrDefault(name, 0) + 1
|
||||||
variableVersion.put(name, ourVersion)
|
variableVersion.put(name, ourVersion)
|
||||||
|
|
||||||
return LLVMVariable("%managed.$name.$ourVersion", type, name, pointer)
|
return LLVMVariable("managed.$name.$ourVersion", type, name, LLVMLocalScope(), pointer)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -26,7 +26,7 @@ class LLVMBuilder(val arm: Boolean) {
|
|||||||
|
|
||||||
fun getNewVariable(type: LLVMType, pointer: Boolean = false, kotlinName: String? = null): LLVMVariable {
|
fun getNewVariable(type: LLVMType, pointer: Boolean = false, kotlinName: String? = null): LLVMVariable {
|
||||||
variableCount++
|
variableCount++
|
||||||
return LLVMVariable("%var$variableCount", type, kotlinName, pointer)
|
return LLVMVariable("var$variableCount", type, kotlinName, LLVMLocalScope(), pointer)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getNewLabel(scope: LLVMScope = LLVMLocalScope(), prefix: String): LLVMLabel {
|
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 {
|
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)
|
addVariableByRef(allocVar, llvmVariable, store)
|
||||||
return allocVar
|
return allocVar
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ package org.kotlinnative.translator.llvm
|
|||||||
|
|
||||||
import org.kotlinnative.translator.llvm.types.LLVMType
|
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 getType(): String = type.toString() + if (pointer) "*" else ""
|
||||||
|
|
||||||
override fun toString(): String = label
|
override fun toString(): String = "$scope$label"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user