[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.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 <userData> property to IrDeclaration.
private val layoutBuilders = mutableMapOf<IrClass, ClassLayoutBuilder>()
private val layoutBuilders = ConcurrentHashMap<IrClass, ClassLayoutBuilder>()
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
@@ -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
@@ -43,16 +43,16 @@ internal class LlvmDeclarations(private val unique: Map<UniqueKind, UniqueLlvmDe
}
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 ?:
error(irClass.descriptor.toString())
fun forClass(irClass: IrClass) =
(irClass.metadata as? KonanMetadata.Class)?.llvm ?: error(irClass.render())
fun forField(field: IrField) = (field.metadata as? CodegenInstanceFieldMetadata)?.llvm ?:
error(field.descriptor.toString())
fun forField(field: IrField) =
(field.metadata as? KonanMetadata.InstanceField)?.llvm ?: error(field.render())
fun forStaticField(field: IrField) = (field.metadata as? CodegenStaticFieldMetadata)?.llvm ?:
error(field.descriptor.toString())
fun forStaticField(field: IrField) =
(field.metadata as? KonanMetadata.StaticField)?.llvm ?: error(field.render())
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) {
if (declaration.requiresRtti()) {
val classLlvmDeclarations = createClassDeclarations(declaration)
val metadata = declaration.metadata as? CodegenClassMetadata
?: CodegenClassMetadata(declaration).also { declaration.metadata = it }
metadata.llvm = classLlvmDeclarations
declaration.metadata = KonanMetadata.Class(declaration, classLlvmDeclarations, context.getLayoutBuilder(declaration))
}
super.visitClass(declaration)
}
@@ -324,12 +322,11 @@ private class DeclarationsGeneratorVisitor(override val generationState: NativeG
val containingClass = declaration.parent as? IrClass
if (containingClass != null && !declaration.isStatic) {
if (!containingClass.requiresRtti()) return
val classDeclarations = (containingClass.metadata as? CodegenClassMetadata)?.llvm
?: error(containingClass.descriptor.toString())
val classDeclarations = (containingClass.metadata as? KonanMetadata.Class)?.llvm
?: error(containingClass.render())
val index = classDeclarations.fieldIndices[declaration.symbol]!!
declaration.metadata = CodegenInstanceFieldMetadata(
declaration.metadata?.name,
containingClass.konanLibrary,
declaration.metadata = KonanMetadata.InstanceField(
declaration,
FieldLlvmDeclarations(
index,
classDeclarations.bodyType,
@@ -346,11 +343,7 @@ private class DeclarationsGeneratorVisitor(override val generationState: NativeG
addKotlinGlobal(name, declaration.type.toLLVMType(llvm), alignmnet, isExported = false)
}
declaration.metadata = CodegenStaticFieldMetadata(
declaration.metadata?.name,
declaration.konanLibrary,
StaticFieldLlvmDeclarations(storage, alignmnet)
)
declaration.metadata = KonanMetadata.StaticField(declaration, StaticFieldLlvmDeclarations(storage, alignmnet))
}
}
@@ -404,35 +397,21 @@ private class DeclarationsGeneratorVisitor(override val generationState: NativeG
LlvmCallable(llvmFunction, proto)
}
declaration.metadata = CodegenFunctionMetadata(
declaration.metadata?.name,
declaration.konanLibrary,
llvmFunction
)
declaration.metadata = KonanMetadata.Function(declaration, 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)
: 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>(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>(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>(irField)
class StaticField(irField: IrField, val llvm: StaticFieldLlvmDeclarations) : Declaration<IrField>(irField)
}
private class CodegenStaticFieldMetadata(