[IR] Refactored a bit InlineFunctionResolver

This commit is contained in:
Igor Chevdar
2024-01-16 13:45:04 +02:00
committed by Space Team
parent f3a807c507
commit 978bf3d38d
5 changed files with 15 additions and 26 deletions
@@ -42,11 +42,15 @@ fun IrExpression.isAdaptedFunctionReference() =
this is IrBlock && this.origin == IrStatementOrigin.ADAPTED_FUNCTION_REFERENCE this is IrBlock && this.origin == IrStatementOrigin.ADAPTED_FUNCTION_REFERENCE
interface InlineFunctionResolver { interface InlineFunctionResolver {
fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction = symbol.owner
fun getFunctionSymbol(irFunction: IrFunction): IrFunctionSymbol fun getFunctionSymbol(irFunction: IrFunction): IrFunctionSymbol = irFunction.symbol
fun shouldExcludeFunctionFromInlining(symbol: IrFunctionSymbol): Boolean { fun shouldExcludeFunctionFromInlining(symbol: IrFunctionSymbol): Boolean {
return Symbols.isLateinitIsInitializedPropertyGetter(symbol) || Symbols.isTypeOfIntrinsic(symbol) return Symbols.isLateinitIsInitializedPropertyGetter(symbol) || Symbols.isTypeOfIntrinsic(symbol)
} }
companion object {
val TRIVIAL = object : InlineFunctionResolver {}
}
} }
fun IrFunction.isTopLevelInPackage(name: String, packageName: String): Boolean { fun IrFunction.isTopLevelInPackage(name: String, packageName: String): Boolean {
@@ -63,7 +67,7 @@ fun IrFunction.isBuiltInSuspendCoroutineUninterceptedOrReturn(): Boolean =
StandardNames.COROUTINES_INTRINSICS_PACKAGE_FQ_NAME.asString() StandardNames.COROUTINES_INTRINSICS_PACKAGE_FQ_NAME.asString()
) )
open class DefaultInlineFunctionResolver(open val context: CommonBackendContext) : InlineFunctionResolver { open class InlineFunctionResolverReplacingCoroutineIntrinsics(open val context: CommonBackendContext) : InlineFunctionResolver {
override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction { override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction {
val function = symbol.owner val function = symbol.owner
// TODO: Remove these hacks when coroutine intrinsics are fixed. // TODO: Remove these hacks when coroutine intrinsics are fixed.
@@ -77,15 +81,11 @@ open class DefaultInlineFunctionResolver(open val context: CommonBackendContext)
else -> function else -> function
} }
} }
override fun getFunctionSymbol(irFunction: IrFunction): IrFunctionSymbol {
return irFunction.symbol
}
} }
class FunctionInlining( class FunctionInlining(
val context: CommonBackendContext, val context: CommonBackendContext,
private val inlineFunctionResolver: InlineFunctionResolver = DefaultInlineFunctionResolver(context), private val inlineFunctionResolver: InlineFunctionResolver = InlineFunctionResolver.TRIVIAL,
private val innerClassesSupport: InnerClassesSupport? = null, private val innerClassesSupport: InnerClassesSupport? = null,
private val insertAdditionalImplicitCasts: Boolean = false, private val insertAdditionalImplicitCasts: Boolean = false,
private val alwaysCreateTemporaryVariablesForArguments: Boolean = false, private val alwaysCreateTemporaryVariablesForArguments: Boolean = false,
@@ -6,10 +6,8 @@
package org.jetbrains.kotlin.ir.backend.js.lower.inline package org.jetbrains.kotlin.ir.backend.js.lower.inline
import org.jetbrains.kotlin.backend.common.DeclarationTransformer import org.jetbrains.kotlin.backend.common.DeclarationTransformer
import org.jetbrains.kotlin.backend.common.lower.inline.DefaultInlineFunctionResolver import org.jetbrains.kotlin.backend.common.lower.inline.InlineFunctionResolverReplacingCoroutineIntrinsics
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.lazy2
import org.jetbrains.kotlin.ir.backend.js.utils.compileSuspendAsJsGenerator
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.deepCopyWithVariables
@@ -30,7 +28,7 @@ internal class SaveInlineFunctionsBeforeInlining(context: JsIrBackendContext) :
} }
} }
internal class JsInlineFunctionResolver(context: JsIrBackendContext) : DefaultInlineFunctionResolver(context) { internal class JsInlineFunctionResolver(context: JsIrBackendContext) : InlineFunctionResolverReplacingCoroutineIntrinsics(context) {
private val enumEntriesIntrinsic = context.intrinsics.enumEntriesIntrinsic private val enumEntriesIntrinsic = context.intrinsics.enumEntriesIntrinsic
private val inlineFunctionsBeforeInlining = context.mapping.inlineFunctionsBeforeInlining private val inlineFunctionsBeforeInlining = context.mapping.inlineFunctionsBeforeInlining
private val inlineFunctionsBeforeInliningSymbols = hashMapOf<IrFunction, IrFunctionSymbol>() private val inlineFunctionsBeforeInliningSymbols = hashMapOf<IrFunction, IrFunctionSymbol>()
@@ -280,20 +280,11 @@ private val kotlinNothingValueExceptionPhase = makeIrFilePhase<CommonBackendCont
internal val functionInliningPhase = makeIrModulePhase( internal val functionInliningPhase = makeIrModulePhase(
{ context -> { context ->
class JvmInlineFunctionResolver : InlineFunctionResolver {
override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction {
return symbol.owner
}
override fun getFunctionSymbol(irFunction: IrFunction): IrFunctionSymbol {
return irFunction.symbol
}
}
if (!context.irInlinerIsEnabled()) return@makeIrModulePhase FileLoweringPass.Empty if (!context.irInlinerIsEnabled()) return@makeIrModulePhase FileLoweringPass.Empty
FunctionInlining( FunctionInlining(
context, JvmInlineFunctionResolver(), context.innerClassesSupport, context,
innerClassesSupport = context.innerClassesSupport,
alwaysCreateTemporaryVariablesForArguments = true, alwaysCreateTemporaryVariablesForArguments = true,
regenerateInlinedAnonymousObjects = true, regenerateInlinedAnonymousObjects = true,
inlineArgumentsWithTheirOriginalTypeAndOffset = true inlineArgumentsWithTheirOriginalTypeAndOffset = true
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.backend.wasm.lower package org.jetbrains.kotlin.backend.wasm.lower
import org.jetbrains.kotlin.backend.common.lower.inline.DefaultInlineFunctionResolver import org.jetbrains.kotlin.backend.common.lower.inline.InlineFunctionResolverReplacingCoroutineIntrinsics
import org.jetbrains.kotlin.backend.wasm.WasmBackendContext import org.jetbrains.kotlin.backend.wasm.WasmBackendContext
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
class WasmInlineFunctionResolver(context: WasmBackendContext) : DefaultInlineFunctionResolver(context) { class WasmInlineFunctionResolver(context: WasmBackendContext) : InlineFunctionResolverReplacingCoroutineIntrinsics(context) {
private val enumEntriesIntrinsic = context.wasmSymbols.enumEntriesIntrinsic private val enumEntriesIntrinsic = context.wasmSymbols.enumEntriesIntrinsic
override fun shouldExcludeFunctionFromInlining(symbol: IrFunctionSymbol): Boolean { override fun shouldExcludeFunctionFromInlining(symbol: IrFunctionSymbol): Boolean {
@@ -30,7 +30,7 @@ internal class InlineFunctionsSupport(mapping: NativeMapping) {
} }
// TODO: This is a bit hacky. Think about adopting persistent IR ideas. // TODO: This is a bit hacky. Think about adopting persistent IR ideas.
internal class NativeInlineFunctionResolver(override val context: Context, val generationState: NativeGenerationState) : DefaultInlineFunctionResolver(context) { internal class NativeInlineFunctionResolver(override val context: Context, val generationState: NativeGenerationState) : InlineFunctionResolverReplacingCoroutineIntrinsics(context) {
override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction { override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction {
val function = super.getFunctionDeclaration(symbol) val function = super.getFunctionDeclaration(symbol)