This commit is contained in:
Igor Chevdar
2020-02-10 17:08:43 +03:00
parent 8f7ebe7f51
commit 2457db9927
2 changed files with 17 additions and 10 deletions
@@ -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() {
@@ -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<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 {