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 707c397f18d..2e9d1a28ef1 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 @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.backend.konan import llvm.LLVMLinkModules2 import llvm.LLVMWriteBitcodeToFile -import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader import org.jetbrains.kotlin.backend.konan.library.impl.buildLibrary import org.jetbrains.kotlin.backend.konan.llvm.parseBitcodeFile import org.jetbrains.kotlin.konan.target.CompilerOutputKind @@ -49,7 +48,7 @@ internal fun produceOutput(context: Context) { val output = context.config.outputName val libraryName = context.config.moduleId val neededLibraries - = context.librariesWithDependencies + = context.llvm.librariesForLibraryManifest 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/KonanConfig.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index bbb70d90cea..c98e0099a5d 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 @@ -79,7 +79,7 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration private val repositories = configuration.getList(KonanConfigKeys.REPOSITORIES) private val resolver = defaultResolver(repositories, distribution) - private val immediateLibraries: List by lazy { + internal val immediateLibraries: List by lazy { val result = resolver.resolveImmediateLibraries( libraryNames, targetManager.target, 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 26072a69967..2c83ef178fd 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.librariesWithDependencies + private val libraries = context.llvm.librariesToLink private fun MutableList.addNonEmpty(elements: List) { addAll(elements.filter { !it.isEmpty() }) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt index db8b8f80c63..5eb12e6c645 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt @@ -24,7 +24,9 @@ import org.jetbrains.kotlin.backend.konan.descriptors.DeserializedKonanModule import org.jetbrains.kotlin.backend.konan.descriptors.LlvmSymbolOrigin import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.backend.konan.hash.GlobalHash +import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader import org.jetbrains.kotlin.backend.konan.library.impl.LibraryReaderImpl +import org.jetbrains.kotlin.backend.konan.library.withResolvedDependencies import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor @@ -325,6 +327,22 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) { } } + val librariesToLink: List get() = context.config.immediateLibraries + .filter { !it.isDefaultLibrary || it in usedLibraries } + .withResolvedDependencies() + + val librariesForLibraryManifest: List get() { + // Note: library manifest should contain the list of all user libraries and frontend-used default libraries. + // However this would result into linking too many default libraries into the application which uses current + // library. This problem should probably be fixed by adding different kind of dependencies to library + // manifest. + // Currently the problem is workarounded like this: + return this.librariesToLink + // This list contains all user libraries and the default libraries required for link (not frontend). + // That's why the workaround doesn't work only in very special cases, e.g. when `-nodefaultlibs` is enabled + // when compiling the application, while the library API uses types from default libs. + } + val staticData = StaticData(context) val runtimeFile = context.config.distribution.runtime