From cc37934d6f6d02759aaea6e63c13801b5b75bba7 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Fri, 24 Dec 2021 14:14:11 +0300 Subject: [PATCH] [IR, Native] Add compiler flag for partial linkage mode ^KT-50775 --- .../org/jetbrains/kotlin/cli/bc/K2Native.kt | 1 + .../cli/bc/K2NativeCompilerArguments.kt | 3 ++ .../backend/konan/KonanConfigurationKeys.kt | 3 +- .../jetbrains/kotlin/backend/konan/PsiToIr.kt | 35 ++++++++++--------- .../konan/serialization/KonanIrlinker.kt | 3 +- 5 files changed, 27 insertions(+), 18 deletions(-) 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 c014ef2ef0b..e5f9a7f50db 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 @@ -386,6 +386,7 @@ class K2Native : CLICompiler() { putIfNotNull(RUNTIME_LOGS, arguments.runtimeLogs) putIfNotNull(BUNDLE_ID, parseBundleId(arguments, outputKind, configuration)) put(MEANINGFUL_BRIDGE_NAMES, arguments.meaningfulBridgeNames) + put(PARTIAL_LINKAGE, arguments.partialLinkage) } } } 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 15458940189..07b97edfca5 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 @@ -364,6 +364,9 @@ class K2NativeCompilerArguments : CommonCompilerArguments() { @Argument(value = "-Xlazy-ir-for-caches", valueDescription = "{disable|enable}", description = "Use lazy IR for cached libraries") var lazyIrForCaches: String? = null + @Argument(value = "-Xpartial-linkage", description = "Allow unlinked symbols") + var partialLinkage: Boolean = false + 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/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 5c18e97cd12..09f7dc3d145 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 @@ -6,8 +6,8 @@ package org.jetbrains.kotlin.backend.konan import org.jetbrains.kotlin.config.CompilerConfigurationKey -import org.jetbrains.kotlin.serialization.js.ModuleKind import org.jetbrains.kotlin.konan.target.CompilerOutputKind +import org.jetbrains.kotlin.serialization.js.ModuleKind class KonanConfigKeys { companion object { @@ -171,6 +171,7 @@ class KonanConfigKeys { val RUNTIME_LOGS: CompilerConfigurationKey = CompilerConfigurationKey.create("enable runtime logging") val LAZY_IR_FOR_CACHES: CompilerConfigurationKey = CompilerConfigurationKey.create("use lazy IR for cached libraries") val MEANINGFUL_BRIDGE_NAMES: CompilerConfigurationKey = CompilerConfigurationKey.create("enable meaningful bridge names") + val PARTIAL_LINKAGE: CompilerConfigurationKey = CompilerConfigurationKey.create("allows some symbols in klibs be missed") } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt index 3ca8f0efef9..d81f079a43e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt @@ -39,10 +39,12 @@ internal fun Context.psiToIr( useLinkerWhenProducingLibrary: Boolean ) { // Translate AST to high level IR. - val expectActualLinker = config.configuration.get(CommonConfigurationKeys.EXPECT_ACTUAL_LINKER)?:false - val messageLogger = config.configuration.get(IrMessageLogger.IR_MESSAGE_LOGGER) ?: IrMessageLogger.None + val expectActualLinker = config.configuration[CommonConfigurationKeys.EXPECT_ACTUAL_LINKER] ?: false + val messageLogger = config.configuration[IrMessageLogger.IR_MESSAGE_LOGGER] ?: IrMessageLogger.None - val translator = Psi2IrTranslator(config.configuration.languageVersionSettings, Psi2IrConfiguration(false)) + val allowUnboundSymbols = config.configuration[KonanConfigKeys.PARTIAL_LINKAGE] ?: false + + val translator = Psi2IrTranslator(config.configuration.languageVersionSettings, Psi2IrConfiguration(ignoreErrors = false, allowUnboundSymbols = allowUnboundSymbols)) val generatorContext = translator.createGeneratorContext(moduleDescriptor, bindingContext, symbolTable) val pluginExtensions = IrGenerationExtension.getInstances(config.project) @@ -105,19 +107,20 @@ internal fun Context.psiToIr( ).associateWith { friendModules } KonanIrLinker( - moduleDescriptor, - translationContext, - messageLogger, - generatorContext.irBuiltIns, - symbolTable, - friendModulesMap, - forwardDeclarationsModuleDescriptor, - stubGenerator, - irProviderForCEnumsAndCStructs, - exportedDependencies, - config.cachedLibraries, - config.lazyIrForCaches, - config.userVisibleIrModulesSupport + currentModule = moduleDescriptor, + translationPluginContext = translationContext, + messageLogger = messageLogger, + builtIns = generatorContext.irBuiltIns, + symbolTable = symbolTable, + friendModules = friendModulesMap, + forwardModuleDescriptor = forwardDeclarationsModuleDescriptor, + stubGenerator = stubGenerator, + cenumsProvider = irProviderForCEnumsAndCStructs, + exportedDependencies = exportedDependencies, + cachedLibraries = config.cachedLibraries, + lazyIrForCaches = config.lazyIrForCaches, + userVisibleIrModulesSupport = config.userVisibleIrModulesSupport, + allowUnboundSymbols = allowUnboundSymbols ).also { linker -> // context.config.librariesWithDependencies could change at each iteration. diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt index 4be73f16a46..ec4a501079c 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt @@ -322,7 +322,8 @@ internal class KonanIrLinker( private val cachedLibraries: CachedLibraries, private val lazyIrForCaches: Boolean, override val userVisibleIrModulesSupport: UserVisibleIrModulesSupport, -) : KotlinIrLinker(currentModule, messageLogger, builtIns, symbolTable, exportedDependencies) { + allowUnboundSymbols: Boolean +) : KotlinIrLinker(currentModule, messageLogger, builtIns, symbolTable, exportedDependencies, allowUnboundSymbols) { companion object { private val C_NAMES_NAME = Name.identifier("cnames")