backend.native: make all RTTI constant
This commit is contained in:
+4
-3
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-4
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user