[K/N][codegen] Removed a thread unsafe optimization

It's not that needed anyway (according to the profile logs).
This commit is contained in:
Igor Chevdar
2022-11-09 19:20:02 +02:00
committed by Space Team
parent ea7c851748
commit e5523c196e
3 changed files with 45 additions and 79 deletions
@@ -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.descriptors.GlobalHierarchyAnalysisResult
import org.jetbrains.kotlin.backend.konan.ir.KonanIr import org.jetbrains.kotlin.backend.konan.ir.KonanIr
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols 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.lower.*
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportCodeSpec import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportCodeSpec
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportedInterface 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.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.declarations.* 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.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrTypeSystemContext import org.jetbrains.kotlin.ir.types.IrTypeSystemContext
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl 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.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
import kotlin.LazyThreadSafetyMode.PUBLICATION
internal class NativeMapping : DefaultMapping() { internal class NativeMapping : DefaultMapping() {
data class BridgeKey(val target: IrSimpleFunction, val bridgeDirections: BridgeDirections) data class BridgeKey(val target: IrSimpleFunction, val bridgeDirections: BridgeDirections)
@@ -82,20 +80,11 @@ internal class Context(
val cachesAbiSupport by lazy { CachesAbiSupport(mapping, irFactory) } val cachesAbiSupport by lazy { CachesAbiSupport(mapping, irFactory) }
// TODO: Remove after adding special <userData> property to IrDeclaration. // TODO: Remove after adding special <userData> property to IrDeclaration.
private val layoutBuilders = mutableMapOf<IrClass, ClassLayoutBuilder>() private val layoutBuilders = ConcurrentHashMap<IrClass, ClassLayoutBuilder>()
fun getLayoutBuilder(irClass: IrClass): ClassLayoutBuilder { fun getLayoutBuilder(irClass: IrClass): ClassLayoutBuilder =
if (irClass is IrLazyClass) (irClass.metadata as? KonanMetadata.Class)?.layoutBuilder
return layoutBuilders.getOrPut(irClass) { ?: layoutBuilders.getOrPut(irClass) { ClassLayoutBuilder(irClass, this) }
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
}
lateinit var globalHierarchyAnalysisResult: GlobalHierarchyAnalysisResult lateinit var globalHierarchyAnalysisResult: GlobalHierarchyAnalysisResult
@@ -105,26 +105,24 @@ private fun IrClass.getOverridingOf(function: IrFunction) = (function as? IrSimp
} }
val ModuleDescriptor.konanLibrary get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library val ModuleDescriptor.konanLibrary get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library
val IrModuleFragment.konanLibrary get() = val IrModuleFragment.konanLibrary
(this as? KonanIrModuleFragmentImpl)?.konanLibrary ?: descriptor.konanLibrary get() = (this as? KonanIrModuleFragmentImpl)?.konanLibrary ?: descriptor.konanLibrary
val IrPackageFragment.konanLibrary get() = val IrPackageFragment.konanLibrary
if (this is IrFile) get() = if (this is IrFile)
this.konanLibrary this.konanLibrary
else else
this.packageFragmentDescriptor.containingDeclaration.konanLibrary this.packageFragmentDescriptor.containingDeclaration.konanLibrary
val IrFile.konanLibrary get() = val IrFile.konanLibrary
(metadata as? KonanFileMetadataSource)?.module?.konanLibrary ?: packageFragmentDescriptor.containingDeclaration.konanLibrary get() = (metadata as? KonanFileMetadataSource)?.module?.konanLibrary ?: packageFragmentDescriptor.containingDeclaration.konanLibrary
val IrDeclaration.konanLibrary: KotlinLibrary? get() { val IrDeclaration.konanLibrary: KotlinLibrary?
((this as? IrMetadataSourceOwner)?.metadata as? KonanMetadata)?.let { return it.konanLibrary } get() {
val result = when (val parent = parent) { ((this as? IrMetadataSourceOwner)?.metadata as? KonanMetadata)?.let { return it.konanLibrary }
is IrFile -> parent.konanLibrary return when (val parent = parent) {
is IrPackageFragment -> parent.packageFragmentDescriptor.containingDeclaration.konanLibrary is IrFile -> parent.konanLibrary
is IrDeclaration -> parent.konanLibrary is IrPackageFragment -> parent.packageFragmentDescriptor.containingDeclaration.konanLibrary
else -> TODO("Unexpected declaration parent: $parent") 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 fun IrDeclaration.isFromInteropLibrary() = konanLibrary?.isInteropLibrary() == true
@@ -43,16 +43,16 @@ internal class LlvmDeclarations(private val unique: Map<UniqueKind, UniqueLlvmDe
} }
fun forFunctionOrNull(function: IrFunction): LlvmCallable? = fun forFunctionOrNull(function: IrFunction): LlvmCallable? =
(function.metadata as? CodegenFunctionMetadata)?.llvm (function.metadata as? KonanMetadata.Function)?.llvm
fun forClass(irClass: IrClass) = (irClass.metadata as? CodegenClassMetadata)?.llvm ?: fun forClass(irClass: IrClass) =
error(irClass.descriptor.toString()) (irClass.metadata as? KonanMetadata.Class)?.llvm ?: error(irClass.render())
fun forField(field: IrField) = (field.metadata as? CodegenInstanceFieldMetadata)?.llvm ?: fun forField(field: IrField) =
error(field.descriptor.toString()) (field.metadata as? KonanMetadata.InstanceField)?.llvm ?: error(field.render())
fun forStaticField(field: IrField) = (field.metadata as? CodegenStaticFieldMetadata)?.llvm ?: fun forStaticField(field: IrField) =
error(field.descriptor.toString()) (field.metadata as? KonanMetadata.StaticField)?.llvm ?: error(field.render())
fun forUnique(kind: UniqueKind) = unique[kind] ?: error("No unique $kind") fun forUnique(kind: UniqueKind) = unique[kind] ?: error("No unique $kind")
@@ -184,9 +184,7 @@ private class DeclarationsGeneratorVisitor(override val generationState: NativeG
override fun visitClass(declaration: IrClass) { override fun visitClass(declaration: IrClass) {
if (declaration.requiresRtti()) { if (declaration.requiresRtti()) {
val classLlvmDeclarations = createClassDeclarations(declaration) val classLlvmDeclarations = createClassDeclarations(declaration)
val metadata = declaration.metadata as? CodegenClassMetadata declaration.metadata = KonanMetadata.Class(declaration, classLlvmDeclarations, context.getLayoutBuilder(declaration))
?: CodegenClassMetadata(declaration).also { declaration.metadata = it }
metadata.llvm = classLlvmDeclarations
} }
super.visitClass(declaration) super.visitClass(declaration)
} }
@@ -324,12 +322,11 @@ private class DeclarationsGeneratorVisitor(override val generationState: NativeG
val containingClass = declaration.parent as? IrClass val containingClass = declaration.parent as? IrClass
if (containingClass != null && !declaration.isStatic) { if (containingClass != null && !declaration.isStatic) {
if (!containingClass.requiresRtti()) return if (!containingClass.requiresRtti()) return
val classDeclarations = (containingClass.metadata as? CodegenClassMetadata)?.llvm val classDeclarations = (containingClass.metadata as? KonanMetadata.Class)?.llvm
?: error(containingClass.descriptor.toString()) ?: error(containingClass.render())
val index = classDeclarations.fieldIndices[declaration.symbol]!! val index = classDeclarations.fieldIndices[declaration.symbol]!!
declaration.metadata = CodegenInstanceFieldMetadata( declaration.metadata = KonanMetadata.InstanceField(
declaration.metadata?.name, declaration,
containingClass.konanLibrary,
FieldLlvmDeclarations( FieldLlvmDeclarations(
index, index,
classDeclarations.bodyType, classDeclarations.bodyType,
@@ -346,11 +343,7 @@ private class DeclarationsGeneratorVisitor(override val generationState: NativeG
addKotlinGlobal(name, declaration.type.toLLVMType(llvm), alignmnet, isExported = false) addKotlinGlobal(name, declaration.type.toLLVMType(llvm), alignmnet, isExported = false)
} }
declaration.metadata = CodegenStaticFieldMetadata( declaration.metadata = KonanMetadata.StaticField(declaration, StaticFieldLlvmDeclarations(storage, alignmnet))
declaration.metadata?.name,
declaration.konanLibrary,
StaticFieldLlvmDeclarations(storage, alignmnet)
)
} }
} }
@@ -404,35 +397,21 @@ private class DeclarationsGeneratorVisitor(override val generationState: NativeG
LlvmCallable(llvmFunction, proto) LlvmCallable(llvmFunction, proto)
} }
declaration.metadata = CodegenFunctionMetadata( declaration.metadata = KonanMetadata.Function(declaration, llvmFunction)
declaration.metadata?.name,
declaration.konanLibrary,
llvmFunction
)
} }
} }
internal open class KonanMetadata(override val name: Name?, val konanLibrary: KotlinLibrary?) : MetadataSource internal sealed class KonanMetadata(override val name: Name?, val konanLibrary: KotlinLibrary?) : MetadataSource {
sealed class Declaration<T>(declaration: T)
: KonanMetadata(declaration.metadata?.name, declaration.konanLibrary) where T : IrDeclaration, T : IrMetadataSourceOwner
internal class CodegenClassMetadata(irClass: IrClass) class Class(irClass: IrClass, val llvm: ClassLlvmDeclarations, val layoutBuilder: ClassLayoutBuilder) : Declaration<IrClass>(irClass)
: KonanMetadata(irClass.metadata?.name, irClass.konanLibrary), MetadataSource.Class {
var layoutBuilder: ClassLayoutBuilder? = null
var llvm: ClassLlvmDeclarations? = null
override var serializedIr: ByteArray? = null
}
private class CodegenFunctionMetadata( class Function(irFunction: IrFunction, val llvm: LlvmCallable) : Declaration<IrFunction>(irFunction)
name: Name?,
konanLibrary: KotlinLibrary?,
val llvm: LlvmCallable
) : KonanMetadata(name, konanLibrary), MetadataSource.Function
private class CodegenInstanceFieldMetadata( class InstanceField(irField: IrField, val llvm: FieldLlvmDeclarations) : Declaration<IrField>(irField)
name: Name?,
konanLibrary: KotlinLibrary?, class StaticField(irField: IrField, val llvm: StaticFieldLlvmDeclarations) : Declaration<IrField>(irField)
val llvm: FieldLlvmDeclarations
) : KonanMetadata(name, konanLibrary), MetadataSource.Property {
override val isConst = false
} }
private class CodegenStaticFieldMetadata( private class CodegenStaticFieldMetadata(