From 2457db9927e6ffe7cfffd1b3d72e44d551f3612e Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Mon, 10 Feb 2020 17:08:43 +0300 Subject: [PATCH] A follow up fix for https://youtrack.jetbrains.com/issue/KT-35940 --- .../kotlin/backend/konan/llvm/BitcodePhases.kt | 9 --------- .../konan/optimizations/Devirtualization.kt | 18 +++++++++++++++++- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BitcodePhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BitcodePhases.kt index 22a159629d8..02d54101fed 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BitcodePhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BitcodePhases.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.backend.common.phaser.namedUnitPhase import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.descriptors.GlobalHierarchyAnalysis import org.jetbrains.kotlin.backend.konan.optimizations.* -import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.* @@ -161,14 +160,6 @@ internal val dcePhase = makeKonanModuleOpPhase( referencedFunctions.add(declaration) super.visitConstructor(declaration) } - - override fun visitClass(declaration: IrClass) { - context.getLayoutBuilder(declaration).associatedObjects.values.forEach { - assert (it.kind == ClassKind.OBJECT) { "An object expected but was ${it.dump()}" } - referencedFunctions.add(it.constructors.single()) - } - super.visitClass(declaration) - } }) context.irModule!!.transformChildrenVoid(object: IrElementTransformerVoid() { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt index cbe6b66d269..76c0eca8216 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt @@ -86,7 +86,23 @@ internal object Devirtualization { moduleDFG.symbolTable.functionMap.values.filter { it.explicitlyExported } + externalModulesDFG.functionDFGs.keys.filter { it.explicitlyExported } - return (exportedFunctions + globalInitializers + explicitlyExportedFunctions).distinct() + // Conservatively assume each associated object could be instantiated. + val associatedObjects = mutableListOf() + context.irModule!!.acceptChildrenVoid(object: IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + override fun visitClass(declaration: IrClass) { + context.getLayoutBuilder(declaration).associatedObjects.values.forEach { + assert (it.kind == ClassKind.OBJECT) { "An object expected but was ${it.dump()}" } + associatedObjects += moduleDFG.symbolTable.mapFunction(it.constructors.single()) + } + super.visitClass(declaration) + } + }) + + return (exportedFunctions + globalInitializers + explicitlyExportedFunctions + associatedObjects).distinct() } fun BitSet.format(allTypes: List): String {