diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index 846ee36db68..12305f05881 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -74,11 +74,10 @@ internal val psiToIrPhase = konanUnitPhase( this as LoggingContext, generatorContext.irBuiltIns, generatorContext.symbolTable, - forwardDeclarationsModuleDescriptor + forwardDeclarationsModuleDescriptor, + getExportedDependencies() ) - val modules = mutableMapOf() - var dependenciesCount = 0 while (true) { // context.config.librariesWithDependencies could change at each iteration. @@ -86,26 +85,17 @@ internal val psiToIrPhase = konanUnitPhase( config.librariesWithDependencies(moduleDescriptor).contains(it.konanLibrary) } for (dependency in dependencies) { - val konanLibrary = dependency.konanLibrary!! - if (modules.containsKey(konanLibrary.libraryName)) continue - konanLibrary.irHeader?.let { header -> - // TODO: consider skip deserializing explicitly exported declarations for libraries. - // Now it's not valid because of all dependencies that must be computed. - val deserializationStrategy = if (getExportedDependencies().contains(dependency)) - DeserializationStrategy.ALL else DeserializationStrategy.EXPLICITLY_EXPORTED - modules[konanLibrary.libraryName] = deserializer.deserializeIrModuleHeader(dependency, header, deserializationStrategy) - } + deserializer.deserializeIrModuleHeader(dependency) } if (dependencies.size == dependenciesCount) break dependenciesCount = dependencies.size } - val symbols = KonanSymbols(this, generatorContext.symbolTable, generatorContext.symbolTable.lazyWrapper) val module = translator.generateModuleFragment(generatorContext, environment.getSourceFiles(), deserializer) irModule = module - irModules = modules + irModules = deserializer.modules ir.symbols = symbols // validateIrModule(this, module) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt index 4d4da198809..2b9a401757f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt @@ -20,12 +20,10 @@ import org.jetbrains.kotlin.backend.common.LoggingContext import org.jetbrains.kotlin.backend.common.serialization.DescriptorUniqIdAware import org.jetbrains.kotlin.backend.common.serialization.KotlinIrLinker import org.jetbrains.kotlin.backend.common.serialization.UniqId -import org.jetbrains.kotlin.backend.common.serialization.UniqIdKey import org.jetbrains.kotlin.backend.konan.descriptors.konanLibrary import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns -import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.util.SymbolTable class KonanIrLinker( @@ -33,13 +31,22 @@ class KonanIrLinker( logger: LoggingContext, builtIns: IrBuiltIns, symbolTable: SymbolTable, - val forwardModuleDescriptor: ModuleDescriptor?) - : KotlinIrLinker(logger, builtIns, symbolTable, forwardModuleDescriptor, 0L), + forwardModuleDescriptor: ModuleDescriptor?, + exportedDependencies: List +) : KotlinIrLinker(logger, builtIns, symbolTable, exportedDependencies, forwardModuleDescriptor, 0L), DescriptorUniqIdAware by KonanDescriptorUniqIdAware { - private val forwardDeclarations = mutableSetOf() + override val descriptorReferenceDeserializer = + KonanDescriptorReferenceDeserializer(currentModule, resolvedForwardDeclarations) - override val descriptorReferenceDeserializer = KonanDescriptorReferenceDeserializer(currentModule, resolvedForwardDeclarations) + override fun reader(moduleDescriptor: ModuleDescriptor, uniqId: UniqId) = + moduleDescriptor.konanLibrary!!.irDeclaration(uniqId.index, uniqId.isLocal) - override fun reader(moduleDescriptor: ModuleDescriptor, uniqId: UniqId) = moduleDescriptor.konanLibrary!!.irDeclaration(uniqId.index, uniqId.isLocal) -} \ No newline at end of file + override val ModuleDescriptor.irHeader get() = this.konanLibrary!!.irHeader + + val modules: Map get() = mutableMapOf().apply { + deserializersForModules.forEach { + this.put(it.key.konanLibrary!!.libraryName, it.value.module) + } + } +}