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}"
}
}