From e5523c196e17d8fdbb5635aa785d6c182ed3f821 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 9 Nov 2022 19:20:02 +0200 Subject: [PATCH] [K/N][codegen] Removed a thread unsafe optimization It's not that needed anyway (according to the profile logs). --- .../jetbrains/kotlin/backend/konan/Context.kt | 21 ++---- .../kotlin/backend/konan/ir/NewIrUtils.kt | 38 +++++------ .../backend/konan/llvm/LlvmDeclarations.kt | 65 +++++++------------ 3 files changed, 45 insertions(+), 79 deletions(-) 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 a5ec45ba76a..8d6d61f29bf 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 @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.backend.konan.descriptors.ClassLayoutBuilder import org.jetbrains.kotlin.backend.konan.descriptors.GlobalHierarchyAnalysisResult import org.jetbrains.kotlin.backend.konan.ir.KonanIr import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols -import org.jetbrains.kotlin.backend.konan.llvm.CodegenClassMetadata +import org.jetbrains.kotlin.backend.konan.llvm.KonanMetadata import org.jetbrains.kotlin.backend.konan.lower.* import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportCodeSpec import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportedInterface @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyClass import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.types.IrTypeSystemContext import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl @@ -32,7 +31,6 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.module import java.util.concurrent.ConcurrentHashMap -import kotlin.LazyThreadSafetyMode.PUBLICATION internal class NativeMapping : DefaultMapping() { data class BridgeKey(val target: IrSimpleFunction, val bridgeDirections: BridgeDirections) @@ -82,20 +80,11 @@ internal class Context( val cachesAbiSupport by lazy { CachesAbiSupport(mapping, irFactory) } // TODO: Remove after adding special property to IrDeclaration. - private val layoutBuilders = mutableMapOf() + private val layoutBuilders = ConcurrentHashMap() - fun getLayoutBuilder(irClass: IrClass): ClassLayoutBuilder { - if (irClass is IrLazyClass) - return layoutBuilders.getOrPut(irClass) { - ClassLayoutBuilder(irClass, this) - } - val metadata = irClass.metadata as? CodegenClassMetadata - ?: CodegenClassMetadata(irClass).also { irClass.metadata = it } - metadata.layoutBuilder?.let { return it } - val layoutBuilder = ClassLayoutBuilder(irClass, this) - metadata.layoutBuilder = layoutBuilder - return layoutBuilder - } + fun getLayoutBuilder(irClass: IrClass): ClassLayoutBuilder = + (irClass.metadata as? KonanMetadata.Class)?.layoutBuilder + ?: layoutBuilders.getOrPut(irClass) { ClassLayoutBuilder(irClass, this) } lateinit var globalHierarchyAnalysisResult: GlobalHierarchyAnalysisResult diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt index bb436449532..a0abc75b22d 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt @@ -105,26 +105,24 @@ private fun IrClass.getOverridingOf(function: IrFunction) = (function as? IrSimp } val ModuleDescriptor.konanLibrary get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library -val IrModuleFragment.konanLibrary get() = - (this as? KonanIrModuleFragmentImpl)?.konanLibrary ?: descriptor.konanLibrary -val IrPackageFragment.konanLibrary get() = - if (this is IrFile) - this.konanLibrary - else - this.packageFragmentDescriptor.containingDeclaration.konanLibrary -val IrFile.konanLibrary get() = - (metadata as? KonanFileMetadataSource)?.module?.konanLibrary ?: packageFragmentDescriptor.containingDeclaration.konanLibrary -val IrDeclaration.konanLibrary: KotlinLibrary? get() { - ((this as? IrMetadataSourceOwner)?.metadata as? KonanMetadata)?.let { return it.konanLibrary } - val result = when (val parent = parent) { - is IrFile -> parent.konanLibrary - is IrPackageFragment -> parent.packageFragmentDescriptor.containingDeclaration.konanLibrary - is IrDeclaration -> parent.konanLibrary - else -> TODO("Unexpected declaration parent: $parent") +val IrModuleFragment.konanLibrary + get() = (this as? KonanIrModuleFragmentImpl)?.konanLibrary ?: descriptor.konanLibrary +val IrPackageFragment.konanLibrary + get() = if (this is IrFile) + this.konanLibrary + else + this.packageFragmentDescriptor.containingDeclaration.konanLibrary +val IrFile.konanLibrary + get() = (metadata as? KonanFileMetadataSource)?.module?.konanLibrary ?: packageFragmentDescriptor.containingDeclaration.konanLibrary +val IrDeclaration.konanLibrary: KotlinLibrary? + get() { + ((this as? IrMetadataSourceOwner)?.metadata as? KonanMetadata)?.let { return it.konanLibrary } + return when (val parent = parent) { + is IrFile -> parent.konanLibrary + is IrPackageFragment -> parent.packageFragmentDescriptor.containingDeclaration.konanLibrary + is IrDeclaration -> parent.konanLibrary + else -> TODO("Unexpected declaration parent: $parent") + } } - if (this is IrMetadataSourceOwner && this !is IrLazyDeclarationBase) - metadata = KonanMetadata(metadata?.name, result) - return result -} fun IrDeclaration.isFromInteropLibrary() = konanLibrary?.isInteropLibrary() == true diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmDeclarations.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmDeclarations.kt index 2ef1c529634..f5f75b53b05 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmDeclarations.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmDeclarations.kt @@ -43,16 +43,16 @@ internal class LlvmDeclarations(private val unique: Map(declaration: T) + : KonanMetadata(declaration.metadata?.name, declaration.konanLibrary) where T : IrDeclaration, T : IrMetadataSourceOwner -internal class CodegenClassMetadata(irClass: IrClass) - : KonanMetadata(irClass.metadata?.name, irClass.konanLibrary), MetadataSource.Class { - var layoutBuilder: ClassLayoutBuilder? = null - var llvm: ClassLlvmDeclarations? = null - override var serializedIr: ByteArray? = null -} + class Class(irClass: IrClass, val llvm: ClassLlvmDeclarations, val layoutBuilder: ClassLayoutBuilder) : Declaration(irClass) -private class CodegenFunctionMetadata( - name: Name?, - konanLibrary: KotlinLibrary?, - val llvm: LlvmCallable -) : KonanMetadata(name, konanLibrary), MetadataSource.Function + class Function(irFunction: IrFunction, val llvm: LlvmCallable) : Declaration(irFunction) -private class CodegenInstanceFieldMetadata( - name: Name?, - konanLibrary: KotlinLibrary?, - val llvm: FieldLlvmDeclarations -) : KonanMetadata(name, konanLibrary), MetadataSource.Property { - override val isConst = false + class InstanceField(irField: IrField, val llvm: FieldLlvmDeclarations) : Declaration(irField) + + class StaticField(irField: IrField, val llvm: StaticFieldLlvmDeclarations) : Declaration(irField) } private class CodegenStaticFieldMetadata(