From 96dfcba9976b75462cf1739b78610b0f2efd31de Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Thu, 3 Nov 2016 18:13:25 +0300 Subject: [PATCH] Generate interface RTTI properly. --- .../kotlin/backend/native/llvm/RTTIGenerator.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/RTTIGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/RTTIGenerator.kt index 90d8ad24eee..d9fed8dcbea 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/RTTIGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/RTTIGenerator.kt @@ -149,6 +149,8 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { val name = className.globalHash + val isInterface = classDesc.kind == ClassKind.INTERFACE + val size = getInstanceSize(classType, className) val superType = classDesc.getSuperClassOrAny().llvmTypeInfoPtr @@ -175,11 +177,13 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { FieldTableRecord(nameSignature, fieldOffset.toInt()) }.sortedBy { it.nameSignature.value } - val fieldsPtr = addGlobalConstArray("kfields:$className", runtime.fieldTableRecordType, fields) + val fieldsPtr = if (isInterface) Zero(pointerType(runtime.fieldTableRecordType)) + else addGlobalConstArray("kfields:$className", runtime.fieldTableRecordType, fields) // TODO: compile-time resolution limits binary compatibility val vtable = getVtableEntries(classDesc).map { it.implementation.entryPointAddress } - val vtablePtr = addGlobalConstArray("kvtable:$className", pointerType(int8Type), vtable) + val vtablePtr = if (isInterface) Zero(pointerType(pointerType(int8Type))) else + addGlobalConstArray("kvtable:$className", pointerType(int8Type), vtable) val methods = getMethodTableEntries(classDesc).map { val nameSignature = it.name.localHash // FIXME: add signature @@ -188,7 +192,8 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { MethodTableRecord(nameSignature, methodEntryPoint) }.sortedBy { it.nameSignature.value } - val methodsPtr = addGlobalConstArray("kmethods:$className", runtime.methodTableRecordType, methods) + val methodsPtr = if (isInterface) Zero(pointerType(runtime.methodTableRecordType)) else + addGlobalConstArray("kmethods:$className", runtime.methodTableRecordType, methods) val typeInfo = TypeInfo(name, size, superType, @@ -196,7 +201,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { interfacesPtr, interfaces.size, vtablePtr, methodsPtr, methods.size, - fieldsPtr, fields.size) + fieldsPtr, if (isInterface) -1 else fields.size) val typeInfoGlobal = classDesc.llvmTypeInfoPtr.getLlvmValue() // TODO: it is a hack LLVMSetInitializer(typeInfoGlobal, typeInfo.getLlvmValue())