IR Inliner: Use unbound IR deserializer in IR inliner at 1st phase
Use `NonLinkingIrInlineFunctionDeserializer` in IR inliner on the
1st phase of compilation.
^KT-73474
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsPreSerializationLoweringPhasesProvider.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsPreSerializationLoweringPhasesProvider.kt
index aafd190..e8dd423 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsPreSerializationLoweringPhasesProvider.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsPreSerializationLoweringPhasesProvider.kt
@@ -7,7 +7,9 @@
import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.PreSerializationLoweringContext
+import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerIr
import org.jetbrains.kotlin.ir.inline.PreSerializationLoweringPhasesProvider
+import org.jetbrains.kotlin.ir.util.KotlinMangler
object JsPreSerializationLoweringPhasesProvider : PreSerializationLoweringPhasesProvider<PreSerializationLoweringContext>() {
@@ -16,4 +18,7 @@
override val allowExternalInlineFunctions: Boolean
get() = true
+
+ override val irMangler: KotlinMangler.IrMangler
+ get() = JsManglerIr
}
diff --git a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt
index 8f29cd2..5468e6a 100644
--- a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt
+++ b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt
@@ -18,6 +18,7 @@
import org.jetbrains.kotlin.backend.common.lower.at
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
import org.jetbrains.kotlin.backend.common.serialization.NonLinkingIrInlineFunctionDeserializer
+import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer
import org.jetbrains.kotlin.contracts.parsing.ContractsDslNames
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.isPrivate
import org.jetbrains.kotlin.ir.IrElement
@@ -112,16 +113,39 @@
}
/**
- * This resolver is supposed to be run at the first compilation stage for all non-JVM targets.
+ * These resolvers are supposed to be run at the first compilation stage for all non-JVM targets.
*/
-internal class PreSerializationInlineFunctionResolver(
+internal class PreSerializationPrivateInlineFunctionResolver(
context: LoweringContext,
- private val deserializer: NonLinkingIrInlineFunctionDeserializer,
- inlineMode: InlineMode,
override val allowExternalInlining: Boolean,
-) : InlineFunctionResolverReplacingCoroutineIntrinsics<LoweringContext>(context, inlineMode) {
- override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction? =
- super.getFunctionDeclaration(symbol)?.also(deserializer::deserializeInlineFunction)
+) : InlineFunctionResolverReplacingCoroutineIntrinsics<LoweringContext>(context, InlineMode.PRIVATE_INLINE_FUNCTIONS) {
+ override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction? {
+ val function = super.getFunctionDeclaration(symbol)
+ if (function != null) {
+ check(function.body != null) { "Unexpected inline function without body: ${function.render()}" }
+ }
+ return function
+ }
+}
+
+internal class PreSerializationNonPrivateInlineFunctionResolver(
+ context: LoweringContext,
+ override val allowExternalInlining: Boolean,
+ irMangler: KotlinMangler.IrMangler,
+) : InlineFunctionResolverReplacingCoroutineIntrinsics<LoweringContext>(context, InlineMode.ALL_INLINE_FUNCTIONS) {
+
+ private val deserializer = NonLinkingIrInlineFunctionDeserializer(
+ irBuiltIns = context.irBuiltIns,
+ signatureComputer = PublicIdSignatureComputer(irMangler)
+ )
+
+ override fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction? {
+ val function = super.getFunctionDeclaration(symbol)
+ if (function != null && function.body == null) {
+ deserializer.deserializeInlineFunction(function)
+ }
+ return function
+ }
}
open class FunctionInlining(
diff --git a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/PreSerializationLoweringPhasesProvider.kt b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/PreSerializationLoweringPhasesProvider.kt
index 06eb19f..da2fab54 100644
--- a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/PreSerializationLoweringPhasesProvider.kt
+++ b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/PreSerializationLoweringPhasesProvider.kt
@@ -11,6 +11,7 @@
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.phaser.SameTypeNamedCompilerPhase
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
+import org.jetbrains.kotlin.ir.util.KotlinMangler.IrMangler
abstract class PreSerializationLoweringPhasesProvider<Context : CommonBackendContext> {
@@ -23,13 +24,22 @@
protected open val allowExternalInlineFunctions: Boolean
get() = false
+ protected abstract val irMangler: IrMangler
+
@Suppress("unused") // TODO: Will be used when KT-71415 is fixed
- private fun inlineFunctionResolver(context: Context, inlineMode: InlineMode): InlineFunctionResolver {
- return PreSerializationInlineFunctionResolver(
- context,
- TODO("supply NonLinkingIrInlineFunctionDeserializer"),
- inlineMode,
- allowExternalInlineFunctions
+ private fun privateInlineFunctionResolver(context: Context): InlineFunctionResolver {
+ return PreSerializationPrivateInlineFunctionResolver(
+ context = context,
+ allowExternalInlining = allowExternalInlineFunctions,
+ )
+ }
+
+ @Suppress("unused") // TODO: Will be used when KT-71415 is fixed
+ private fun nonPrivateInlineFunctionResolver(context: Context): InlineFunctionResolver {
+ return PreSerializationNonPrivateInlineFunctionResolver(
+ context = context,
+ allowExternalInlining = allowExternalInlineFunctions,
+ irMangler = irMangler,
)
}
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt
index da2265b1..e968c69 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt
@@ -19,6 +19,7 @@
import org.jetbrains.kotlin.backend.konan.lower.SpecialBackendChecksTraversal
import org.jetbrains.kotlin.backend.konan.makeEntryPoint
import org.jetbrains.kotlin.backend.konan.objcexport.createTestBundle
+import org.jetbrains.kotlin.backend.konan.serialization.KonanManglerIr
import org.jetbrains.kotlin.cli.common.runPreSerializationLoweringPhases
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
@@ -28,9 +29,8 @@
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
-import org.jetbrains.kotlin.ir.inline.InlineFunctionResolver
-import org.jetbrains.kotlin.ir.inline.InlineMode
import org.jetbrains.kotlin.ir.inline.PreSerializationLoweringPhasesProvider
+import org.jetbrains.kotlin.ir.util.KotlinMangler
import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl
import org.jetbrains.kotlin.ir.util.addChild
import org.jetbrains.kotlin.ir.util.addFile
@@ -86,6 +86,9 @@
override val klibAssertionWrapperLowering: ((PreSerializationLoweringContext) -> FileLoweringPass)?
get() = null // TODO(KT-71415): Return the actual lowering here
+
+ override val irMangler: KotlinMangler.IrMangler
+ get() = KonanManglerIr
}
internal fun <T : PhaseContext> PhaseEngine<T>.runIrInliner(fir2IrOutput: Fir2IrOutput, environment: KotlinCoreEnvironment): Fir2IrOutput =