From d7fff3ca011d0f1cc21af99bd7f28a4c4d9cc445 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Wed, 5 Oct 2022 12:34:25 +0300 Subject: [PATCH] [K/N] Add `-Xforce-compiler-driver=(static, dynamic)` flag Useful for development purposes when one wants to compare the outputs of different drivers. --- .../cli/common/arguments/K2NativeCompilerArguments.kt | 3 +++ .../src/org/jetbrains/kotlin/cli/bc/K2Native.kt | 1 + .../kotlin/backend/konan/KonanConfigurationKeys.kt | 1 + .../org/jetbrains/kotlin/backend/konan/KonanDriver.kt | 11 +++++++++-- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArguments.kt index 7cae8d91f84..1babe539944 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArguments.kt @@ -393,6 +393,9 @@ class K2NativeCompilerArguments : CommonCompilerArguments() { @Argument(value = "-Xomit-framework-binary", description = "Omit binary when compiling framework") var omitFrameworkBinary: Boolean = false + @Argument(value = "-Xforce-compiler-driver", description = "Force compiler to use specific compiler driver: static or dynamic") + var forceCompilerDriver: String? = null + override fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap, Any> = super.configureAnalysisFlags(collector, languageVersion).also { val optInList = it[AnalysisFlags.optIn] as List<*> 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 6a596540c86..20ade8c0966 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 @@ -370,6 +370,7 @@ class K2Native : CLICompiler() { arguments.testDumpOutputPath?.let { put(TEST_DUMP_OUTPUT_PATH, it) } put(PARTIAL_LINKAGE, arguments.partialLinkage) put(OMIT_FRAMEWORK_BINARY, arguments.omitFrameworkBinary) + putIfNotNull(FORCE_COMPILER_DRIVER, arguments.forceCompilerDriver) } } } 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 b538e5ab18f..1d39bf5dc0b 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 @@ -177,6 +177,7 @@ class KonanConfigKeys { val PARTIAL_LINKAGE: CompilerConfigurationKey = CompilerConfigurationKey.create("allows some symbols in klibs be missed") val TEST_DUMP_OUTPUT_PATH: CompilerConfigurationKey = CompilerConfigurationKey.create("path to a file to dump the list of all available tests") val OMIT_FRAMEWORK_BINARY: CompilerConfigurationKey = CompilerConfigurationKey.create("do not generate binary in framework") + val FORCE_COMPILER_DRIVER: CompilerConfigurationKey = CompilerConfigurationKey.create("explicitly pick compiler driver") } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt index dc581664874..97e7721cd0a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt @@ -38,7 +38,7 @@ class KonanDriver(val project: Project, val environment: KotlinCoreEnvironment, val konanConfig = KonanConfig(project, configuration) ensureModuleName(konanConfig) - pickCompilerDriver().run(konanConfig, environment) + pickCompilerDriver(konanConfig).run(konanConfig, environment) } private fun ensureModuleName(config: KonanConfig) { @@ -53,7 +53,14 @@ class KonanDriver(val project: Project, val environment: KotlinCoreEnvironment, } } - private fun pickCompilerDriver(): CompilerDriver { + private fun pickCompilerDriver(config: KonanConfig): CompilerDriver { + config.configuration[KonanConfigKeys.FORCE_COMPILER_DRIVER]?.let { + return when (it) { + "dynamic" -> DynamicCompilerDriver() + "static" -> StaticCompilerDriver() + else -> error("Unknown compiler driver. Possible values: dynamic, static") + } + } // Dynamic driver is WIP, so it might not support all possible configurations. return if (DynamicCompilerDriver.supportsConfig()) { DynamicCompilerDriver()