Add handlers that verify Klib ABI consistency with respect to inlining

^KT-70969
diff --git a/compiler/testData/ir/irText/errors/unresolvedReference.kt b/compiler/testData/ir/irText/errors/unresolvedReference.kt
index 1c53803..b61b925 100644
--- a/compiler/testData/ir/irText/errors/unresolvedReference.kt
+++ b/compiler/testData/ir/irText/errors/unresolvedReference.kt
@@ -1,7 +1,8 @@
 // IGNORE_ERRORS
 // IGNORE_FIR_DIAGNOSTICS
 // DIAGNOSTICS: -UNRESOLVED_REFERENCE -OVERLOAD_RESOLUTION_AMBIGUITY
-// IGNORE_BACKEND_K1: JS_IR
+// IGNORE_BACKEND: JS_IR NATIVE
+// REASON: Serialization of IrErrorType is not supported anymore
 // SKIP_GENERATING_KLIB
 // REASON: Cannot serialize error type: ERROR CLASS: Unresolved name: unresolved
 // RUN_PIPELINE_TILL: FIR2IR
diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/KlibAbiConsistencyHandlers.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/KlibAbiConsistencyHandlers.kt
new file mode 100644
index 0000000..7ea4fa4
--- /dev/null
+++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/KlibAbiConsistencyHandlers.kt
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+@file:OptIn(ExperimentalLibraryAbiReader::class)
+
+package org.jetbrains.kotlin.test.backend.handlers
+
+import org.jetbrains.kotlin.config.messageCollector
+import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
+import org.jetbrains.kotlin.library.abi.AbiReadingFilter.SyntheticAccessors
+import org.jetbrains.kotlin.library.abi.AbiRenderingSettings
+import org.jetbrains.kotlin.library.abi.AbiSignatureVersion.Companion.resolveByVersionNumber
+import org.jetbrains.kotlin.library.abi.ExperimentalLibraryAbiReader
+import org.jetbrains.kotlin.library.abi.LibraryAbiReader
+import org.jetbrains.kotlin.library.abi.LibraryAbiRenderer
+import org.jetbrains.kotlin.test.Constructor
+import org.jetbrains.kotlin.test.backend.AbstractKlibSerializerFacade
+import org.jetbrains.kotlin.test.backend.handlers.KlibAbiDumpBeforeInliningSavingHandler.Companion.abiDumpBeforeInlining
+import org.jetbrains.kotlin.test.backend.handlers.KlibAbiDumpHandler.Companion.DEFAULT_ABI_SIGNATURE_VERSION
+import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
+import org.jetbrains.kotlin.test.directives.KlibAbiConsistencyDirectives
+import org.jetbrains.kotlin.test.model.ArtifactKinds
+import org.jetbrains.kotlin.test.model.BinaryArtifactHandler
+import org.jetbrains.kotlin.test.model.BinaryArtifacts
+import org.jetbrains.kotlin.test.model.TestModule
+import org.jetbrains.kotlin.test.services.TestServices
+import org.jetbrains.kotlin.test.services.compilerConfigurationProvider
+import org.jetbrains.kotlin.test.services.configuration.KlibBasedEnvironmentConfiguratorUtils
+import org.jetbrains.kotlin.test.services.temporaryDirectoryManager
+import org.jetbrains.kotlin.test.utils.MultiModuleInfoDumper
+import java.io.File
+
+class KlibAbiDumpBeforeInliningSavingHandler(
+    testServices: TestServices,
+    private val serializerFacade: Constructor<AbstractKlibSerializerFacade>,
+) : AbstractIrHandler(
+    testServices,
+    failureDisablesNextSteps = true,
+    doNotRunIfThereWerePreviousFailures = true,
+) {
+    override val directiveContainers get() = listOf(KlibAbiConsistencyDirectives)
+
+    private val dumper = MultiModuleInfoDumper()
+
+    override fun processModule(module: TestModule, info: IrBackendInput) {
+        if (KlibAbiConsistencyDirectives.CHECK_SAME_ABI_AFTER_INLINING !in module.directives) return
+
+        val klibFile = serializeModule(module, info).outputFile
+        val libraryAbi = LibraryAbiReader.readAbiInfo(klibFile, SyntheticAccessors())
+
+        LibraryAbiRenderer.render(
+            libraryAbi,
+            dumper.builderForModule(module),
+            AbiRenderingSettings(resolveByVersionNumber(DEFAULT_ABI_SIGNATURE_VERSION.number))
+        )
+    }
+
+    private fun serializeModule(module: TestModule, inputArtifact: IrBackendInput): BinaryArtifacts.KLib {
+        val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module)
+        val diagnosticReporter = DiagnosticReporterFactory.createReporter(configuration.messageCollector)
+        val outputFile = getAbiCheckKlibArtifactFile(testServices, module.name)
+
+        serializerFacade.invoke(testServices).serializeBare(module, inputArtifact, outputFile, configuration, diagnosticReporter)
+
+        return BinaryArtifacts.KLib(outputFile, diagnosticReporter)
+    }
+
+    override fun processAfterAllModules(someAssertionWasFailed: Boolean) {
+        if (dumper.isEmpty()) return
+        testServices.abiDumpBeforeInlining.writeText(dumper.generateResultingDump())
+    }
+
+    companion object : KlibBasedEnvironmentConfiguratorUtils {
+        val TestServices.abiDumpBeforeInlining: File
+            get() = temporaryDirectoryManager.rootDir.resolve("abi_dump_before_inlining.txt")
+
+        fun getAbiCheckKlibArtifactFile(testServices: TestServices, moduleName: String) =
+            getKlibArtifactFile(testServices, "${moduleName}AbiCheck")
+    }
+}
+
+class KlibAbiDumpAfterInliningVerifyingHandler(testServices: TestServices) : BinaryArtifactHandler<BinaryArtifacts.KLib>(
+    testServices,
+    ArtifactKinds.KLib,
+    failureDisablesNextSteps = true,
+    doNotRunIfThereWerePreviousFailures = true,
+) {
+    private val dumper = MultiModuleInfoDumper()
+
+    override val directiveContainers get() = listOf(KlibAbiConsistencyDirectives)
+
+    override fun processModule(module: TestModule, info: BinaryArtifacts.KLib) {
+        if (KlibAbiConsistencyDirectives.CHECK_SAME_ABI_AFTER_INLINING !in module.directives) return
+
+        val libraryAbi = LibraryAbiReader.readAbiInfo(info.outputFile, SyntheticAccessors())
+
+        LibraryAbiRenderer.render(
+            libraryAbi,
+            dumper.builderForModule(module),
+            AbiRenderingSettings(resolveByVersionNumber(DEFAULT_ABI_SIGNATURE_VERSION.number))
+        )
+    }
+
+    override fun processAfterAllModules(someAssertionWasFailed: Boolean) {
+        if (dumper.isEmpty()) return
+        val expectedFile = testServices.abiDumpBeforeInlining
+        assertions.assertEqualsToFile(expectedFile, dumper.generateResultingDump())
+    }
+}
diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/IrBackendFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/IrBackendFacade.kt
index 900ece0..fc438e9 100644
--- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/IrBackendFacade.kt
+++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/IrBackendFacade.kt
@@ -6,6 +6,7 @@
 package org.jetbrains.kotlin.test.backend.ir
 
 import org.jetbrains.kotlin.test.Constructor
+import org.jetbrains.kotlin.test.backend.AbstractKlibSerializerFacade
 import org.jetbrains.kotlin.test.model.BackendFacade
 import org.jetbrains.kotlin.test.model.BackendKinds
 import org.jetbrains.kotlin.test.model.BinaryArtifacts
@@ -20,6 +21,6 @@
 ) : BackendFacade<IrBackendInput, BinaryOutputArtifact>(testServices, BackendKinds.IrBackend, artifactKind)
 
 data class KlibFacades(
-    val serializerFacade: Constructor<IrBackendFacade<BinaryArtifacts.KLib>>,
+    val serializerFacade: Constructor<AbstractKlibSerializerFacade>,
     val deserializerFacade: Constructor<DeserializerFacade<BinaryArtifacts.KLib, IrBackendInput>>,
 )
diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/KlibAbiConsistencyDirectives.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/KlibAbiConsistencyDirectives.kt
new file mode 100644
index 0000000..a66f2cc
--- /dev/null
+++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/KlibAbiConsistencyDirectives.kt
@@ -0,0 +1,14 @@
+/*
+ * Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.test.directives
+
+import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer
+
+object KlibAbiConsistencyDirectives : SimpleDirectivesContainer() {
+    val CHECK_SAME_ABI_AFTER_INLINING by directive(
+        description = "Enable checking if ABI is the same before and after inlining"
+    )
+}
diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/ir/AbstractNonJvmIrTextTest.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/ir/AbstractNonJvmIrTextTest.kt
index 038fa79..e77a25d 100644
--- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/ir/AbstractNonJvmIrTextTest.kt
+++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/ir/AbstractNonJvmIrTextTest.kt
@@ -86,17 +86,19 @@
         irHandlersStep {
             setupIrTextDumpHandlers()
         }
-
         facadeStep(preSerializerFacade)
-        loweredIrHandlersStep { useHandlers(::IrDiagnosticsHandler) }
+
+        irHandlersStep {
+            useHandlers({ KlibAbiDumpBeforeInliningSavingHandler(it, klibFacades.serializerFacade) })
+        }
 
         loweredIrHandlersStep {
-            useHandlers({ SerializedIrDumpHandler(it, isAfterDeserialization = false) })
+            useHandlers(::IrDiagnosticsHandler, { SerializedIrDumpHandler(it, isAfterDeserialization = false) })
         }
 
         facadeStep(klibFacades.serializerFacade)
         klibArtifactsHandlersStep {
-            this.useHandlers(::KlibAbiDumpHandler)
+            this.useHandlers(::KlibAbiDumpHandler, ::KlibAbiDumpAfterInliningVerifyingHandler)
         }
         facadeStep(klibFacades.deserializerFacade)
 
diff --git a/compiler/util-klib-abi/src/org/jetbrains/kotlin/library/abi/LibraryAbiReader.kt b/compiler/util-klib-abi/src/org/jetbrains/kotlin/library/abi/LibraryAbiReader.kt
index 135b1f8..a4ee261 100644
--- a/compiler/util-klib-abi/src/org/jetbrains/kotlin/library/abi/LibraryAbiReader.kt
+++ b/compiler/util-klib-abi/src/org/jetbrains/kotlin/library/abi/LibraryAbiReader.kt
@@ -76,6 +76,14 @@
         }
     }
 
+    /**
+     * The default implementation of a filter that ignores synthetic accessors
+     */
+    class SyntheticAccessors : AbiReadingFilter {
+        override fun isDeclarationExcluded(declaration: AbiDeclaration): Boolean =
+            declaration is AbiFunction && declaration.qualifiedName.relativeName.simpleName.value.startsWith("access$")
+    }
+
     /** The default composite filter implementation: Exposes multiple incorporated filters as a single filter. */
     class Composite(filters: List<AbiReadingFilter>) : AbiReadingFilter {
         private val filters = filters.toTypedArray()
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractFirJsIrTextTestBase.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractFirJsIrTextTestBase.kt
index 4387342..d207724 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractFirJsIrTextTestBase.kt
+++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractFirJsIrTextTestBase.kt
@@ -17,6 +17,7 @@
 import org.jetbrains.kotlin.test.backend.ir.KlibFacades
 import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
 import org.jetbrains.kotlin.test.configuration.additionalK2ConfigurationForIrTextTest
+import org.jetbrains.kotlin.test.directives.KlibAbiConsistencyDirectives.CHECK_SAME_ABI_AFTER_INLINING
 import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.LANGUAGE
 import org.jetbrains.kotlin.test.frontend.fir.FirOutputArtifact
 import org.jetbrains.kotlin.test.model.Frontend2BackendConverter
@@ -47,6 +48,7 @@
         builder.additionalK2ConfigurationForIrTextTest(parser)
         with(builder) {
             defaultDirectives {
+                +CHECK_SAME_ABI_AFTER_INLINING
                 LANGUAGE with "+${LanguageFeature.IrInlinerBeforeKlibSerialization.name}"
             }
         }
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractJsFirTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractJsFirTest.kt
index fd2d6cf..0240dc4 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractJsFirTest.kt
+++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractJsFirTest.kt
@@ -20,12 +20,14 @@
 import org.jetbrains.kotlin.test.Constructor
 import org.jetbrains.kotlin.test.FirParser
 import org.jetbrains.kotlin.test.TargetBackend
+import org.jetbrains.kotlin.test.backend.AbstractKlibSerializerFacade
 import org.jetbrains.kotlin.test.backend.handlers.IrTextDumpHandler
 import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
 import org.jetbrains.kotlin.test.builders.*
 import org.jetbrains.kotlin.test.configuration.commonFirHandlersForCodegenTest
 import org.jetbrains.kotlin.test.directives.*
 import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.DUMP_IR_AFTER_INLINE
+import org.jetbrains.kotlin.test.directives.KlibAbiConsistencyDirectives.CHECK_SAME_ABI_AFTER_INLINING
 import org.jetbrains.kotlin.test.directives.KlibBasedCompilerTestDirectives.IGNORE_KLIB_SYNTHETIC_ACCESSORS_CHECKS
 import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.LANGUAGE
 import org.jetbrains.kotlin.test.directives.model.ValueDirective
@@ -54,7 +56,7 @@
     override val frontendToIrConverter: Constructor<Frontend2BackendConverter<FirOutputArtifact, IrBackendInput>>
         get() = ::Fir2IrCliWebFacade
 
-    override val serializerFacade: Constructor<BackendFacade<IrBackendInput, BinaryArtifacts.KLib>>
+    override val serializerFacade: Constructor<AbstractKlibSerializerFacade>
         get() = ::FirKlibSerializerCliWebFacade
 
     override val backendFacades: JsBackendFacades
@@ -119,6 +121,7 @@
 open class AbstractFirJsCodegenBoxTest : AbstractFirJsCodegenBoxTestBase(
     testGroupOutputDirPrefix = "codegen/firBox/"
 )
+
 open class AbstractFirJsCodegenBoxWithInlinedFunInKlibTest : AbstractFirJsCodegenBoxTestBase(
     testGroupOutputDirPrefix = "codegen/firBoxWithInlinedFunInKlib"
 ) {
@@ -126,6 +129,7 @@
         super.configure(builder)
         with(builder) {
             defaultDirectives {
+                +CHECK_SAME_ABI_AFTER_INLINING
                 LANGUAGE with "+${LanguageFeature.IrInlinerBeforeKlibSerialization.name}"
             }
             configureLoweredIrHandlersStep {
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsBlackBoxCodegenTestBase.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsBlackBoxCodegenTestBase.kt
index 5a9403d..696782e 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsBlackBoxCodegenTestBase.kt
+++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsBlackBoxCodegenTestBase.kt
@@ -20,6 +20,7 @@
 import org.jetbrains.kotlin.platform.js.JsPlatforms
 import org.jetbrains.kotlin.test.Constructor
 import org.jetbrains.kotlin.test.TargetBackend
+import org.jetbrains.kotlin.test.backend.AbstractKlibSerializerFacade
 import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor
 import org.jetbrains.kotlin.test.backend.handlers.*
 import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
@@ -89,7 +90,7 @@
 
     abstract val frontendFacade: Constructor<FrontendFacade<FO>>
     abstract val frontendToIrConverter: Constructor<Frontend2BackendConverter<FO, IrBackendInput>>
-    abstract val serializerFacade: Constructor<BackendFacade<IrBackendInput, BinaryArtifacts.KLib>>
+    abstract val serializerFacade: Constructor<AbstractKlibSerializerFacade>
     abstract val backendFacades: JsBackendFacades
 
     protected open val customIgnoreDirective: ValueDirective<TargetBackend>?
@@ -153,7 +154,7 @@
     targetFrontend: FrontendKind<FO>,
     frontendFacade: Constructor<FrontendFacade<FO>>,
     frontendToIrConverter: Constructor<Frontend2BackendConverter<FO, IrBackendInput>>,
-    serializerFacade: Constructor<BackendFacade<IrBackendInput, BinaryArtifacts.KLib>>,
+    serializerFacade: Constructor<AbstractKlibSerializerFacade>,
     customIgnoreDirective: ValueDirective<TargetBackend>? = null,
 ) {
     commonConfigurationForJsTest(targetFrontend, frontendFacade, frontendToIrConverter, serializerFacade)
@@ -268,7 +269,7 @@
     targetFrontend: FrontendKind<FO>,
     frontendFacade: Constructor<FrontendFacade<FO>>,
     frontendToIrConverter: Constructor<Frontend2BackendConverter<FO, IrBackendInput>>,
-    serializerFacade: Constructor<BackendFacade<IrBackendInput, BinaryArtifacts.KLib>>,
+    serializerFacade: Constructor<AbstractKlibSerializerFacade>,
 ) {
     commonServicesConfigurationForJsCodegenTest(targetFrontend)
     facadeStep(frontendFacade)
@@ -276,7 +277,10 @@
     firHandlersStep()
 
     facadeStep(frontendToIrConverter)
-    irHandlersStep()
+    irHandlersStep {
+        useHandlers({ KlibAbiDumpBeforeInliningSavingHandler(it, serializerFacade) })
+
+    }
 
     facadeStep(::JsIrPreSerializationLoweringFacade)
     loweredIrHandlersStep()
@@ -305,7 +309,7 @@
     }
 
     configureKlibArtifactsHandlersStep {
-        useHandlers(::KlibBackendDiagnosticsHandler)
+        useHandlers(::KlibBackendDiagnosticsHandler, ::KlibAbiDumpAfterInliningVerifyingHandler)
     }
 
     useAfterAnalysisCheckers(
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrDeserializationTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrDeserializationTest.kt
index 01aa733..7a68635 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrDeserializationTest.kt
+++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrDeserializationTest.kt
@@ -12,6 +12,7 @@
 import org.jetbrains.kotlin.test.Constructor
 import org.jetbrains.kotlin.test.FirParser
 import org.jetbrains.kotlin.test.TargetBackend
+import org.jetbrains.kotlin.test.backend.AbstractKlibSerializerFacade
 import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
 import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
 import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives
@@ -39,7 +40,7 @@
     override val frontendToIrConverter: Constructor<Frontend2BackendConverter<FirOutputArtifact, IrBackendInput>>
         get() = ::Fir2IrCliWebFacade
 
-    override val serializerFacade: Constructor<BackendFacade<IrBackendInput, BinaryArtifacts.KLib>>
+    override val serializerFacade: Constructor<AbstractKlibSerializerFacade>
         get() = ::FirKlibSerializerCliWebFacade
 
     override val backendFacades: JsBackendFacades
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrTest.kt
index 2083de3..a8c7d5b 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrTest.kt
+++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrTest.kt
@@ -14,6 +14,7 @@
 import org.jetbrains.kotlin.parsing.parseBoolean
 import org.jetbrains.kotlin.test.Constructor
 import org.jetbrains.kotlin.test.TargetBackend
+import org.jetbrains.kotlin.test.backend.AbstractKlibSerializerFacade
 import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
 import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
 import org.jetbrains.kotlin.test.builders.configureJsArtifactsHandlersStep
@@ -40,7 +41,7 @@
     override val frontendToIrConverter: Constructor<Frontend2BackendConverter<ClassicFrontendOutputArtifact, IrBackendInput>>
         get() = ::ClassicFrontend2IrConverter
 
-    override val serializerFacade: Constructor<BackendFacade<IrBackendInput, BinaryArtifacts.KLib>>
+    override val serializerFacade: Constructor<AbstractKlibSerializerFacade>
         get() = ::JsKlibSerializerFacade
 
     override val backendFacades: JsBackendFacades
diff --git a/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/irText/AbstractFirNativeIrTextTestBase.kt b/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/irText/AbstractFirNativeIrTextTestBase.kt
index b225368..92a88b4 100644
--- a/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/irText/AbstractFirNativeIrTextTestBase.kt
+++ b/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/irText/AbstractFirNativeIrTextTestBase.kt
@@ -15,6 +15,7 @@
 import org.jetbrains.kotlin.test.backend.ir.KlibFacades
 import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
 import org.jetbrains.kotlin.test.configuration.additionalK2ConfigurationForIrTextTest
+import org.jetbrains.kotlin.test.directives.KlibAbiConsistencyDirectives.CHECK_SAME_ABI_AFTER_INLINING
 import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.LANGUAGE
 import org.jetbrains.kotlin.test.frontend.fir.FirFrontendFacade
 import org.jetbrains.kotlin.test.frontend.fir.FirOutputArtifact
@@ -45,6 +46,7 @@
         builder.additionalK2ConfigurationForIrTextTest(parser)
         with(builder) {
             defaultDirectives {
+                +CHECK_SAME_ABI_AFTER_INLINING
                 LANGUAGE with "+${LanguageFeature.IrInlinerBeforeKlibSerialization.name}"
             }
         }
diff --git a/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/serialization/AbstractNativeIrDeserializationTest.kt b/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/serialization/AbstractNativeIrDeserializationTest.kt
index a54f014..409bb7e 100644
--- a/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/serialization/AbstractNativeIrDeserializationTest.kt
+++ b/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/serialization/AbstractNativeIrDeserializationTest.kt
@@ -13,11 +13,14 @@
 import org.jetbrains.kotlin.test.Constructor
 import org.jetbrains.kotlin.test.FirParser
 import org.jetbrains.kotlin.test.TargetBackend
+import org.jetbrains.kotlin.test.backend.AbstractKlibSerializerFacade
 import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor
+import org.jetbrains.kotlin.test.backend.handlers.KlibAbiDumpBeforeInliningSavingHandler
 import org.jetbrains.kotlin.test.backend.handlers.IrMangledNameAndSignatureDumpHandler
 import org.jetbrains.kotlin.test.backend.handlers.KlibAbiDumpHandler
 import org.jetbrains.kotlin.test.backend.handlers.KlibBackendDiagnosticsHandler
 import org.jetbrains.kotlin.test.backend.handlers.NativeKlibInterpreterDumpHandler
+import org.jetbrains.kotlin.test.backend.handlers.KlibAbiDumpAfterInliningVerifyingHandler
 import org.jetbrains.kotlin.test.backend.handlers.SerializedIrDumpHandler
 import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
 import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
@@ -27,6 +30,7 @@
 import org.jetbrains.kotlin.test.builders.firHandlersStep
 import org.jetbrains.kotlin.test.builders.irHandlersStep
 import org.jetbrains.kotlin.test.builders.klibArtifactsHandlersStep
+import org.jetbrains.kotlin.test.builders.loweredIrHandlersStep
 import org.jetbrains.kotlin.test.directives.ConfigurationDirectives
 import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives
 import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives.DIAGNOSTICS
@@ -61,7 +65,7 @@
         get() = ::Fir2IrNativeResultsConverter
     open val irPreSerializationLoweringFacade: Constructor<IrPreSerializationLoweringFacade<IrBackendInput>>
         get() = ::NativePreSerializationLoweringFacade
-    val serializerFacade: Constructor<BackendFacade<IrBackendInput, BinaryArtifacts.KLib>>
+    val serializerFacade: Constructor<AbstractKlibSerializerFacade>
         get() = ::FirNativeKlibSerializerFacade
     val deserializerFacade: Constructor<DeserializerFacade<BinaryArtifacts.KLib, IrBackendInput>>
         get() = ::NativeDeserializerFacade
@@ -118,7 +122,7 @@
     frontendFacade: Constructor<FrontendFacade<FirOutputArtifact>>,
     frontendToIrConverter: Constructor<Frontend2BackendConverter<FirOutputArtifact, IrBackendInput>>,
     irPreSerializationLoweringFacade: Constructor<IrPreSerializationLoweringFacade<IrBackendInput>>,
-    serializerFacade: Constructor<BackendFacade<IrBackendInput, BinaryArtifacts.KLib>>,
+    serializerFacade: Constructor<AbstractKlibSerializerFacade>,
     deserializerFacade: Constructor<DeserializerFacade<BinaryArtifacts.KLib, IrBackendInput>>,
     customIgnoreDirective: ValueDirective<TargetBackend>? = null,
 ) {
@@ -161,13 +165,15 @@
 
     facadeStep(frontendToIrConverter)
 
+    irHandlersStep { useHandlers({ KlibAbiDumpBeforeInliningSavingHandler(it, serializerFacade) }) }
+
     facadeStep(irPreSerializationLoweringFacade)
 
-    irHandlersStep { useHandlers({ SerializedIrDumpHandler(it, isAfterDeserialization = false) }) }
+    loweredIrHandlersStep { useHandlers({ SerializedIrDumpHandler(it, isAfterDeserialization = false) }) }
 
     facadeStep(serializerFacade)
     klibArtifactsHandlersStep {
-        useHandlers(::KlibAbiDumpHandler)
+        useHandlers(::KlibAbiDumpHandler, ::KlibAbiDumpAfterInliningVerifyingHandler)
     }
     facadeStep(deserializerFacade)
     klibArtifactsHandlersStep {
diff --git a/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/serialization/AbstractNativeIrDeserializationWithInlinedFunInKlibTest.kt b/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/serialization/AbstractNativeIrDeserializationWithInlinedFunInKlibTest.kt
index 5ef7b05..b0a0524 100644
--- a/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/serialization/AbstractNativeIrDeserializationWithInlinedFunInKlibTest.kt
+++ b/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/serialization/AbstractNativeIrDeserializationWithInlinedFunInKlibTest.kt
@@ -7,12 +7,14 @@
 
 import org.jetbrains.kotlin.config.LanguageFeature
 import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
+import org.jetbrains.kotlin.test.directives.KlibAbiConsistencyDirectives.CHECK_SAME_ABI_AFTER_INLINING
 import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.LANGUAGE
 
 open class AbstractNativeIrDeserializationWithInlinedFunInKlibTest : AbstractNativeIrDeserializationTest() {
     override fun configure(builder: TestConfigurationBuilder) {
         super.configure(builder)
         builder.defaultDirectives {
+            +CHECK_SAME_ABI_AFTER_INLINING
             LANGUAGE with "+${LanguageFeature.IrInlinerBeforeKlibSerialization.name}"
         }
     }