A follow up fix for https://youtrack.jetbrains.com/issue/KT-35940
This commit is contained in:
-9
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.backend.common.phaser.namedUnitPhase
|
|||||||
import org.jetbrains.kotlin.backend.konan.*
|
import org.jetbrains.kotlin.backend.konan.*
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.GlobalHierarchyAnalysis
|
import org.jetbrains.kotlin.backend.konan.descriptors.GlobalHierarchyAnalysis
|
||||||
import org.jetbrains.kotlin.backend.konan.optimizations.*
|
import org.jetbrains.kotlin.backend.konan.optimizations.*
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
@@ -161,14 +160,6 @@ internal val dcePhase = makeKonanModuleOpPhase(
|
|||||||
referencedFunctions.add(declaration)
|
referencedFunctions.add(declaration)
|
||||||
super.visitConstructor(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() {
|
context.irModule!!.transformChildrenVoid(object: IrElementTransformerVoid() {
|
||||||
|
|||||||
+17
-1
@@ -86,7 +86,23 @@ internal object Devirtualization {
|
|||||||
moduleDFG.symbolTable.functionMap.values.filter { it.explicitlyExported } +
|
moduleDFG.symbolTable.functionMap.values.filter { it.explicitlyExported } +
|
||||||
externalModulesDFG.functionDFGs.keys.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<DataFlowIR.FunctionSymbol>()
|
||||||
|
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<DataFlowIR.Type.Declared>): String {
|
fun BitSet.format(allTypes: List<DataFlowIR.Type.Declared>): String {
|
||||||
|
|||||||
Reference in New Issue
Block a user