From f14107bf653096b7e15614e4262609d632f3f247 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Thu, 8 Aug 2019 14:08:55 +0300 Subject: [PATCH] [IR] Sort dependencies a bit early --- .../org/jetbrains/kotlin/ir/backend/js/compiler.kt | 14 +------------- .../org/jetbrains/kotlin/backend/wasm/compiler.kt | 4 +--- .../src/org/jetbrains/kotlin/ir/backend/js/klib.kt | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt index e32b440749a..e12da4f1263 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt @@ -12,22 +12,11 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.ir.backend.js.lower.moveBodilessDeclarationsToSeparatePlace import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer import org.jetbrains.kotlin.ir.backend.js.utils.JsMainFunctionDetector -import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.utils.DFS - -fun sortDependencies(dependencies: Collection): Collection { - val mapping = dependencies.map { it.descriptor to it }.toMap() - - return DFS.topologicalOrder(dependencies) { m -> - val descriptor = m.descriptor - descriptor.allDependencyModules.filter { it != descriptor }.map { mapping[it] } - }.reversed() -} class CompilerResult( val jsCode: String, @@ -63,8 +52,7 @@ fun compile( ).generateUnboundSymbolsAsDependencies() } - // Since modules should be initialized in the correct topological order we sort them - val irFiles = sortDependencies(dependencyModules).flatMap { it.files } + moduleFragment.files + val irFiles = dependencyModules.flatMap { it.files } + moduleFragment.files moduleFragment.files.clear() moduleFragment.files += irFiles diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt index b0aa31bd7b4..6036bf34a42 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel import org.jetbrains.kotlin.backend.wasm.codegen.IrModuleToWasm import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.ir.backend.js.loadIr -import org.jetbrains.kotlin.ir.backend.js.sortDependencies import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.library.KotlinLibrary @@ -45,8 +44,7 @@ fun compileWasm( ).generateUnboundSymbolsAsDependencies() } - // Since modules should be initialized in the correct topological order we sort them - val irFiles = sortDependencies(dependencyModules).flatMap { it.files } + moduleFragment.files + val irFiles = dependencyModules.flatMap { it.files } + moduleFragment.files moduleFragment.files.clear() moduleFragment.files += irFiles diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index 09e7004c180..d7d08fe76dd 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -42,6 +42,7 @@ import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration import org.jetbrains.kotlin.storage.LockBasedStorageManager +import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.konan.file.File as KFile @@ -110,6 +111,15 @@ data class IrModuleInfo( val deserializer: JsIrLinker ) +private fun sortDependencies(dependencies: List, mapping: Map): Collection { + val m2l = mapping.map { it.value to it.key }.toMap() + + return DFS.topologicalOrder(dependencies) { m -> + val descriptor = mapping[m] ?: error("No descriptor found for library ${m.libraryName}") + descriptor.allDependencyModules.filter { it != descriptor }.map { m2l[it] } + }.reversed() +} + fun loadIr( project: Project, files: List, @@ -127,7 +137,7 @@ fun loadIr( val deserializer = JsIrLinker(moduleDescriptor, JsMangler, emptyLoggingContext, irBuiltIns, symbolTable) - val deserializedModuleFragments = allDependencies.map { + val deserializedModuleFragments = sortDependencies(allDependencies, depsDescriptors.descriptors).map { deserializer.deserializeIrModuleHeader(depsDescriptors.getModuleDescriptor(it))!! } @@ -244,7 +254,7 @@ private class ModulesStructure( private val storageManager: LockBasedStorageManager = LockBasedStorageManager("ModulesStructure") private var runtimeModule: ModuleDescriptorImpl? = null - private val descriptors = mutableMapOf() + val descriptors = mutableMapOf() fun getModuleDescriptor(current: KotlinLibrary): ModuleDescriptorImpl = descriptors.getOrPut(current) { val parts = loadKlibMetadataParts(current)