Don't link default libraries that are used only for resolve
This commit is contained in:
committed by
SvyatoslavScherbina
parent
4431f8cbd9
commit
b6bf2daafd
+1
-2
@@ -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)
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
+1
-1
@@ -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() })
|
||||
}
|
||||
|
||||
+18
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user