K2: link via signatures if -Xlink-via-signatures is set
Related to KT-53505
This commit is contained in:
+4
-2
@@ -46,7 +46,6 @@ import org.jetbrains.kotlin.fir.pipeline.convertToIr
|
|||||||
import org.jetbrains.kotlin.fir.pipeline.runCheckers
|
import org.jetbrains.kotlin.fir.pipeline.runCheckers
|
||||||
import org.jetbrains.kotlin.fir.pipeline.runResolution
|
import org.jetbrains.kotlin.fir.pipeline.runResolution
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
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.FirSessionFactory.createSessionWithDependencies
|
||||||
import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext
|
import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext
|
||||||
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
|
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
|
||||||
@@ -186,7 +185,10 @@ object FirKotlinToJvmBytecodeCompiler {
|
|||||||
performanceManager?.notifyIRTranslationStarted()
|
performanceManager?.notifyIRTranslationStarted()
|
||||||
|
|
||||||
val fir2IrExtensions = JvmFir2IrExtensions(moduleConfiguration, JvmIrDeserializerImpl(), JvmIrMangler)
|
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()
|
performanceManager?.notifyIRTranslationFinished()
|
||||||
|
|
||||||
|
|||||||
@@ -192,10 +192,13 @@ fun convertAnalyzedFirToIr(
|
|||||||
|
|
||||||
// fir2ir
|
// fir2ir
|
||||||
val irGenerationExtensions =
|
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) =
|
val (irModuleFragment, components) =
|
||||||
analysisResults.session.convertToIr(
|
analysisResults.session.convertToIr(
|
||||||
analysisResults.scopeSession, analysisResults.fir, extensions, irGenerationExtensions ?: emptyList()
|
analysisResults.scopeSession, analysisResults.fir, extensions, irGenerationExtensions, linkViaSignatures
|
||||||
)
|
)
|
||||||
|
|
||||||
return ModuleCompilerIrBackendInput(
|
return ModuleCompilerIrBackendInput(
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.fir.pipeline
|
package org.jetbrains.kotlin.fir.pipeline
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
|
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.FirSession
|
||||||
import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
|
import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
|
||||||
import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions
|
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.ScopeSession
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
|
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.backend.jvm.serialization.JvmIrMangler
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
||||||
|
|
||||||
@@ -26,19 +28,32 @@ fun FirSession.convertToIr(
|
|||||||
scopeSession: ScopeSession,
|
scopeSession: ScopeSession,
|
||||||
firFiles: List<FirFile>,
|
firFiles: List<FirFile>,
|
||||||
fir2IrExtensions: Fir2IrExtensions,
|
fir2IrExtensions: Fir2IrExtensions,
|
||||||
irGeneratorExtensions: Collection<IrGenerationExtension>
|
irGeneratorExtensions: Collection<IrGenerationExtension>,
|
||||||
|
linkViaSignatures: Boolean
|
||||||
): Fir2IrResult {
|
): Fir2IrResult {
|
||||||
val commonFirFiles = moduleData.dependsOnDependencies
|
val commonFirFiles = moduleData.dependsOnDependencies
|
||||||
.map { it.session }
|
.map { it.session }
|
||||||
.filter { it.kind == FirSession.Kind.Source }
|
.filter { it.kind == FirSession.Kind.Source }
|
||||||
.flatMap { (it.firProvider as FirProviderImpl).getAllFirFiles() }
|
.flatMap { (it.firProvider as FirProviderImpl).getAllFirFiles() }
|
||||||
|
|
||||||
return Fir2IrConverter.createModuleFragmentWithoutSignatures(
|
if (linkViaSignatures) {
|
||||||
this, scopeSession, firFiles + commonFirFiles,
|
val signaturer = JvmIdSignatureDescriptor(mangler = JvmDescriptorMangler(mainDetector = null))
|
||||||
languageVersionSettings, fir2IrExtensions,
|
return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded(
|
||||||
FirJvmKotlinMangler(this),
|
this, scopeSession, firFiles + commonFirFiles,
|
||||||
JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter,
|
languageVersionSettings, signaturer, fir2IrExtensions,
|
||||||
Fir2IrJvmSpecialAnnotationSymbolProvider(),
|
FirJvmKotlinMangler(this),
|
||||||
irGeneratorExtensions
|
JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter,
|
||||||
)
|
Fir2IrJvmSpecialAnnotationSymbolProvider(),
|
||||||
|
irGeneratorExtensions, true
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return Fir2IrConverter.createModuleFragmentWithoutSignatures(
|
||||||
|
this, scopeSession, firFiles + commonFirFiles,
|
||||||
|
languageVersionSettings, fir2IrExtensions,
|
||||||
|
FirJvmKotlinMangler(this),
|
||||||
|
JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter,
|
||||||
|
Fir2IrJvmSpecialAnnotationSymbolProvider(),
|
||||||
|
irGeneratorExtensions
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
@@ -18073,6 +18073,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/fir/KotlinDocumentationProvider.kt");
|
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
|
@Test
|
||||||
@TestMetadata("LookupTags.kt")
|
@TestMetadata("LookupTags.kt")
|
||||||
public void testLookupTags() throws Exception {
|
public void testLookupTags() throws Exception {
|
||||||
|
|||||||
+1
@@ -76,6 +76,7 @@ object LanguageSettingsDirectives : SimpleDirectivesContainer() {
|
|||||||
val USE_TYPE_TABLE by directive("Use type table in metadata serialization")
|
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 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 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 ---------------------
|
// --------------------- Utils ---------------------
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
}
|
||||||
+6
@@ -18073,6 +18073,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/fir/KotlinDocumentationProvider.kt");
|
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
|
@Test
|
||||||
@TestMetadata("LookupTags.kt")
|
@TestMetadata("LookupTags.kt")
|
||||||
public void testLookupTags() throws Exception {
|
public void testLookupTags() throws Exception {
|
||||||
|
|||||||
+2
@@ -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.NO_UNIFIED_NULL_CHECKS
|
||||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.PARAMETERS_METADATA
|
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.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.NO_NEW_JAVA_ANNOTATION_TARGETS
|
||||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.OLD_INNER_CLASSES_LOGIC
|
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.OLD_INNER_CLASSES_LOGIC
|
||||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.USE_TYPE_TABLE
|
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(ENABLE_DEBUG_MODE, JVMConfigurationKeys.ENABLE_DEBUG_MODE)
|
||||||
register(NO_NEW_JAVA_ANNOTATION_TARGETS, JVMConfigurationKeys.NO_NEW_JAVA_ANNOTATION_TARGETS)
|
register(NO_NEW_JAVA_ANNOTATION_TARGETS, JVMConfigurationKeys.NO_NEW_JAVA_ANNOTATION_TARGETS)
|
||||||
register(OLD_INNER_CLASSES_LOGIC, JVMConfigurationKeys.OLD_INNER_CLASSES_LOGIC)
|
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) {
|
override fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule) {
|
||||||
|
|||||||
Reference in New Issue
Block a user