From 0b70b7904d27d6843fea65e4b612ddac0df1a689 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Thu, 6 Apr 2023 11:06:21 +0200 Subject: [PATCH] [K2] Create and add `EvaluatedConstTracker` in configuration --- .../kotlin/cli/js/klib/compilerPipeline.kt | 5 ++++- .../compiler/FirKotlinToJvmBytecodeCompiler.kt | 5 ++++- .../jvm/compiler/pipeline/compilerPipeline.kt | 5 ++++- .../kotlin/config/CompilerConfiguration.java | 9 +++++++++ .../kotlin/fir/backend/Fir2IrConfiguration.kt | 2 +- .../kotlin/fir/backend/Fir2IrConverter.kt | 8 +++++--- .../IncrementalFirJvmCompilerRunner.kt | 5 ++++- .../frontend/fir/Fir2IrJsResultsConverter.kt | 6 +++++- .../test/frontend/fir/FirFrontendFacade.kt | 10 ++++++++-- .../ir/interpreter/AbstractIrInterpreterTest.kt | 16 ++++++++-------- .../jetbrains/kotlin/codegen/GenerationUtils.kt | 5 ++++- .../kotlin/constant/EvaluatedConstTracker.kt | 13 ++++++++++++- .../org/jetbrains/kotlin/backend/konan/Fir2Ir.kt | 6 +++++- 13 files changed, 73 insertions(+), 22 deletions(-) diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt index 94c7db70752..9441ed947bf 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.prepareJsSessions import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.languageVersionSettings +import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.diagnostics.impl.PendingDiagnosticsCollectorWithSuppress @@ -132,7 +133,9 @@ fun transformFirToIr( fir2IrExtensions, Fir2IrConfiguration( languageVersionSettings = moduleStructure.compilerConfiguration.languageVersionSettings, - linkViaSignatures = false + linkViaSignatures = false, + evaluatedConstTracker = moduleStructure.compilerConfiguration + .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), ), IrGenerationExtension.getInstances(moduleStructure.project), signatureComposerCreator = null, 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 c6dcecc0211..461fc536c62 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 @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.fir.* @@ -155,7 +156,9 @@ object FirKotlinToJvmBytecodeCompiler { val fir2IrExtensions = JvmFir2IrExtensions(moduleConfiguration, JvmIrDeserializerImpl(), JvmIrMangler) val fir2IrConfiguration = Fir2IrConfiguration( languageVersionSettings = moduleConfiguration.languageVersionSettings, - linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES) + linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES), + evaluatedConstTracker = moduleConfiguration + .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), ) val fir2IrAndIrActualizerResult = firResult.convertToIrAndActualizeForJvm( fir2IrExtensions, 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 54949562e78..a1a8e7a67bc 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 @@ -43,6 +43,7 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.languageVersionSettings +import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.fir.FirSession @@ -233,7 +234,9 @@ fun convertAnalyzedFirToIr( } ?: emptyList() val fir2IrConfiguration = Fir2IrConfiguration( languageVersionSettings = input.configuration.languageVersionSettings, - linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES) + linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES), + evaluatedConstTracker = input.configuration + .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), ) val (irModuleFragment, components, pluginContext, irActualizedResult) = analysisResults.convertToIrAndActualizeForJvm( diff --git a/compiler/config/src/org/jetbrains/kotlin/config/CompilerConfiguration.java b/compiler/config/src/org/jetbrains/kotlin/config/CompilerConfiguration.java index 24e579c7105..a4fc2bcf688 100644 --- a/compiler/config/src/org/jetbrains/kotlin/config/CompilerConfiguration.java +++ b/compiler/config/src/org/jetbrains/kotlin/config/CompilerConfiguration.java @@ -73,6 +73,15 @@ public class CompilerConfiguration { map.put(key.ideaKey, value); } + public T putIfAbsent(@NotNull CompilerConfigurationKey key, @NotNull T value) { + T data = get(key); + if (data != null) return data; + + checkReadOnly(); + put(key, value); + return value; + } + public void putIfNotNull(@NotNull CompilerConfigurationKey key, @Nullable T value) { if (value != null) { put(key, value); diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConfiguration.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConfiguration.kt index 7b4bac4c0c2..d88253799fd 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConfiguration.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConfiguration.kt @@ -22,5 +22,5 @@ import org.jetbrains.kotlin.constant.EvaluatedConstTracker data class Fir2IrConfiguration( val languageVersionSettings: LanguageVersionSettings, val linkViaSignatures: Boolean, - val evaluatedConstTracker: EvaluatedConstTracker? = null, + val evaluatedConstTracker: EvaluatedConstTracker, ) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index 2da0f6b2a1e..ee8cc599070 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -98,7 +98,7 @@ class Fir2IrConverter( } } - evaluateConstants(irModuleFragment) + evaluateConstants(irModuleFragment, configuration) if (irGenerationExtensions.isNotEmpty()) { val pluginContext = Fir2IrPluginContext(components, irModuleFragment.descriptor) @@ -419,7 +419,7 @@ class Fir2IrConverter( } companion object { - private fun evaluateConstants(irModuleFragment: IrModuleFragment) { + private fun evaluateConstants(irModuleFragment: IrModuleFragment, fir2IrConfiguration: Fir2IrConfiguration) { val firModuleDescriptor = irModuleFragment.descriptor as? FirModuleDescriptor val targetPlatform = firModuleDescriptor?.platform val languageVersionSettings = firModuleDescriptor?.session?.languageVersionSettings @@ -433,7 +433,9 @@ class Fir2IrConverter( val mode = if (intrinsicConstEvaluation) EvaluationMode.ONLY_INTRINSIC_CONST else EvaluationMode.ONLY_BUILTINS irModuleFragment.files.forEach { val transformer = IrConstTransformer( - interpreter, it, mode = mode + interpreter, it, + mode = mode, + evaluatedConstTracker = fir2IrConfiguration.evaluatedConstTracker ) it.transformChildren(transformer, null) } diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt index 08225a65de9..f4f14f7c5b5 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.* import org.jetbrains.kotlin.cli.jvm.config.* import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions @@ -276,7 +277,9 @@ class IncrementalFirJvmCompilerRunner( val extensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler) val fir2IrConfiguration = Fir2IrConfiguration( languageVersionSettings = configuration.languageVersionSettings, - linkViaSignatures = false + linkViaSignatures = false, + evaluatedConstTracker = configuration + .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), ) val irGenerationExtensions = (projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) }.orEmpty() diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt index eaa06d2cb11..250b4bfb86b 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt @@ -9,9 +9,11 @@ import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings +import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory @@ -149,7 +151,9 @@ fun AbstractFirAnalyzerFacade.convertToJsIr( val fir2IrConfiguration = Fir2IrConfiguration( languageVersionSettings = configuration.languageVersionSettings, - linkViaSignatures = false + linkViaSignatures = false, + evaluatedConstTracker = configuration + .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), ) return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded( session, scopeSession, firFiles.toList(), diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt index 786647f2c90..6c29fd38515 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt @@ -17,7 +17,11 @@ import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM import org.jetbrains.kotlin.cli.jvm.compiler.VfsBasedProjectEnvironment import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots -import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.config.CommonConfigurationKeys +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.container.topologicalSort import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration @@ -306,7 +310,9 @@ open class FirFrontendFacade( moduleBasedSession, Fir2IrConfiguration( languageVersionSettings = module.languageVersionSettings, - linkViaSignatures = module.targetBackend == TargetBackend.JVM_IR_SERIALIZE + linkViaSignatures = module.targetBackend == TargetBackend.JVM_IR_SERIALIZE, + evaluatedConstTracker = compilerConfigurationProvider.getCompilerConfiguration(module) + .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), ), ktFiles, lightTreeFiles, diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/ir/interpreter/AbstractIrInterpreterTest.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/ir/interpreter/AbstractIrInterpreterTest.kt index 26c0233b374..71b754c56e6 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/ir/interpreter/AbstractIrInterpreterTest.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/ir/interpreter/AbstractIrInterpreterTest.kt @@ -5,9 +5,8 @@ package org.jetbrains.kotlin.test.runners.ir.interpreter -import org.jetbrains.kotlin.config.AnalysisFlag -import org.jetbrains.kotlin.config.AnalysisFlags -import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.TargetBackend @@ -18,13 +17,9 @@ import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirective import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives import org.jetbrains.kotlin.test.directives.configureFirParser import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives -import org.jetbrains.kotlin.test.model.BinaryKind -import org.jetbrains.kotlin.test.model.DependencyKind -import org.jetbrains.kotlin.test.model.FrontendKind -import org.jetbrains.kotlin.test.model.FrontendKinds +import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.preprocessors.IrInterpreterImplicitKotlinImports import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest -import org.jetbrains.kotlin.test.runners.codegen.FirPsiCodegenTest import org.jetbrains.kotlin.test.services.EnvironmentConfigurator import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator @@ -102,4 +97,9 @@ class IrInterpreterEnvironmentConfigurator(testServices: TestServices) : Environ ): Map, Any?> { return mapOf(AnalysisFlags.builtInsFromSources to true) } + + override fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule) { + super.configureCompilerConfiguration(configuration, module) + configuration.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()) + } } diff --git a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt index 5fad3b9bdbe..482dab42f4e 100644 --- a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt +++ b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.languageVersionSettings +import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.fir.FirAnalyzerFacade import org.jetbrains.kotlin.fir.FirTestSessionFactoryHelper import org.jetbrains.kotlin.fir.backend.Fir2IrCommonMemberStorage @@ -124,7 +125,9 @@ object GenerationUtils { session, Fir2IrConfiguration( languageVersionSettings = configuration.languageVersionSettings, - linkViaSignatures = false + linkViaSignatures = false, + evaluatedConstTracker = configuration + .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), ), files, emptyList(), diff --git a/core/compiler.common/src/org/jetbrains/kotlin/constant/EvaluatedConstTracker.kt b/core/compiler.common/src/org/jetbrains/kotlin/constant/EvaluatedConstTracker.kt index eef2589d339..a7afe407d1d 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/constant/EvaluatedConstTracker.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/constant/EvaluatedConstTracker.kt @@ -10,9 +10,20 @@ import java.util.concurrent.ConcurrentHashMap abstract class EvaluatedConstTracker { abstract fun save(start: Int, end: Int, constant: ConstantValue<*>) abstract fun load(start: Int, end: Int): ConstantValue<*>? + + companion object { + /** + * Right now there are two places where we want to create this tracker. + * 1. Right before `fir2ir` phase. We need to store evaluated values to use them later in const value serialization. + * 2. In interpreter's tests for all IR backends. This is needed ONLY for tests and cover case when we run K1 IR compiler. + */ + fun create(): EvaluatedConstTracker { + return DefaultEvaluatedConstTracker() + } + } } -class DefaultEvaluatedConstTracker : EvaluatedConstTracker() { +private class DefaultEvaluatedConstTracker : EvaluatedConstTracker() { private val storage = ConcurrentHashMap, ConstantValue<*>>() override fun save(start: Int, end: Int, constant: ConstantValue<*>) { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt index a06ac7f0732..e0d46d66d38 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt @@ -15,7 +15,9 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter +import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.languageVersionSettings +import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer import org.jetbrains.kotlin.descriptors.isEmpty import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib @@ -75,7 +77,9 @@ internal fun PhaseContext.fir2Ir( fir2IrExtensions, Fir2IrConfiguration( languageVersionSettings = configuration.languageVersionSettings, - linkViaSignatures = false + linkViaSignatures = false, + evaluatedConstTracker = configuration + .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), ), IrGenerationExtension.getInstances(config.project), signatureComposerCreator = null,