diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt index 4e96a92bffb..707c397f18d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt @@ -49,7 +49,7 @@ internal fun produceOutput(context: Context) { val output = context.config.outputName val libraryName = context.config.moduleId val neededLibraries - = context.config.librariesWithDependencies + = context.librariesWithDependencies val abiVersion = context.config.currentAbiVersion val target = context.config.targetManager.target val nopack = config.getBoolean(KonanConfigKeys.NOPACK) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index 6adb7d89dea..69de01f9123 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -178,6 +178,10 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { @Deprecated("") lateinit var psi2IrGeneratorContext: GeneratorContext + val librariesWithDependencies by lazy { + config.librariesWithDependencies(moduleDescriptor) + } + // TODO: make lateinit? var irModule: IrModuleFragment? = null set(module: IrModuleFragment?) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EscapeAnalysis.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EscapeAnalysis.kt index 478b7586366..8e08814b987 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EscapeAnalysis.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EscapeAnalysis.kt @@ -1297,7 +1297,7 @@ internal object EscapeAnalysis { val isStdlib = context.config.configuration[KonanConfigKeys.NOSTDLIB] == true val externalFunctionEAResults = mutableMapOf() - context.config.librariesWithDependencies.forEach { library -> + context.librariesWithDependencies.forEach { library -> val libraryEscapeAnalysis = library.escapeAnalysis if (libraryEscapeAnalysis != null) { DEBUG_OUTPUT(0) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index d7374beb18d..e03bcfaa5f7 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.* import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.target.* import org.jetbrains.kotlin.konan.util.DependencyProcessor @@ -78,7 +79,7 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration private val repositories = configuration.getList(KonanConfigKeys.REPOSITORIES) private val resolver = defaultResolver(repositories, distribution) - val immediateLibraries: List by lazy { + private val immediateLibraries: List by lazy { resolver.resolveImmediateLibraries( libraryNames, targetManager.target, @@ -92,13 +93,11 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration } } - // Accessing this field before resolve is a bad idea. - // purgeUnneeded() only works correctly after we have - // completed resolve and successfully marked package files - // as needed or not needed. - val librariesWithDependencies: List by lazy { + fun librariesWithDependencies(moduleDescriptor: ModuleDescriptor?): List { + if (moduleDescriptor == null) error("purgeUnneeded() only works correctly after resolve is over, and we have successfully marked package files as needed or not needed.") + resolver.resolveLibrariesRecursive(immediateLibraries, targetManager.target, currentAbiVersion) - immediateLibraries.purgeUnneeded().withResolvedDependencies() + return immediateLibraries.purgeUnneeded().withResolvedDependencies() } private val loadedDescriptors = loadLibMetadata() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt index 8fb4561f326..26072a69967 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt @@ -235,7 +235,7 @@ internal class LinkStage(val context: Context) { private val debug = config.get(KonanConfigKeys.DEBUG) ?: false private val nomain = config.get(KonanConfigKeys.NOMAIN) ?: false private val emitted = context.bitcodeFileName - private val libraries = context.config.librariesWithDependencies + private val libraries = context.librariesWithDependencies private fun MutableList.addNonEmpty(elements: List) { addAll(elements.filter { !it.isEmpty() }) }