K2: link via signatures if -Xlink-via-signatures is set

Related to KT-53505
This commit is contained in:
Mikhail Glukhikh
2022-09-12 10:26:32 +02:00
committed by Space
parent a0fa2cc275
commit 036f9affd8
8 changed files with 74 additions and 13 deletions
@@ -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()
@@ -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(
@@ -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<FirFile>,
fir2IrExtensions: Fir2IrExtensions,
irGeneratorExtensions: Collection<IrGenerationExtension>
irGeneratorExtensions: Collection<IrGenerationExtension>,
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
)
}
}
@@ -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 {
@@ -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 ---------------------
+26
View File
@@ -0,0 +1,26 @@
// WITH_STDLIB
// TARGET_BACKEND: JVM_IR
// LINK_VIA_SIGNATURES
class Class
interface Interface
sealed class Sealed<T>
enum class E { ENTRY }
fun function(s: String): Array<Int> {
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"
}
@@ -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 {
@@ -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) {