Hack to fix dce for objc constructor calls
This commit is contained in:
+1
@@ -2032,6 +2032,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
lifetime = resultLifetime(callee), exceptionHandler = currentCodeContext.exceptionHandler)
|
lifetime = resultLifetime(callee), exceptionHandler = currentCodeContext.exceptionHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: OBJC-CONSTRUCTOR-CALL. Move to InteropLowering.
|
||||||
constructedClass.isObjCClass() -> {
|
constructedClass.isObjCClass() -> {
|
||||||
assert(constructedClass.isKotlinObjCClass()) // Calls to other ObjC class constructors must be lowered.
|
assert(constructedClass.isKotlinObjCClass()) // Calls to other ObjC class constructors must be lowered.
|
||||||
val symbols = context.ir.symbols
|
val symbols = context.ir.symbols
|
||||||
|
|||||||
+27
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.backend.konan.optimizations
|
|||||||
import org.jetbrains.kotlin.backend.konan.DirectedGraph
|
import org.jetbrains.kotlin.backend.konan.DirectedGraph
|
||||||
import org.jetbrains.kotlin.backend.konan.DirectedGraphNode
|
import org.jetbrains.kotlin.backend.konan.DirectedGraphNode
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
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)
|
internal class CallGraphNode(val graph: CallGraph, val symbol: DataFlowIR.FunctionSymbol)
|
||||||
: DirectedGraphNode<DataFlowIR.FunctionSymbol> {
|
: DirectedGraphNode<DataFlowIR.FunctionSymbol> {
|
||||||
@@ -95,6 +97,31 @@ internal class CallGraphBuilder(val context: Context,
|
|||||||
private inline fun DataFlowIR.FunctionBody.forEachCallSite(block: (DataFlowIR.Node.Call) -> Unit) =
|
private inline fun DataFlowIR.FunctionBody.forEachCallSite(block: (DataFlowIR.Node.Call) -> Unit) =
|
||||||
nodes.forEach { node ->
|
nodes.forEach { node ->
|
||||||
when (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.Call -> block(node)
|
||||||
|
|
||||||
is DataFlowIR.Node.Singleton ->
|
is DataFlowIR.Node.Singleton ->
|
||||||
|
|||||||
Reference in New Issue
Block a user