diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 7903ad5969f..28616390ea3 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -353,6 +353,20 @@ class K2Native : CLICompiler() { }) arguments.externalDependencies?.let { put(EXTERNAL_DEPENDENCIES, it) } + putIfNotNull(LLVM_VARIANT, when (val variant = arguments.llvmVariant) { + "user" -> LlvmVariant.User + "dev" -> LlvmVariant.Dev + null -> null + else -> { + val file = File(variant) + if (!file.exists) { + configuration.report(ERROR, "`-Xllvm-variant` should be `user`, `dev` or an absolute path. Got: $variant") + null + } else { + LlvmVariant.Custom(file) + } + } + }) } } } diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt index 3b7093f6274..f90a0214b9e 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt @@ -337,6 +337,13 @@ class K2NativeCompilerArguments : CommonCompilerArguments() { ) var workerExceptionHandling: String? = null + @Argument( + value = "-Xllvm-variant", + valueDescription = "{dev|user}", + description = "Choose LLVM distribution which will be used during compilation." + ) + var llvmVariant: String? = null + override fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap, Any> = super.configureAnalysisFlags(collector, languageVersion).also { val useExperimental = it[AnalysisFlags.useExperimental] as List<*> diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index 1bad26522c7..793fdd02f76 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -29,12 +29,21 @@ import org.jetbrains.kotlin.utils.addToStdlib.cast class KonanConfig(val project: Project, val configuration: CompilerConfiguration) { - internal val distribution = Distribution( - configuration.get(KonanConfigKeys.KONAN_HOME) ?: KonanHomeProvider.determineKonanHome(), - false, - configuration.get(KonanConfigKeys.RUNTIME_FILE), - configuration.get(KonanConfigKeys.OVERRIDE_KONAN_PROPERTIES) - ) + internal val distribution = run { + val overridenProperties = mutableMapOf().apply { + configuration.get(KonanConfigKeys.OVERRIDE_KONAN_PROPERTIES)?.let(this::putAll) + configuration.get(KonanConfigKeys.LLVM_VARIANT)?.getKonanPropertiesEntry()?.let { (key, value) -> + put(key, value) + } + } + + Distribution( + configuration.get(KonanConfigKeys.KONAN_HOME) ?: KonanHomeProvider.determineKonanHome(), + false, + configuration.get(KonanConfigKeys.RUNTIME_FILE), + overridenProperties + ) + } private val platformManager = PlatformManager(distribution) internal val targetManager = platformManager.targetManager(configuration.get(KonanConfigKeys.TARGET)) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index 26b16c9a672..c8367ba43b1 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -167,6 +167,7 @@ class KonanConfigKeys { val WORKER_EXCEPTION_HANDLING: CompilerConfigurationKey = CompilerConfigurationKey.create("unhandled exception processing in Worker.executeAfter") val EXTERNAL_DEPENDENCIES: CompilerConfigurationKey = CompilerConfigurationKey.create("use external dependencies to enhance IR linker error messages") + val LLVM_VARIANT: CompilerConfigurationKey = CompilerConfigurationKey.create("llvm variant") } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmVariant.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmVariant.kt new file mode 100644 index 00000000000..218dad831c4 --- /dev/null +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmVariant.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.konan + +import org.jetbrains.kotlin.konan.file.File +import org.jetbrains.kotlin.konan.target.HostManager + +sealed class LlvmVariant { + object User : LlvmVariant() { + override fun getKonanPropertiesEntry(): Pair = + konanPropertiesKey to "\$llvm.${HostManager.hostName}.user" + } + + object Dev : LlvmVariant() { + override fun getKonanPropertiesEntry(): Pair = + konanPropertiesKey to "\$llvm.${HostManager.hostName}.user" + + } + + class Custom(val path: File) : LlvmVariant() { + override fun getKonanPropertiesEntry(): Pair = + konanPropertiesKey to path.canonicalPath + + } + + abstract fun getKonanPropertiesEntry(): Pair + + companion object { + private val konanPropertiesKey: String by lazy { + "llvmHome.${HostManager.hostName}" + } + } +}