[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.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
|
||||||
|
|
||||||
|
|||||||
+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 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
|
||||||
|
|||||||
+22
-43
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user