From aa5e7c65be9eb9546674f2cdf991d9d33056172d Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Sun, 27 Jun 2021 22:36:02 +0300 Subject: [PATCH] KLIB: queue modules instead of ModuleDeserializationState This approach is more general and expandable. --- .../common/serialization/BasicIrModuleDeserializer.kt | 11 +++++++---- .../serialization/IncrementalCompilationSupport.kt | 4 ++++ .../common/serialization/IrModuleDeserializer.kt | 6 ++++++ .../backend/common/serialization/KotlinIrLinker.kt | 11 +++++------ 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/BasicIrModuleDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/BasicIrModuleDeserializer.kt index 3ded510f4e8..87796b97627 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/BasicIrModuleDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/BasicIrModuleDeserializer.kt @@ -25,7 +25,7 @@ abstract class BasicIrModuleDeserializer( moduleDescriptor: ModuleDescriptor, override val klib: IrLibrary, override val strategy: DeserializationStrategy, - private val containsErrorCode: Boolean = false + private val containsErrorCode: Boolean = false, ) : IrModuleDeserializer(moduleDescriptor) { @@ -134,18 +134,21 @@ abstract class BasicIrModuleDeserializer( return file } - // TODO useless override fun addModuleReachableTopLevel(idSig: IdSignature) { moduleDeserializationState.addIdSignature(idSig) } + + override fun deserializeReachableDeclarations() { + moduleDeserializationState.deserializeReachableDeclarations() + } } -internal class ModuleDeserializationState(val linker: KotlinIrLinker, val moduleDeserializer: BasicIrModuleDeserializer) { +private class ModuleDeserializationState(val linker: KotlinIrLinker, val moduleDeserializer: BasicIrModuleDeserializer) { private val filesWithPendingTopLevels = mutableSetOf() fun enqueueFile(fileDeserializationState: FileDeserializationState) { filesWithPendingTopLevels.add(fileDeserializationState) - linker.modulesWithReachableTopLevels.add(this) + linker.modulesWithReachableTopLevels.add(moduleDeserializer) } fun addIdSignature(key: IdSignature) { diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IncrementalCompilationSupport.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IncrementalCompilationSupport.kt index 1c03e15ec86..b10c31c6c11 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IncrementalCompilationSupport.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IncrementalCompilationSupport.kt @@ -100,6 +100,10 @@ class CurrentModuleWithICDeserializer( icDeserializer.addModuleReachableTopLevel(idSig) } + override fun deserializeReachableDeclarations() { + icDeserializer.deserializeReachableDeclarations() + } + private fun DeclarationDescriptor.isDirtyDescriptor(): Boolean { if (this is PropertyAccessorDescriptor) return correspondingProperty.isDirtyDescriptor() // Since descriptors for FO methods of `kotlin.Any` (toString, equals, hashCode) are Deserialized even in diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt index 779667dbd2c..434cae774d3 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt @@ -55,6 +55,8 @@ abstract class IrModuleDeserializer(val moduleDescriptor: ModuleDescriptor) { open fun addModuleReachableTopLevel(idSig: IdSignature) { error("Unsupported Operation (sig: $idSig") } + open fun deserializeReachableDeclarations() { error("Unsupported Operation") } + abstract val moduleFragment: IrModuleFragment abstract val moduleDependencies: Collection @@ -101,6 +103,10 @@ class IrModuleDeserializerWithBuiltIns( override fun referencePropertyByLocalSignature(file: IrFile, idSignature: IdSignature): IrPropertySymbol = delegate.referencePropertyByLocalSignature(file, idSignature) + override fun deserializeReachableDeclarations() { + delegate.deserializeReachableDeclarations() + } + private fun computeFunctionDescriptor(className: String): FunctionClassDescriptor { val isK = className[0] == 'K' val isSuspend = (if (isK) className[1] else className[0]) == 'S' diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt index 46893fb17b7..8ca92a79023 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt @@ -14,8 +14,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrModuleFragment -import org.jetbrains.kotlin.ir.descriptors.IrAbstractFunctionFactory -import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns +import org.jetbrains.kotlin.ir.descriptors.* import org.jetbrains.kotlin.ir.linkage.IrDeserializer import org.jetbrains.kotlin.ir.linkage.KotlinIrLinkerInternalException import org.jetbrains.kotlin.ir.symbols.* @@ -42,7 +41,7 @@ abstract class KotlinIrLinker( internal val expectSymbols = mutableMapOf() internal val actualSymbols = mutableMapOf() - internal val modulesWithReachableTopLevels = mutableSetOf() + internal val modulesWithReachableTopLevels = mutableSetOf() // TODO: replace with Map protected val deserializersForModules = mutableMapOf() @@ -97,10 +96,10 @@ abstract class KotlinIrLinker( private fun deserializeAllReachableTopLevels() { while (modulesWithReachableTopLevels.isNotEmpty()) { - val moduleDeserializationState = modulesWithReachableTopLevels.first() - modulesWithReachableTopLevels.remove(moduleDeserializationState) + val moduleDeserializer = modulesWithReachableTopLevels.first() + modulesWithReachableTopLevels.remove(moduleDeserializer) - moduleDeserializationState.deserializeReachableDeclarations() + moduleDeserializer.deserializeReachableDeclarations() } }