From 5287274ca3c34a4134672b27f00b5dc0cc2e2299 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Wed, 30 Oct 2019 14:22:52 +0300 Subject: [PATCH] Refactor interface tables in RTTIGenerator --- .../backend/konan/llvm/RTTIGenerator.kt | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt index ebeb9955783..49d90568c05 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.backend.konan.llvm import llvm.* -import org.jetbrains.kotlin.backend.common.ir.simpleFunctions import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.descriptors.* @@ -311,7 +310,15 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { fun interfaceTableRecords(irClass: IrClass): Pair, Int> { // The details are in ClassLayoutBuilder. - val interfaceLayouts = irClass.implementedInterfaces.map { context.getLayoutBuilder(it) } + val interfaces = irClass.implementedInterfaces + val (interfaceTableSkeleton, interfaceTableSize) = interfaceTableSkeleton(interfaces) + + val interfaceTableEntries = interfaceTableRecords(irClass, interfaceTableSkeleton) + return Pair(interfaceTableEntries, interfaceTableSize) + } + + private fun interfaceTableSkeleton(interfaces: List): Pair, Int> { + val interfaceLayouts = interfaces.map { context.getLayoutBuilder(it) } val interfaceColors = interfaceLayouts.map { it.hierarchyInfo.interfaceColor } // Find the optimal size. It must be a power of 2. @@ -344,10 +351,18 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { it[interfaceLayout.hierarchyInfo.interfaceId % size] = interfaceLayout } + val interfaceTableSize = if (conservative) -size else (size - 1) + return Pair(interfaceTableSkeleton, interfaceTableSize) + } + + private fun interfaceTableRecords( + irClass: IrClass, + interfaceTableSkeleton: Array + ): List { val methodTableEntries = context.getLayoutBuilder(irClass).methodTableEntries val className = irClass.fqNameForIrSerialization - val interfaceTableEntries = interfaceTableSkeleton.map { iface -> + return interfaceTableSkeleton.map { iface -> val interfaceId = iface?.hierarchyInfo?.interfaceId ?: 0 InterfaceTableRecord( Int32(interfaceId), @@ -371,7 +386,6 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { } ) } - return Pair(interfaceTableEntries, if (conservative) -size else (size - 1)) } private fun mapRuntimeType(type: LLVMTypeRef): Int =