From 9829605a9535193ab043cfa93e73c21109bfcb64 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Thu, 2 Nov 2017 18:36:58 +0300 Subject: [PATCH] Implement `--purge_user_libs` konanc and cinterop flag --- .../cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt | 2 ++ .../jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt | 3 +++ .../org/jetbrains/kotlin/backend/konan/KonanConfig.kt | 5 ++++- .../kotlin/backend/konan/KonanConfigurationKeys.kt | 2 ++ .../backend/konan/library/impl/KonanLibraryReaderImpl.kt | 4 +++- .../jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt | 2 +- .../kotlin/org/jetbrains/kotlin/cli/utilities/main.kt | 9 +++++++-- 7 files changed, 22 insertions(+), 5 deletions(-) diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index c48b3bfa8d9..c8c2c8dcd04 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -120,6 +120,8 @@ class K2Native : CLICompiler() { put(PRINT_LOCATIONS, arguments.printLocations) put(PRINT_BITCODE, arguments.printBitCode) + put(PURGE_USER_LIBS, arguments.purgeUserLibs) + put(VERIFY_IR, arguments.verifyIr) put(VERIFY_DESCRIPTORS, arguments.verifyDescriptors) put(VERIFY_BITCODE, arguments.verifyBitCode) diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt index 58d9513c9af..7b183312aa1 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt @@ -121,6 +121,9 @@ class K2NativeCompilerArguments : CommonCompilerArguments() { @Argument(value = "--print_locations", description = "Print locations") var printLocations: Boolean = false + @Argument(value = "--purge_user_libs", description = "Don't link unused libraries even explicitly specified") + var purgeUserLibs: Boolean = false + @Argument(value = "--time", description = "Report execution time for compiler phases") var timePhases: Boolean = false 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 c98e0099a5d..218b5797357 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 @@ -73,6 +73,9 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration val moduleId: String get() = configuration.get(KonanConfigKeys.MODULE_NAME) ?: File(outputName).name + internal val purgeUserLibs: Boolean + get() = configuration.getBoolean(KonanConfigKeys.PURGE_USER_LIBS) + private val libraryNames: List get() = configuration.getList(KonanConfigKeys.LIBRARY_FILES) @@ -95,7 +98,7 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration 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.") - return immediateLibraries.purgeUnneeded().withResolvedDependencies() + return immediateLibraries.purgeUnneeded(this).withResolvedDependencies() } private val loadedDescriptors = loadLibMetadata() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index 61fa7a0f9ad..625b590523f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -85,6 +85,8 @@ class KonanConfigKeys { = CompilerConfigurationKey.create("compiler output kind") val PROPERTY_FILE: CompilerConfigurationKey = CompilerConfigurationKey.create("override default property file path") + val PURGE_USER_LIBS: CompilerConfigurationKey + = CompilerConfigurationKey.create("purge user-specified libs too") val REPOSITORIES: CompilerConfigurationKey> = CompilerConfigurationKey.create("library search path repositories") val RUNTIME_FILE: CompilerConfigurationKey diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/impl/KonanLibraryReaderImpl.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/impl/KonanLibraryReaderImpl.kt index ef226dde9bd..a7838d1c2cd 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/impl/KonanLibraryReaderImpl.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/impl/KonanLibraryReaderImpl.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.backend.konan.library.impl +import org.jetbrains.kotlin.backend.konan.KonanConfig import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader import org.jetbrains.kotlin.backend.konan.createInteropLibrary import org.jetbrains.kotlin.backend.konan.serialization.emptyPackages @@ -98,5 +99,6 @@ class LibraryReaderImpl(var libraryFile: File, val currentAbiVersion: Int, } -internal fun List.purgeUnneeded(): List = this.filter{ !it.isDefaultLibrary || it.isNeededForLink } +internal fun List.purgeUnneeded(config: KonanConfig): List = + this.filter{ (!it.isDefaultLibrary && !config.purgeUserLibs) || it.isNeededForLink } 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 5eb12e6c645..1ab45ae8f00 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 @@ -328,7 +328,7 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) { } val librariesToLink: List get() = context.config.immediateLibraries - .filter { !it.isDefaultLibrary || it in usedLibraries } + .filter { (!it.isDefaultLibrary && !context.config.purgeUserLibs) || it in usedLibraries } .withResolvedDependencies() val librariesForLibraryManifest: List get() { diff --git a/utilities/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/main.kt b/utilities/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/main.kt index 92f86178db8..ad3ebacf0b9 100644 --- a/utilities/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/main.kt +++ b/utilities/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/main.kt @@ -28,15 +28,17 @@ import org.jetbrains.kotlin.native.interop.gen.jvm.interop import org.jetbrains.kotlin.cli.klib.main as klibMain private val NODEFAULTLIBS = "-nodefaultlibs" +private val PURGE_USER_LIBS = "--purge_user_libs" fun invokeCinterop(args: Array) { - val cinteropArgFilter = listOf(NODEFAULTLIBS) + val cinteropArgFilter = listOf(NODEFAULTLIBS, PURGE_USER_LIBS) var outputFileName = "nativelib" var target = "host" val libraries = mutableListOf() val repos = mutableListOf() var noDefaultLibs = false + var purgeUserLibs = false for (i in args.indices) { val arg = args[i] val nextArg = args.getOrNull(i + 1) @@ -50,6 +52,8 @@ fun invokeCinterop(args: Array) { repos.addIfNotNull(nextArg) if (arg == NODEFAULTLIBS) noDefaultLibs = true + if (arg == PURGE_USER_LIBS) + purgeUserLibs = true } @@ -97,7 +101,8 @@ fun invokeCinterop(args: Array) { "-target", target, "-manifest", manifest.path ) + cinteropArgsToCompiler + libraries.flatMap { listOf("-library", it) } + repos.flatMap { listOf("-repo", it) } + - if (noDefaultLibs) arrayOf(NODEFAULTLIBS) else emptyArray() + (if (noDefaultLibs) arrayOf(NODEFAULTLIBS) else emptyArray()) + + (if (purgeUserLibs) arrayOf(PURGE_USER_LIBS) else emptyArray()) konancMain(konancArgs) }