From 447900c3f2ae141558aa59494e29aef48f6ef736 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Wed, 14 Jul 2021 18:07:13 +0300 Subject: [PATCH] [K/N] Make sure all module names are uniq In case of klib -> binary compilation there were two different modules with the same. It breaks invariant about uniqueness if module name. --- .../src/org/jetbrains/kotlin/cli/bc/K2Native.kt | 14 ++++++++++++++ .../jetbrains/kotlin/backend/konan/KonanConfig.kt | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) 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 0d2863c7f69..de20550d211 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 @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.konan.CURRENT import org.jetbrains.kotlin.konan.CompilerVersion import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.target.CompilerOutputKind +import org.jetbrains.kotlin.library.uniqueName import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.util.profile @@ -75,6 +76,7 @@ class K2Native : CLICompiler() { try { val konanConfig = KonanConfig(project, configuration) + ensureModuleName(konanConfig, environment) runTopLevelPhases(konanConfig, environment) } catch (e: KonanCompilationException) { return ExitCode.COMPILATION_ERROR @@ -101,6 +103,18 @@ class K2Native : CLICompiler() { return this?.asList() ?: listOf() } + private fun ensureModuleName(config: KonanConfig, environment: KotlinCoreEnvironment) { + if (environment.getSourceFiles().isEmpty()) { + val libraries = config.resolvedLibraries.getFullList() + val moduleName = config.moduleId + if (libraries.any { it.uniqueName == moduleName }) { + val kexeModuleName = "${moduleName}_kexe" + config.configuration.put(KonanConfigKeys.MODULE_NAME, kexeModuleName) + assert(libraries.none { it.uniqueName == kexeModuleName }) + } + } + } + // It is executed before doExecute(). override fun setupPlatformSpecificArgumentsAndServices( configuration: CompilerConfiguration, 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 fffa46d3abb..84a1265ebfd 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 @@ -87,7 +87,7 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration configuration, target, distribution, resolveManifestDependenciesLenient = metadataKlib ) - internal val resolvedLibraries get() = resolve.resolvedLibraries + val resolvedLibraries get() = resolve.resolvedLibraries internal val cacheSupport = CacheSupport(configuration, resolvedLibraries, target, produce)