Don't link default libraries that are used only for resolve

This commit is contained in:
Svyatoslav Scherbina
2017-10-24 12:18:01 +03:00
committed by SvyatoslavScherbina
parent 4431f8cbd9
commit b6bf2daafd
4 changed files with 21 additions and 4 deletions
@@ -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)
@@ -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<LibraryReaderImpl> by lazy {
internal val immediateLibraries: List<LibraryReaderImpl> by lazy {
val result = resolver.resolveImmediateLibraries(
libraryNames,
targetManager.target,
@@ -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<String>.addNonEmpty(elements: List<String>) {
addAll(elements.filter { !it.isEmpty() })
}
@@ -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<KonanLibraryReader> get() = context.config.immediateLibraries
.filter { !it.isDefaultLibrary || it in usedLibraries }
.withResolvedDependencies()
val librariesForLibraryManifest: List<KonanLibraryReader> 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