CODEGEN: variable manager uses descriptor.name as part of the key instead of descriptor
minor changes: - rename descriptors -> contextVariableToIndex in variable manager
This commit is contained in:
committed by
vvlevchenko
parent
9999275f4a
commit
5c11c28a09
+19
-12
@@ -2,6 +2,7 @@ package org.jetbrains.kotlin.backend.konan.llvm
|
|||||||
|
|
||||||
import llvm.*
|
import llvm.*
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
|
|
||||||
|
|
||||||
@@ -19,20 +20,20 @@ internal class VariableManager(val codegen: CodeGenerator) {
|
|||||||
override fun toString() = (if (refSlot) "refslot" else "slot") + " for ${address}"
|
override fun toString() = (if (refSlot) "refslot" else "slot") + " for ${address}"
|
||||||
}
|
}
|
||||||
|
|
||||||
class ValueRecord(val value: LLVMValueRef, val descriptor: ValueDescriptor) : Record {
|
class ValueRecord(val value: LLVMValueRef, val name: Name) : Record {
|
||||||
override fun load() : LLVMValueRef = value
|
override fun load() : LLVMValueRef = value
|
||||||
override fun store(value: LLVMValueRef) = throw Error("writing to immutable: ${descriptor}")
|
override fun store(value: LLVMValueRef) = throw Error("writing to immutable: ${name}")
|
||||||
override fun address() : LLVMValueRef = throw Error("no address for: ${descriptor}")
|
override fun address() : LLVMValueRef = throw Error("no address for: ${name}")
|
||||||
override fun toString() = "value of ${value} from ${descriptor}"
|
override fun toString() = "value of ${value} from ${name}"
|
||||||
}
|
}
|
||||||
|
|
||||||
val variables: ArrayList<Record> = arrayListOf()
|
val variables: ArrayList<Record> = arrayListOf()
|
||||||
val descriptors: HashMap<Pair<ValueDescriptor, CodeContext>, Int> = hashMapOf()
|
val contextVariablesToIndex: HashMap<Pair<Name, CodeContext>, Int> = hashMapOf()
|
||||||
|
|
||||||
// Clears inner state of variable manager.
|
// Clears inner state of variable manager.
|
||||||
fun clear() {
|
fun clear() {
|
||||||
variables.clear()
|
variables.clear()
|
||||||
descriptors.clear()
|
contextVariablesToIndex.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createVariable(scoped: Pair<VariableDescriptor, CodeContext>, value: LLVMValueRef? = null) : Int {
|
fun createVariable(scoped: Pair<VariableDescriptor, CodeContext>, value: LLVMValueRef? = null) : Int {
|
||||||
@@ -51,14 +52,15 @@ internal class VariableManager(val codegen: CodeGenerator) {
|
|||||||
fun createMutable(scoped: Pair<VariableDescriptor, CodeContext>,
|
fun createMutable(scoped: Pair<VariableDescriptor, CodeContext>,
|
||||||
isVar: Boolean, value: LLVMValueRef? = null) : Int {
|
isVar: Boolean, value: LLVMValueRef? = null) : Int {
|
||||||
val descriptor = scoped.first
|
val descriptor = scoped.first
|
||||||
assert(descriptors.get(scoped) == null)
|
val scopedVariable = scoped.first.name to scoped.second
|
||||||
|
assert(!contextVariablesToIndex.contains(scopedVariable))
|
||||||
val index = variables.size
|
val index = variables.size
|
||||||
val type = codegen.getLLVMType(descriptor.type)
|
val type = codegen.getLLVMType(descriptor.type)
|
||||||
val slot = codegen.alloca(type, descriptor.name.asString())
|
val slot = codegen.alloca(type, descriptor.name.asString())
|
||||||
if (value != null)
|
if (value != null)
|
||||||
codegen.storeAnyLocal(value, slot)
|
codegen.storeAnyLocal(value, slot)
|
||||||
variables.add(SlotRecord(slot, codegen.isObjectType(type), isVar))
|
variables.add(SlotRecord(slot, codegen.isObjectType(type), isVar))
|
||||||
descriptors[scoped] = index
|
contextVariablesToIndex[scopedVariable] = index
|
||||||
return index
|
return index
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,15 +86,20 @@ internal class VariableManager(val codegen: CodeGenerator) {
|
|||||||
|
|
||||||
fun createImmutable(scoped: Pair<ValueDescriptor, CodeContext>, value: LLVMValueRef) : Int {
|
fun createImmutable(scoped: Pair<ValueDescriptor, CodeContext>, value: LLVMValueRef) : Int {
|
||||||
val descriptor = scoped.first
|
val descriptor = scoped.first
|
||||||
assert(descriptors.get(scoped) == null)
|
val scopedVariable = scoped.first.name to scoped.second
|
||||||
|
assert(!contextVariablesToIndex.containsKey(scopedVariable))
|
||||||
val index = variables.size
|
val index = variables.size
|
||||||
variables.add(ValueRecord(value, descriptor))
|
variables.add(ValueRecord(value, descriptor.name))
|
||||||
descriptors[scoped] = index
|
contextVariablesToIndex[scopedVariable] = index
|
||||||
return index
|
return index
|
||||||
}
|
}
|
||||||
|
|
||||||
fun indexOf(scoped: Pair<ValueDescriptor, CodeContext>) : Int {
|
fun indexOf(scoped: Pair<ValueDescriptor, CodeContext>) : Int {
|
||||||
return descriptors.getOrElse(scoped) { -1 }
|
return indexOfNamed(scoped.first.name to scoped.second)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun indexOfNamed(scoped: Pair<Name, CodeContext>) : Int {
|
||||||
|
return contextVariablesToIndex.getOrElse(scoped) { -1 }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addressOf(index: Int): LLVMValueRef {
|
fun addressOf(index: Int): LLVMValueRef {
|
||||||
|
|||||||
Reference in New Issue
Block a user