From 97b68d111c4c8c3f61d8ae3b19ed1984386a89b9 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 9 Nov 2022 17:50:07 +0200 Subject: [PATCH] [K/N][IR] Replaced lazyMapMember with mapping --- .../jetbrains/kotlin/backend/konan/Boxing.kt | 127 +++++------------- .../jetbrains/kotlin/backend/konan/Context.kt | 41 ++---- .../kotlin/backend/konan/ToplevelPhases.kt | 5 - .../kotlin/backend/konan/lower/Autoboxing.kt | 32 ++--- 4 files changed, 56 insertions(+), 149 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Boxing.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Boxing.kt index ad29831f93a..02fdce73366 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Boxing.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Boxing.kt @@ -8,17 +8,14 @@ package org.jetbrains.kotlin.backend.konan import llvm.* import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols import org.jetbrains.kotlin.backend.konan.llvm.* -import org.jetbrains.kotlin.descriptors.DescriptorVisibilities -import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.backend.common.getOrPut import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter +import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl -import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.ir.expressions.IrConstantPrimitive import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol -import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl -import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.defaultOrNullableType import org.jetbrains.kotlin.ir.util.defaultType @@ -45,9 +42,9 @@ private fun KonanSymbols.getTypeConversionImpl( internal object DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION : IrDeclarationOriginImpl("INLINE_CLASS_SPECIAL_FUNCTION") -internal val Context.getBoxFunction: (IrClass) -> IrSimpleFunction by Context.lazyMapMember { inlinedClass -> +internal fun Context.getBoxFunction(inlinedClass: IrClass): IrSimpleFunction = mapping.boxFunctions.getOrPut(inlinedClass) { require(inlinedClass.isUsedAsBoxClass()) - val classes = mutableListOf(inlinedClass) + val classes = mutableListOf(inlinedClass) var parent = inlinedClass.parent while (parent is IrClass) { classes.add(parent) @@ -55,58 +52,31 @@ internal val Context.getBoxFunction: (IrClass) -> IrSimpleFunction by Context.la } require(parent is IrFile || parent is IrExternalPackageFragment) { "Local inline classes are not supported" } - val symbols = ir.symbols - val isNullable = inlinedClass.inlinedClassIsNullable() val unboxedType = inlinedClass.defaultOrNullableType(isNullable) - val boxedType = symbols.any.owner.defaultOrNullableType(isNullable) + val boxedType = ir.symbols.any.owner.defaultOrNullableType(isNullable) - val parameterType = unboxedType - val returnType = boxedType - - val startOffset = inlinedClass.startOffset - val endOffset = inlinedClass.endOffset - - IrFunctionImpl( - startOffset, endOffset, - DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION, - IrSimpleFunctionSymbolImpl(), - Name.special("<${classes.reversed().joinToString(".") { it.name.asString() }}-box>"), - DescriptorVisibilities.PUBLIC, - Modality.FINAL, - returnType, - isInline = false, - isExternal = false, - isTailrec = false, - isSuspend = false, - isExpect = false, - isFakeOverride = false, - isOperator = false, - isInfix = false - ).also { function -> - function.valueParameters = listOf( - IrValueParameterImpl( - startOffset, endOffset, - IrDeclarationOrigin.DEFINED, - IrValueParameterSymbolImpl(), - Name.identifier("value"), - index = 0, - varargElementType = null, - isCrossinline = false, - type = parameterType, - isNoinline = false, - isHidden = false, - isAssignable = false - ).also { - it.parent = function - }) + irFactory.buildFun { + startOffset = inlinedClass.startOffset + endOffset = inlinedClass.endOffset + origin = DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION + name = Name.special("<${classes.reversed().joinToString(".") { it.name.asString() }}-box>") + returnType = boxedType + }.also { function -> function.parent = parent + + function.addValueParameter { + startOffset = inlinedClass.startOffset + endOffset = inlinedClass.endOffset + name = Name.identifier("value") + type = unboxedType + } } } -internal val Context.getUnboxFunction: (IrClass) -> IrSimpleFunction by Context.lazyMapMember { inlinedClass -> +internal fun Context.getUnboxFunction(inlinedClass: IrClass): IrSimpleFunction = mapping.unboxFunctions.getOrPut(inlinedClass) { require(inlinedClass.isUsedAsBoxClass()) - val classes = mutableListOf(inlinedClass) + val classes = mutableListOf(inlinedClass) var parent = inlinedClass.parent while (parent is IrClass) { classes.add(parent) @@ -120,46 +90,21 @@ internal val Context.getUnboxFunction: (IrClass) -> IrSimpleFunction by Context. val unboxedType = inlinedClass.defaultOrNullableType(isNullable) val boxedType = symbols.any.owner.defaultOrNullableType(isNullable) - val parameterType = boxedType - val returnType = unboxedType - - val startOffset = inlinedClass.startOffset - val endOffset = inlinedClass.endOffset - - IrFunctionImpl( - startOffset, endOffset, - DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION, - IrSimpleFunctionSymbolImpl(), - Name.special("<${classes.reversed().joinToString(".") { it.name.asString() } }-unbox>"), - DescriptorVisibilities.PUBLIC, - Modality.FINAL, - returnType, - isInline = false, - isExternal = false, - isTailrec = false, - isSuspend = false, - isExpect = false, - isFakeOverride = false, - isOperator = false, - isInfix = false - ).also { function -> - function.valueParameters = listOf( - IrValueParameterImpl( - startOffset, endOffset, - IrDeclarationOrigin.DEFINED, - IrValueParameterSymbolImpl(), - Name.identifier("value"), - index = 0, - varargElementType = null, - isCrossinline = false, - type = parameterType, - isNoinline = false, - isHidden = false, - isAssignable = false - ).also { - it.parent = function - }) + irFactory.buildFun { + startOffset = inlinedClass.startOffset + endOffset = inlinedClass.endOffset + origin = DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION + name = Name.special("<${classes.reversed().joinToString(".") { it.name.asString() } }-unbox>") + returnType = unboxedType + }.also { function -> function.parent = parent + + function.addValueParameter { + startOffset = inlinedClass.startOffset + endOffset = inlinedClass.endOffset + name = Name.identifier("value") + type = boxedType + } } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index d2949d87e54..b449ada46ea 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.IrTypeSystemContext import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl +import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.konan.library.KonanLibraryLayout import org.jetbrains.kotlin.konan.target.Architecture import org.jetbrains.kotlin.konan.target.KonanTarget @@ -44,7 +45,6 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.descriptorUtil.module import kotlin.LazyThreadSafetyMode.PUBLICATION -import kotlin.reflect.KProperty internal class NativeMapping : DefaultMapping() { data class BridgeKey(val target: IrSimpleFunction, val bridgeDirections: BridgeDirections) @@ -57,6 +57,9 @@ internal class NativeMapping : DefaultMapping() { val outerThisCacheAccessors = DefaultDelegateFactory.newDeclarationToDeclarationMapping() val lateinitPropertyCacheAccessors = DefaultDelegateFactory.newDeclarationToDeclarationMapping() val objectInstanceGetter = DefaultDelegateFactory.newDeclarationToDeclarationMapping() + val boxFunctions = DefaultDelegateFactory.newDeclarationToDeclarationMapping() + val unboxFunctions = DefaultDelegateFactory.newDeclarationToDeclarationMapping() + val loweredInlineClassConstructors = DefaultDelegateFactory.newDeclarationToDeclarationMapping() } internal class Context(config: KonanConfig) : KonanBackendContext(config), ConfigChecks { @@ -66,6 +69,11 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config), Confi lateinit var moduleDescriptor: ModuleDescriptor + /** + * Valid from [createSymbolTablePhase] until [destroySymbolTablePhase]. + */ + var symbolTable: SymbolTable? = null + lateinit var cAdapterGenerator: CAdapterGenerator lateinit var expectDescriptorToSymbol: MutableMap @@ -94,37 +102,6 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config), Confi val enumsSupport by lazy { EnumsSupport(mapping, irBuiltIns, irFactory) } val cachesAbiSupport by lazy { CachesAbiSupport(mapping, irFactory) } - open class LazyMember(val initializer: Context.() -> T) { - operator fun getValue(thisRef: Context, property: KProperty<*>): T = thisRef.getValue(this) - } - - class LazyVarMember(initializer: Context.() -> T) : LazyMember(initializer) { - operator fun setValue(thisRef: Context, property: KProperty<*>, newValue: T) = thisRef.setValue(this, newValue) - } - - companion object { - fun lazyMember(initializer: Context.() -> T) = LazyMember(initializer) - - fun lazyMapMember(initializer: Context.(K) -> V): LazyMember<(K) -> V> = lazyMember { - val storage = mutableMapOf() - val result: (K) -> V = { - storage.getOrPut(it, { initializer(it) }) - } - result - } - - fun nullValue() = LazyVarMember({ null }) - } - - private val lazyValues = mutableMapOf, Any?>() - - fun getValue(member: LazyMember): T = - @Suppress("UNCHECKED_CAST") (lazyValues.getOrPut(member, { member.initializer(this) }) as T) - - fun setValue(member: LazyVarMember, newValue: T) { - lazyValues[member] = newValue - } - val reflectionTypes: KonanReflectionTypes by lazy(PUBLICATION) { KonanReflectionTypes(moduleDescriptor) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index 4913362582d..38034fa6024 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -76,11 +76,6 @@ internal fun konanUnitPhase( op: Context.() -> Unit ) = namedOpUnitPhase(name, description, prerequisite, op) -/** - * Valid from [createSymbolTablePhase] until [destroySymbolTablePhase]. - */ -private var Context.symbolTable: SymbolTable? by Context.nullValue() - internal val createSymbolTablePhase = konanUnitPhase( op = { this.symbolTable = SymbolTable(KonanIdSignaturer(KonanManglerDesc), IrFactoryImpl) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt index 3f235d789df..da9387ec638 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.konan.lower import org.jetbrains.kotlin.backend.common.AbstractValueUsageTransformer import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.backend.common.getOrPut import org.jetbrains.kotlin.backend.common.lower.* import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.cgen.hasCCallAnnotation @@ -16,9 +17,9 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.* +import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl -import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.declarations.impl.IrPropertyImpl import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl @@ -26,7 +27,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrConstantPrimitiveImpl import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrPropertySymbolImpl -import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.transformStatement import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.isNullable @@ -505,7 +505,7 @@ private class InlineClassTransformer(private val context: Context) : IrBuildingT irClass.declarations.filterIsInstance().mapNotNull { it.backingField?.takeUnless { it.isStatic } }.single() } -private val Context.getLoweredInlineClassConstructor: (IrConstructor) -> IrSimpleFunction by Context.lazyMapMember { irConstructor -> +private fun Context.getLoweredInlineClassConstructor(irConstructor: IrConstructor): IrSimpleFunction = mapping.loweredInlineClassConstructors.getOrPut(irConstructor) { require(irConstructor.constructedClass.isInlined()) val returnType = if (irConstructor.isPrimary) { @@ -518,23 +518,13 @@ private val Context.getLoweredInlineClassConstructor: (IrConstructor) -> IrSimpl irConstructor.returnType } - IrFunctionImpl( - irConstructor.startOffset, irConstructor.endOffset, - IrDeclarationOrigin.DEFINED, - IrSimpleFunctionSymbolImpl(), - Name.special(""), - irConstructor.visibility, - Modality.FINAL, - isInline = false, - isExternal = false, - isTailrec = false, - isSuspend = false, - returnType = returnType, - isExpect = false, - isFakeOverride = false, - isOperator = false, - isInfix = false - ).apply { + irFactory.buildFun { + startOffset = irConstructor.startOffset + endOffset = irConstructor.endOffset + name = Name.special("") + visibility = irConstructor.visibility + this.returnType = returnType + }.apply { parent = irConstructor.parent // Note: technically speaking, this function doesn't have access to class type parameters (since it is "static"). @@ -543,6 +533,6 @@ private val Context.getLoweredInlineClassConstructor: (IrConstructor) -> IrSimpl // So it is just a trick to make [copyTo] happy: val remapTypeMap = irConstructor.constructedClass.typeParameters.associateBy { it } - valueParameters += irConstructor.valueParameters.map { it.copyTo(this, remapTypeMap = remapTypeMap) } + valueParameters = irConstructor.valueParameters.map { it.copyTo(this, remapTypeMap = remapTypeMap) } } }