[K/N][codegen] Removed a thread unsafe optimization
It's not that needed anyway (according to the profile logs).
This commit is contained in:
+5
-16
@@ -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
|
||||
|
||||
|
||||
+18
-20
@@ -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
|
||||
|
||||
+22
-43
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user