From 9943c7078c1b4456e8f210bf27fb0a34c8545edb Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sun, 17 Sep 2023 00:14:28 +0200 Subject: [PATCH] JVM: add more flags to JvmBackendConfig And use them instead of CompilerConfiguration, to reduce dependencies of backend on the whole compiler (as opposed to just backend) configuration. --- .../kotlin/codegen/AnnotationCodegen.java | 5 +- .../kotlin/codegen/state/JvmBackendConfig.kt | 8 +++ .../backend/jvm/codegen/AnnotationCodegen.kt | 52 ++++++++++--------- .../backend/jvm/codegen/CoroutineCodegen.kt | 13 +++-- .../kotlin/backend/jvm/JvmLoweringPhases.kt | 13 ++--- ...SuperQualifierToJavaFieldAccessLowering.kt | 8 +-- .../ExternalPackageParentPatcherLowering.kt | 17 ++---- 7 files changed, 56 insertions(+), 60 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java index 10d7955ab07..d985b3b8c72 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java @@ -21,7 +21,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper; -import org.jetbrains.kotlin.config.JVMConfigurationKeys; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; @@ -715,9 +714,7 @@ public abstract class AnnotationCodegen { } private void generateTypeAnnotations(@NotNull Annotated annotated, @Nullable KotlinType type) { - if (isAccessor(annotated) || - type == null || - !state.getConfiguration().getBoolean(JVMConfigurationKeys.EMIT_JVM_TYPE_ANNOTATIONS)) { + if (isAccessor(annotated) || type == null || !state.getConfig().getEmitJvmTypeAnnotations()) { return; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JvmBackendConfig.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JvmBackendConfig.kt index ef3b4bfb6fb..9044a2efd1c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JvmBackendConfig.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JvmBackendConfig.kt @@ -102,4 +102,12 @@ class JvmBackendConfig(configuration: CompilerConfiguration) { val oldInnerClassesLogic: Boolean = configuration.getBoolean(JVMConfigurationKeys.OLD_INNER_CLASSES_LOGIC) val supportMultiFieldValueClasses: Boolean = languageVersionSettings.supportsFeature(LanguageFeature.ValueClasses) + + val enableDebugMode: Boolean = configuration.getBoolean(JVMConfigurationKeys.ENABLE_DEBUG_MODE) + + val enableIrInliner: Boolean = configuration.getBoolean(JVMConfigurationKeys.ENABLE_IR_INLINER) + + val useFir: Boolean = configuration.getBoolean(CommonConfigurationKeys.USE_FIR) + + val emitJvmTypeAnnotations: Boolean = configuration.getBoolean(JVMConfigurationKeys.EMIT_JVM_TYPE_ANNOTATIONS) } diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt index 47b27ad08d4..47326a8b8be 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt @@ -21,13 +21,15 @@ import org.jetbrains.annotations.Nullable import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.JvmSymbols -import org.jetbrains.kotlin.backend.jvm.ir.* +import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound +import org.jetbrains.kotlin.backend.jvm.ir.isInlineClassType +import org.jetbrains.kotlin.backend.jvm.ir.isOptionalAnnotationClass +import org.jetbrains.kotlin.backend.jvm.ir.isWithFlexibleNullability import org.jetbrains.kotlin.backend.jvm.mapping.mapClass import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.TypeAnnotationCollector import org.jetbrains.kotlin.codegen.TypePathInfo -import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.annotations.KotlinRetention import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget @@ -311,29 +313,29 @@ abstract class AnnotationCodegen( } }.genAnnotations(typeParameter, null, null) - if (context.state.configuration.getBoolean(JVMConfigurationKeys.EMIT_JVM_TYPE_ANNOTATIONS)) { - var superInterfaceIndex = 1 - typeParameter.superTypes.forEach { superType -> - val isClassOrTypeParameter = !superType.isInterface() && !superType.isAnnotation() - val superIndex = if (isClassOrTypeParameter) 0 else superInterfaceIndex++ - object : AnnotationCodegen(classCodegen, true) { - override fun visitAnnotation(descr: String, visible: Boolean): AnnotationVisitor { - throw RuntimeException( - "Error during generation: only type annotations should be presented on type parameters bounds: " + - "${ir2string(typeParameter)} in ${ir2string(typeParameter)}" - ) - } + if (!context.config.emitJvmTypeAnnotations) return - override fun visitTypeAnnotation(descr: String, path: TypePath?, visible: Boolean): AnnotationVisitor { - return visitor( - TypeReference.newTypeParameterBoundReference(boundType, index, superIndex).value, - path, - descr, - visible - ) - } - }.generateTypeAnnotations(typeParameterContainer, superType) - } + var superInterfaceIndex = 1 + typeParameter.superTypes.forEach { superType -> + val isClassOrTypeParameter = !superType.isInterface() && !superType.isAnnotation() + val superIndex = if (isClassOrTypeParameter) 0 else superInterfaceIndex++ + object : AnnotationCodegen(classCodegen, true) { + override fun visitAnnotation(descr: String, visible: Boolean): AnnotationVisitor { + throw RuntimeException( + "Error during generation: only type annotations should be presented on type parameters bounds: " + + "${ir2string(typeParameter)} in ${ir2string(typeParameter)}" + ) + } + + override fun visitTypeAnnotation(descr: String, path: TypePath?, visible: Boolean): AnnotationVisitor { + return visitor( + TypeReference.newTypeParameterBoundReference(boundType, index, superIndex).value, + path, + descr, + visible + ) + } + }.generateTypeAnnotations(typeParameterContainer, superType) } } } @@ -398,7 +400,7 @@ abstract class AnnotationCodegen( type: IrType? ) { if ((annotated as? IrDeclaration)?.origin == JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR || - type == null || !context.state.configuration.getBoolean(JVMConfigurationKeys.EMIT_JVM_TYPE_ANNOTATIONS) + type == null || !context.config.emitJvmTypeAnnotations ) { return } diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt index 4128791539b..a27c8caa787 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt @@ -7,11 +7,13 @@ package org.jetbrains.kotlin.backend.jvm.codegen import org.jetbrains.kotlin.backend.jvm.InlineClassAbi import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin -import org.jetbrains.kotlin.backend.jvm.ir.* +import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound +import org.jetbrains.kotlin.backend.jvm.ir.hasContinuation +import org.jetbrains.kotlin.backend.jvm.ir.isReadOfCrossinline +import org.jetbrains.kotlin.backend.jvm.ir.suspendFunctionOriginal import org.jetbrains.kotlin.backend.jvm.unboxInlineClass import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.coroutines.CoroutineTransformerMethodVisitor -import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrBlockBody @@ -19,7 +21,10 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrGetValue import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.types.* -import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.util.allOverridden +import org.jetbrains.kotlin.ir.util.file +import org.jetbrains.kotlin.ir.util.isSuspend +import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmBackendErrors import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.Type @@ -66,7 +71,7 @@ internal fun MethodNode.acceptWithStateMachine( internalNameForDispatchReceiver = classCodegen.type.internalName, putContinuationParameterToLvt = false, initialVarsCountByType = varsCountByType, - shouldOptimiseUnusedVariables = !context.configuration.getBoolean(JVMConfigurationKeys.ENABLE_DEBUG_MODE) + shouldOptimiseUnusedVariables = !context.config.enableDebugMode ) accept(visitor) } diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt index 0e0176556c1..14f9418d0f1 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt @@ -16,8 +16,6 @@ import org.jetbrains.kotlin.backend.common.phaser.* import org.jetbrains.kotlin.backend.jvm.ir.constantValue import org.jetbrains.kotlin.backend.jvm.ir.shouldContainSuspendMarkers import org.jetbrains.kotlin.backend.jvm.lower.* -import org.jetbrains.kotlin.config.CommonConfigurationKeys -import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibility import org.jetbrains.kotlin.ir.IrElement @@ -58,9 +56,8 @@ private fun makeCheckParentsPhase(): SameTypeNamedCompilerPhase - if (context.state.configuration.getBoolean(CommonConfigurationKeys.USE_FIR)) - FileLoweringPass.Empty - else - ExpectDeclarationRemover(context) + if (context.config.useFir) FileLoweringPass.Empty + else ExpectDeclarationRemover(context) }, name = "ExpectDeclarationsRemoving", description = "Remove expect declaration from module fragment" diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddSuperQualifierToJavaFieldAccessLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddSuperQualifierToJavaFieldAccessLowering.kt index 0d74ef23574..d625964097a 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddSuperQualifierToJavaFieldAccessLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddSuperQualifierToJavaFieldAccessLowering.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound -import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrField @@ -24,11 +23,8 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid internal val addSuperQualifierToJavaFieldAccessPhase = makeIrFilePhase( { context -> - if (context.state.configuration.getBoolean(CommonConfigurationKeys.USE_FIR)) { - AddSuperQualifierToJavaFieldAccessLowering - } else { - FileLoweringPass.Empty - } + if (context.config.useFir) AddSuperQualifierToJavaFieldAccessLowering + else FileLoweringPass.Empty }, name = "AddSuperQualifierToJavaFieldAccess", description = "Make `\$delegate` methods for optimized delegated properties static", diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ExternalPackageParentPatcherLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ExternalPackageParentPatcherLowering.kt index f97fc1bd461..dfe95189f7b 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ExternalPackageParentPatcherLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ExternalPackageParentPatcherLowering.kt @@ -5,12 +5,10 @@ package org.jetbrains.kotlin.backend.jvm.lower -import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmFileFacadeClass -import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression @@ -20,20 +18,15 @@ import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.load.kotlin.FacadeClassSource -internal val externalPackageParentPatcherPhase = makeIrModulePhase( - ::createLowering, +internal val externalPackageParentPatcherPhase = makeIrModulePhase( + { context -> + if (context.config.useFir) ExternalPackageParentPatcherLowering(context) + else FileLoweringPass.Empty + }, name = "ExternalPackageParentPatcherLowering", description = "Replace parent from package fragment to FileKt class for top-level callables (K2 only)" ) -private fun createLowering(context: CommonBackendContext): FileLoweringPass { - require(context is JvmBackendContext) - return when (context.configuration[CommonConfigurationKeys.USE_FIR]) { - true -> ExternalPackageParentPatcherLowering(context) - false, null -> FileLoweringPass.Empty - } -} - class ExternalPackageParentPatcherLowering(val context: JvmBackendContext) : FileLoweringPass { override fun lower(irFile: IrFile) { irFile.acceptVoid(Visitor())