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 =