From 036f9affd852c7957bbd53a239748676f85ebb4c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 12 Sep 2022 10:26:32 +0200 Subject: [PATCH] K2: link via signatures if -Xlink-via-signatures is set Related to KT-53505 --- .../FirKotlinToJvmBytecodeCompiler.kt | 6 ++-- .../jvm/compiler/pipeline/compilerPipeline.kt | 7 ++-- .../kotlin/fir/pipeline/convertToIr.kt | 33 ++++++++++++++----- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ .../directives/LanguageSettingsDirectives.kt | 1 + .../codegen/box/fir/linkViaSignatures.kt | 26 +++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ .../JvmEnvironmentConfigurator.kt | 2 ++ 8 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 compiler/testData/codegen/box/fir/linkViaSignatures.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt index 613cf51bac2..2aa4707cce0 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt @@ -46,7 +46,6 @@ import org.jetbrains.kotlin.fir.pipeline.convertToIr import org.jetbrains.kotlin.fir.pipeline.runCheckers import org.jetbrains.kotlin.fir.pipeline.runResolution import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.fir.session.FirSessionFactory import org.jetbrains.kotlin.fir.session.FirSessionFactory.createSessionWithDependencies import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment @@ -186,7 +185,10 @@ object FirKotlinToJvmBytecodeCompiler { performanceManager?.notifyIRTranslationStarted() val fir2IrExtensions = JvmFir2IrExtensions(moduleConfiguration, JvmIrDeserializerImpl(), JvmIrMangler) - val fir2IrResult = firResult.session.convertToIr(firResult.scopeSession, firResult.fir, fir2IrExtensions, irGenerationExtensions) + val linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES) + val fir2IrResult = firResult.session.convertToIr( + firResult.scopeSession, firResult.fir, fir2IrExtensions, irGenerationExtensions, linkViaSignatures + ) performanceManager?.notifyIRTranslationFinished() diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt index 48f0399643f..5f687ee6337 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt @@ -192,10 +192,13 @@ fun convertAnalyzedFirToIr( // fir2ir val irGenerationExtensions = - (environment.projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) } + (environment.projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { + IrGenerationExtension.getInstances(it) + } ?: emptyList() + val linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES) val (irModuleFragment, components) = analysisResults.session.convertToIr( - analysisResults.scopeSession, analysisResults.fir, extensions, irGenerationExtensions ?: emptyList() + analysisResults.scopeSession, analysisResults.fir, extensions, irGenerationExtensions, linkViaSignatures ) return ModuleCompilerIrBackendInput( diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt index 2630b051abb..87a34b393a0 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.pipeline import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension +import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.backend.Fir2IrConverter import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions @@ -19,6 +20,7 @@ import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl +import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl @@ -26,19 +28,32 @@ fun FirSession.convertToIr( scopeSession: ScopeSession, firFiles: List, fir2IrExtensions: Fir2IrExtensions, - irGeneratorExtensions: Collection + irGeneratorExtensions: Collection, + linkViaSignatures: Boolean ): Fir2IrResult { val commonFirFiles = moduleData.dependsOnDependencies .map { it.session } .filter { it.kind == FirSession.Kind.Source } .flatMap { (it.firProvider as FirProviderImpl).getAllFirFiles() } - return Fir2IrConverter.createModuleFragmentWithoutSignatures( - this, scopeSession, firFiles + commonFirFiles, - languageVersionSettings, fir2IrExtensions, - FirJvmKotlinMangler(this), - JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter, - Fir2IrJvmSpecialAnnotationSymbolProvider(), - irGeneratorExtensions - ) + if (linkViaSignatures) { + val signaturer = JvmIdSignatureDescriptor(mangler = JvmDescriptorMangler(mainDetector = null)) + return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded( + this, scopeSession, firFiles + commonFirFiles, + languageVersionSettings, signaturer, fir2IrExtensions, + FirJvmKotlinMangler(this), + JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter, + Fir2IrJvmSpecialAnnotationSymbolProvider(), + irGeneratorExtensions, true + ) + } else { + return Fir2IrConverter.createModuleFragmentWithoutSignatures( + this, scopeSession, firFiles + commonFirFiles, + languageVersionSettings, fir2IrExtensions, + FirJvmKotlinMangler(this), + JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter, + Fir2IrJvmSpecialAnnotationSymbolProvider(), + irGeneratorExtensions + ) + } } diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 9242cd0a596..88096ea0350 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -18073,6 +18073,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/fir/KotlinDocumentationProvider.kt"); } + @Test + @TestMetadata("linkViaSignatures.kt") + public void testLinkViaSignatures() throws Exception { + runTest("compiler/testData/codegen/box/fir/linkViaSignatures.kt"); + } + @Test @TestMetadata("LookupTags.kt") public void testLookupTags() throws Exception { diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/LanguageSettingsDirectives.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/LanguageSettingsDirectives.kt index e94b4f35764..dca343a808b 100644 --- a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/LanguageSettingsDirectives.kt +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/LanguageSettingsDirectives.kt @@ -76,6 +76,7 @@ object LanguageSettingsDirectives : SimpleDirectivesContainer() { val USE_TYPE_TABLE by directive("Use type table in metadata serialization") val NO_NEW_JAVA_ANNOTATION_TARGETS by directive("Do not generate Java annotation targets TYPE_USE/TYPE_PARAMETER for Kotlin annotation classes with Kotlin targets TYPE/TYPE_PARAMETER") val OLD_INNER_CLASSES_LOGIC by directive("Use old logic for generation of InnerClasses attributes") + val LINK_VIA_SIGNATURES by directive("Use linkage via signatures instead of descriptors / FIR") // --------------------- Utils --------------------- diff --git a/compiler/testData/codegen/box/fir/linkViaSignatures.kt b/compiler/testData/codegen/box/fir/linkViaSignatures.kt new file mode 100644 index 00000000000..b116c806580 --- /dev/null +++ b/compiler/testData/codegen/box/fir/linkViaSignatures.kt @@ -0,0 +1,26 @@ +// WITH_STDLIB +// TARGET_BACKEND: JVM_IR +// LINK_VIA_SIGNATURES + +class Class +interface Interface +sealed class Sealed +enum class E { ENTRY } + +fun function(s: String): Array { + fun Boolean.local() {} + return arrayOf(s.length) +} +typealias S = String +var property: S? = "OK" + +fun box(): String { + val c = Class() + val o = object : Interface {} + if (property != "OK") return property!! + if (E.ENTRY.ordinal != 0) return E.ENTRY.ordinal.toString() + val result = function("AlphaBeta") + if (result.size != 1) return result.size.toString() + if (result[0] != 9) return result[0].toString() + return "OK" +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 7258343eed7..11c38c0ead0 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -18073,6 +18073,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fir/KotlinDocumentationProvider.kt"); } + @Test + @TestMetadata("linkViaSignatures.kt") + public void testLinkViaSignatures() throws Exception { + runTest("compiler/testData/codegen/box/fir/linkViaSignatures.kt"); + } + @Test @TestMetadata("LookupTags.kt") public void testLookupTags() throws Exception { diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt index eae4e1cde62..127169f070e 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.NO_OPTIMI import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.NO_UNIFIED_NULL_CHECKS import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.PARAMETERS_METADATA import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.JDK_RELEASE +import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.LINK_VIA_SIGNATURES import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.NO_NEW_JAVA_ANNOTATION_TARGETS import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.OLD_INNER_CLASSES_LOGIC import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.USE_TYPE_TABLE @@ -177,6 +178,7 @@ class JvmEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfig register(ENABLE_DEBUG_MODE, JVMConfigurationKeys.ENABLE_DEBUG_MODE) register(NO_NEW_JAVA_ANNOTATION_TARGETS, JVMConfigurationKeys.NO_NEW_JAVA_ANNOTATION_TARGETS) register(OLD_INNER_CLASSES_LOGIC, JVMConfigurationKeys.OLD_INNER_CLASSES_LOGIC) + register(LINK_VIA_SIGNATURES, JVMConfigurationKeys.LINK_VIA_SIGNATURES) } override fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule) {