backend.native: make all RTTI constant

This commit is contained in:
Svyatoslav Scherbina
2016-10-04 10:44:10 +03:00
parent 5ea3c9521e
commit 473816ea81
2 changed files with 9 additions and 7 deletions
@@ -82,9 +82,10 @@ internal interface ContextUtils {
* Adds global variable with given name and value to [Context.llvmModule] of [context]. * Adds global variable with given name and value to [Context.llvmModule] of [context].
* Returns pointer to this variable. * Returns pointer to this variable.
*/ */
fun addGlobalVar(name: String, value: CompileTimeValue): CompileTimeValue { fun addGlobalConst(name: String, value: CompileTimeValue): CompileTimeValue {
val global = LLVMAddGlobal(context.llvmModule, value.getLlvmType(), name) val global = LLVMAddGlobal(context.llvmModule, value.getLlvmType(), name)
LLVMSetInitializer(global, value.getLlvmValue()) LLVMSetInitializer(global, value.getLlvmValue())
LLVMSetGlobalConstant(global, 1)
return compileTimeValue(global) return compileTimeValue(global)
} }
@@ -104,9 +105,9 @@ internal interface ContextUtils {
* Adds global array-typed variable with given name and value to [Context.llvmModule] of [context]. * Adds global array-typed variable with given name and value to [Context.llvmModule] of [context].
* Returns pointer to the first element of the global array. * Returns pointer to the first element of the global array.
*/ */
fun addGlobalArray(name: String, elemType: LLVMOpaqueType?, elements: List<CompileTimeValue>): CompileTimeValue { fun addGlobalConstArray(name: String, elemType: LLVMOpaqueType?, elements: List<CompileTimeValue>): CompileTimeValue {
return if (elements.size > 0) { return if (elements.size > 0) {
getPtrToFirstElem(addGlobalVar(name, ConstArray(elemType, elements))) getPtrToFirstElem(addGlobalConst(name, ConstArray(elemType, elements)))
} else { } else {
Zero(pointerType(elemType)) Zero(pointerType(elemType))
} }
@@ -97,7 +97,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
val superType = classDesc.getSuperClassOrAny().llvmTypeInfoPtr val superType = classDesc.getSuperClassOrAny().llvmTypeInfoPtr
val interfaces = classDesc.implementedInterfaces.map { it.llvmTypeInfoPtr } val interfaces = classDesc.implementedInterfaces.map { it.llvmTypeInfoPtr }
val interfacesPtr = addGlobalArray("kintf:$className", pointerType(runtime.typeInfoType), interfaces) val interfacesPtr = addGlobalConstArray("kintf:$className", pointerType(runtime.typeInfoType), interfaces)
val refFieldIndices = classDesc.fields.mapIndexedNotNull { index, field -> val refFieldIndices = classDesc.fields.mapIndexedNotNull { index, field ->
val type = field.returnType!! val type = field.returnType!!
@@ -109,7 +109,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
} }
// TODO: reuse offsets obtained for 'fields' below // TODO: reuse offsets obtained for 'fields' below
val objOffsets = refFieldIndices.map { LLVMOffsetOfElement(runtime.targetData, classType, it) } val objOffsets = refFieldIndices.map { LLVMOffsetOfElement(runtime.targetData, classType, it) }
val objOffsetsPtr = addGlobalArray("krefs:$className", int32Type, objOffsets.map { Int32(it.toInt()) }) val objOffsetsPtr = addGlobalConstArray("krefs:$className", int32Type, objOffsets.map { Int32(it.toInt()) })
val fields = classDesc.fields.mapIndexed { index, field -> val fields = classDesc.fields.mapIndexed { index, field ->
// Note: using FQ name because a class may have multiple fields with the same name due to property overriding // Note: using FQ name because a class may have multiple fields with the same name due to property overriding
@@ -118,7 +118,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
FieldTableRecord(nameSignature, fieldOffset.toInt()) FieldTableRecord(nameSignature, fieldOffset.toInt())
}.sortedBy { it.nameSignature } }.sortedBy { it.nameSignature }
val fieldsPtr = addGlobalArray("kfields:$className", runtime.fieldTableRecordType, fields) val fieldsPtr = addGlobalConstArray("kfields:$className", runtime.fieldTableRecordType, fields)
val methods = getMethodTableEntries(classDesc).map { val methods = getMethodTableEntries(classDesc).map {
val nameSignature = it.name.nameHash // FIXME: add signature val nameSignature = it.name.nameHash // FIXME: add signature
@@ -127,7 +127,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
MethodTableRecord(nameSignature, methodEntryPoint) MethodTableRecord(nameSignature, methodEntryPoint)
}.sortedBy { it.nameSignature } }.sortedBy { it.nameSignature }
val methodsPtr = addGlobalArray("kmethods:$className", runtime.methodTableRecordType, methods) val methodsPtr = addGlobalConstArray("kmethods:$className", runtime.methodTableRecordType, methods)
val typeInfo = TypeInfo(name, size, val typeInfo = TypeInfo(name, size,
superType, superType,
@@ -138,6 +138,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
val typeInfoGlobal = classDesc.llvmTypeInfoPtr.getLlvmValue() // TODO: it is a hack val typeInfoGlobal = classDesc.llvmTypeInfoPtr.getLlvmValue() // TODO: it is a hack
LLVMSetInitializer(typeInfoGlobal, typeInfo.getLlvmValue()) LLVMSetInitializer(typeInfoGlobal, typeInfo.getLlvmValue())
LLVMSetGlobalConstant(typeInfoGlobal, 1)
} }
} }