From 1d38c01afc4dc429553608884dcf9aa636c74b54 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 7 Mar 2024 14:05:14 +0100 Subject: [PATCH] IR: remove some usages of deepCopyWithVariables At this point, `deepCopyWithVariables` is the same as `deepCopyWithSymbols` except that the former doesn't call `patchDeclarationParents`, which most likely produces incorrect IR in some call sites. --- .../common/lower/FinallyBlocksLowering.kt | 7 +++--- .../backend/common/lower/TailrecLowering.kt | 7 +++--- .../SaveInlineFunctionsBeforeInlining.kt | 7 ++---- .../org/jetbrains/kotlin/ir/util/IrUtils.kt | 6 ++--- .../lower/NativeInlineFunctionResolver.kt | 4 +--- .../compiler/backend/ir/BaseIrGenerator.kt | 10 ++------- .../backend/ir/IrBuilderWithPluginContext.kt | 22 +++++++++++-------- .../backend/ir/SerializerForEnumsGenerator.kt | 8 ++----- 8 files changed, 28 insertions(+), 43 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt index c7afb6e3717..d39ae2f6413 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildVariable import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol @@ -23,7 +22,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.isNothing import org.jetbrains.kotlin.ir.types.isUnit -import org.jetbrains.kotlin.ir.util.setDeclarationsParent +import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.Name @@ -290,7 +289,7 @@ class FinallyBlocksLowering(val context: CommonBackendContext, private val throw } private inline fun IrBuilderWithScope.copy(element: T) = - element.deepCopyWithVariables().setDeclarationsParent(parent) + element.deepCopyWithSymbols(parent) fun IrBuilderWithScope.irReturn(target: IrReturnTargetSymbol, value: IrExpression) = IrReturnImpl(startOffset, endOffset, context.irBuiltIns.nothingType, target, value) @@ -301,4 +300,4 @@ class FinallyBlocksLowering(val context: CommonBackendContext, private val throw IrBlockBuilder(context, scope, startOffset, endOffset, null, type, true) .block(body).statements ) -} \ No newline at end of file +} diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt index a3eb6817575..459457c80c6 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.BackendContext import org.jetbrains.kotlin.backend.common.BodyLoweringPass import org.jetbrains.kotlin.backend.common.collectTailRecursionCalls -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* @@ -29,6 +28,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol import org.jetbrains.kotlin.ir.transformStatement import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.explicitParameters import org.jetbrains.kotlin.ir.util.getArgumentsWithIr import org.jetbrains.kotlin.ir.util.patchDeclarationParents @@ -40,7 +40,6 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid * This pass lowers tail recursion calls in `tailrec` functions. * * Note: it currently can't handle local functions and classes declared in default arguments. - * See [deepCopyWithVariables]. */ open class TailrecLowering(val context: BackendContext) : BodyLoweringPass { override fun lower(irBody: IrBody, container: IrDeclaration) { @@ -174,7 +173,7 @@ private class BodyTransformer( defaultValuedParameters.let { if (lowering.useProperComputationOrderOfTailrecDefaultParameters) it else it.asReversed() } .associateWithTo(parameterToArgument) { parameter -> val originalDefaultValue = parameter.defaultValue?.expression ?: throw Error("no argument specified for $parameter") - irTemporary(originalDefaultValue.deepCopyWithVariables().patchDeclarationParents(parent).transform(remapper, null)) + irTemporary(originalDefaultValue.deepCopyWithSymbols(parent).transform(remapper, null)) } // Copy the new `val`s into the `var`s declared outside the loop: @@ -194,4 +193,4 @@ private fun IrValueParameterSymbol.suggestVariableName(): String = "$" + oldNameStr.substring(1, oldNameStr.length - 1) } else { owner.name.identifier - } \ No newline at end of file + } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SaveInlineFunctionsBeforeInlining.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SaveInlineFunctionsBeforeInlining.kt index d9e84e2b5e6..e3f4f9621aa 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SaveInlineFunctionsBeforeInlining.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SaveInlineFunctionsBeforeInlining.kt @@ -9,19 +9,16 @@ import org.jetbrains.kotlin.backend.common.DeclarationTransformer import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.inline.InlineFunctionResolverReplacingCoroutineIntrinsics import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol -import org.jetbrains.kotlin.ir.util.patchDeclarationParents +import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols internal class SaveInlineFunctionsBeforeInlining(context: JsIrBackendContext) : DeclarationTransformer { private val inlineFunctionsBeforeInlining = context.mapping.inlineFunctionsBeforeInlining override fun transformFlat(declaration: IrDeclaration): List? { if (declaration is IrFunction && declaration.isInline) { - inlineFunctionsBeforeInlining[declaration] = declaration.deepCopyWithVariables().also { - it.patchDeclarationParents(declaration.parent) - } + inlineFunctionsBeforeInlining[declaration] = declaration.deepCopyWithSymbols(declaration.parent) } return null diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 5bf452d4a6f..5b568e2eaf4 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -921,10 +921,8 @@ fun IrValueParameter.copyTo( factory.createExpressionBody( startOffset = originalDefault.startOffset, endOffset = originalDefault.endOffset, - expression = originalDefault.expression.deepCopyWithVariables(), - ).apply { - expression.patchDeclarationParents(irFunction) - } + expression = originalDefault.expression.deepCopyWithSymbols(irFunction), + ) } return factory.createValueParameter( startOffset = startOffset, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt index c969fae2d02..558ba53eccf 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.backend.common.lower.inline.* import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.inline.InlineFunctionResolverReplacingCoroutineIntrinsics import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.util.* @@ -21,8 +20,7 @@ internal class InlineFunctionsSupport(mapping: NativeMapping) { private val partiallyLoweredInlineFunctions = mapping.partiallyLoweredInlineFunctions fun savePartiallyLoweredInlineFunction(function: IrFunction) = - function.deepCopyWithVariables().also { - it.patchDeclarationParents(function.parent) + function.deepCopyWithSymbols(function.parent).also { partiallyLoweredInlineFunctions[function.symbol] = it } diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt index 028dc128db4..708fcf1ed13 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt @@ -676,10 +676,7 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override val enumEntries = enumDescriptor.owner.enumEntries() val entriesNames = enumEntries.map { it.annotations.serialNameValue?.let { n -> irString(n) } ?: irNull() } val entriesAnnotations = enumEntries.map { - val annotationConstructors = it.annotations.map { a -> - a.deepCopyWithVariables() - } - val annotationsConstructors = copyAnnotationsFrom(annotationConstructors) + val annotationsConstructors = copyAnnotationsFrom(it.annotations) if (annotationsConstructors.isEmpty()) { irNull() } else { @@ -687,10 +684,7 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override } } - val classAnnotationConstructors = enumDescriptor.owner.annotations.map { a -> - a.deepCopyWithVariables() - } - val classAnnotationsConstructors = copyAnnotationsFrom(classAnnotationConstructors) + val classAnnotationsConstructors = copyAnnotationsFrom(enumDescriptor.owner.annotations) val classAnnotations = if (classAnnotationsConstructors.isEmpty()) { irNull() } else { diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt index 52c1a53d95c..d76f42a5234 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt @@ -8,21 +8,29 @@ package org.jetbrains.kotlinx.serialization.compiler.backend.ir import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.DescriptorVisibilities +import org.jetbrains.kotlin.descriptors.DescriptorVisibility +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.* -import org.jetbrains.kotlin.ir.builders.declarations.* +import org.jetbrains.kotlin.ir.builders.declarations.addGetter +import org.jetbrains.kotlin.ir.builders.declarations.addProperty +import org.jetbrains.kotlin.ir.builders.declarations.buildField +import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol -import org.jetbrains.kotlin.ir.symbols.impl.* +import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.name.* +import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginContext @@ -424,11 +432,7 @@ interface IrBuilderWithPluginContext { } fun IrBuilderWithScope.copyAnnotationsFrom(annotations: List): List = - annotations.mapNotNull { annotationCall -> - val annotationClass = annotationCall.symbol.owner.parentAsClass - if (!annotationClass.isSerialInfoAnnotation) return@mapNotNull null - annotationCall.deepCopyWithVariables() - } + annotations.filter { it.symbol.owner.parentAsClass.isSerialInfoAnnotation }.map { it.deepCopyWithVariables() } @OptIn(ObsoleteDescriptorBasedAPI::class) fun IrBuilderWithScope.wrapperClassReference(classType: IrType): IrClassReference { diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerForEnumsGenerator.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerForEnumsGenerator.kt index be92d98359b..21f0db40655 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerForEnumsGenerator.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerForEnumsGenerator.kt @@ -11,15 +11,11 @@ import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrVariable -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol -import org.jetbrains.kotlin.ir.util.constructors -import org.jetbrains.kotlin.ir.util.defaultType -import org.jetbrains.kotlin.ir.util.functions -import org.jetbrains.kotlin.ir.util.properties +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginContext import org.jetbrains.kotlinx.serialization.compiler.resolve.CallingConventions @@ -101,7 +97,7 @@ class SerializerForEnumsGenerator( +call // serialDesc.pushAnnotation(...) copySerialInfoAnnotationsToDescriptor( - entry.annotations.map {it.deepCopyWithVariables()}, + entry.copyAnnotations(), localDescriptor, serialDescImplClass.functionByName(CallingConventions.addAnnotation) )