From b0c74ec00b91038cc2e587e0017d919fd5dbbadc Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 17 Jul 2019 09:30:37 +0300 Subject: [PATCH] Hack to fix dce for objc constructor calls --- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 1 + .../konan/optimizations/CallGraphBuilder.kt | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 8b23b391b5d..a9f23b879d8 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -2032,6 +2032,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map { assert(constructedClass.isKotlinObjCClass()) // Calls to other ObjC class constructors must be lowered. val symbols = context.ir.symbols diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/CallGraphBuilder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/CallGraphBuilder.kt index 1c8c6bab232..54bf13b3bb3 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/CallGraphBuilder.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/CallGraphBuilder.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.backend.konan.optimizations import org.jetbrains.kotlin.backend.konan.DirectedGraph import org.jetbrains.kotlin.backend.konan.DirectedGraphNode import org.jetbrains.kotlin.backend.konan.Context +import org.jetbrains.kotlin.backend.konan.isObjCClass +import org.jetbrains.kotlin.ir.util.parentAsClass internal class CallGraphNode(val graph: CallGraph, val symbol: DataFlowIR.FunctionSymbol) : DirectedGraphNode { @@ -95,6 +97,31 @@ internal class CallGraphBuilder(val context: Context, private inline fun DataFlowIR.FunctionBody.forEachCallSite(block: (DataFlowIR.Node.Call) -> Unit) = nodes.forEach { node -> when (node) { + // TODO: OBJC-CONSTRUCTOR-CALL + is DataFlowIR.Node.NewObject -> { + block(node) + if (node.irCallSite?.symbol?.owner?.parentAsClass?.isObjCClass() == true) { + block(DataFlowIR.Node.Call( + callee = moduleDFG.symbolTable.mapFunction(symbols.interopAllocObjCObject.owner), + arguments = listOf(DataFlowIR.Edge(DataFlowIR.Node.Null, null)), + returnType = moduleDFG.symbolTable.mapType(symbols.interopAllocObjCObject.owner.returnType), + irCallSite = null) + ) + block(DataFlowIR.Node.Call( + callee = moduleDFG.symbolTable.mapFunction(symbols.interopInterpretObjCPointer.owner), + arguments = listOf(DataFlowIR.Edge(DataFlowIR.Node.Null, null)), + returnType = moduleDFG.symbolTable.mapType(symbols.interopInterpretObjCPointer.owner.returnType), + irCallSite = null) + ) + block(DataFlowIR.Node.Call( + callee = moduleDFG.symbolTable.mapFunction(symbols.interopObjCRelease.owner), + arguments = listOf(DataFlowIR.Edge(DataFlowIR.Node.Null, null)), + returnType = moduleDFG.symbolTable.mapType(symbols.interopObjCRelease.owner.returnType), + irCallSite = null) + ) + } + } + is DataFlowIR.Node.Call -> block(node) is DataFlowIR.Node.Singleton ->