Create a compiler argument to adjust the klib zip file cache.
^KT-79675
diff --git a/compiler/arguments/resources/kotlin-compiler-arguments.json b/compiler/arguments/resources/kotlin-compiler-arguments.json
index 9349f77..e640791 100644
--- a/compiler/arguments/resources/kotlin-compiler-arguments.json
+++ b/compiler/arguments/resources/kotlin-compiler-arguments.json
@@ -6391,6 +6391,37 @@
"deprecatedVersion": null,
"removedVersion": null
}
+ },
+ {
+ "name": "Xklib-zip-file-accessor-cache-limit",
+ "shortName": null,
+ "deprecatedName": null,
+ "description": {
+ "current": "Maximum number of klibs that can be cached during compilation. Default is 64.",
+ "valueInVersions": []
+ },
+ "delimiter": null,
+ "valueType": {
+ "type": "org.jetbrains.kotlin.arguments.dsl.types.IntType",
+ "isNullable": {
+ "current": false,
+ "valueInVersions": []
+ },
+ "defaultValue": {
+ "current": 64,
+ "valueInVersions": []
+ }
+ },
+ "valueDescription": {
+ "current": null,
+ "valueInVersions": []
+ },
+ "releaseVersionsMetadata": {
+ "introducedVersion": "2.3.0",
+ "stabilizedVersion": null,
+ "deprecatedVersion": null,
+ "removedVersion": null
+ }
}
],
"nestedLevels": [
diff --git a/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/CommonKlibBasedCompilerArguments.kt b/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/CommonKlibBasedCompilerArguments.kt
index 7dcb0d4..1a66e38 100644
--- a/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/CommonKlibBasedCompilerArguments.kt
+++ b/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/CommonKlibBasedCompilerArguments.kt
@@ -10,6 +10,7 @@
import org.jetbrains.kotlin.arguments.dsl.defaultNull
import org.jetbrains.kotlin.arguments.dsl.defaultTrue
import org.jetbrains.kotlin.arguments.dsl.types.BooleanType
+import org.jetbrains.kotlin.arguments.dsl.types.IntType
import org.jetbrains.kotlin.arguments.dsl.types.StringArrayType
import org.jetbrains.kotlin.arguments.dsl.types.StringType
@@ -107,4 +108,16 @@
introducedVersion = KotlinReleaseVersion.v2_2_0,
)
}
+
+ compilerArgument {
+ name = "Xklib-zip-file-accessor-cache-limit"
+ description = "Maximum number of klibs that can be cached during compilation. Default is 64.".asReleaseDependent()
+ valueType = IntType(
+ defaultValue = 64.asReleaseDependent()
+ )
+
+ lifecycle(
+ introducedVersion = KotlinReleaseVersion.v2_3_0
+ )
+ }
}
diff --git a/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/NativeCompilerArguments.kt b/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/NativeCompilerArguments.kt
index 48b3ef1..6aa25b3 100644
--- a/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/NativeCompilerArguments.kt
+++ b/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/NativeCompilerArguments.kt
@@ -1062,7 +1062,8 @@
compilerArgument {
name = "Xmanifest-native-targets"
- description = "Comma-separated list that will be written as the value of 'native_targets' property in the .klib manifest. Unknown values are discarded.".asReleaseDependent()
+ description =
+ "Comma-separated list that will be written as the value of 'native_targets' property in the .klib manifest. Unknown values are discarded.".asReleaseDependent()
valueType = StringArrayType.defaultNull
lifecycle(
diff --git a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonKlibBasedCompilerArguments.kt b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonKlibBasedCompilerArguments.kt
index d152a29..0f52f6f 100644
--- a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonKlibBasedCompilerArguments.kt
+++ b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonKlibBasedCompilerArguments.kt
@@ -95,4 +95,14 @@
field = if (value.isNullOrEmpty()) null else value
}
+ @Argument(
+ value = "-Xklib-zip-file-accessor-cache-limit",
+ description = "Maximum number of klibs that can be cached during compilation. Default is 64.",
+ )
+ var klibZipFileAccessorCacheLimit: String = "64"
+ set(value) {
+ checkFrozen()
+ field = value
+ }
+
}
diff --git a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonKlibBasedCompilerArgumentsCopyGenerated.kt b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonKlibBasedCompilerArgumentsCopyGenerated.kt
index 543b63c..4d5850f 100644
--- a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonKlibBasedCompilerArgumentsCopyGenerated.kt
+++ b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonKlibBasedCompilerArgumentsCopyGenerated.kt
@@ -14,6 +14,7 @@
to.duplicatedUniqueNameStrategy = from.duplicatedUniqueNameStrategy
to.enableSignatureClashChecks = from.enableSignatureClashChecks
to.irInlinerBeforeKlibSerialization = from.irInlinerBeforeKlibSerialization
+ to.klibZipFileAccessorCacheLimit = from.klibZipFileAccessorCacheLimit
to.normalizeAbsolutePath = from.normalizeAbsolutePath
to.partialLinkageLogLevel = from.partialLinkageLogLevel
to.partialLinkageMode = from.partialLinkageMode
diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/Helpers.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/Helpers.kt
index d2bfcb9..7a62d3b 100644
--- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/Helpers.kt
+++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/Helpers.kt
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.cli.js
-import com.intellij.openapi.Disposable
import com.intellij.util.ExceptionUtil
import org.jetbrains.kotlin.backend.js.JsGenerationGranularity
import org.jetbrains.kotlin.backend.js.TsCompilationStrategy
@@ -23,8 +22,6 @@
import org.jetbrains.kotlin.js.config.SourceMapNamesPolicy
import org.jetbrains.kotlin.js.config.SourceMapSourceEmbedding
import org.jetbrains.kotlin.js.config.wasmCompilation
-import org.jetbrains.kotlin.konan.file.ZipFileSystemAccessor
-import org.jetbrains.kotlin.konan.file.ZipFileSystemCacheableAccessor
import org.jetbrains.kotlin.library.loader.KlibPlatformChecker
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.serialization.js.ModuleKind
@@ -60,16 +57,6 @@
else -> TsCompilationStrategy.MERGED
}
-internal class DisposableZipFileSystemAccessor private constructor(
- private val zipAccessor: ZipFileSystemCacheableAccessor,
-) : Disposable, ZipFileSystemAccessor by zipAccessor {
- constructor(cacheLimit: Int) : this(ZipFileSystemCacheableAccessor(cacheLimit))
-
- override fun dispose() {
- zipAccessor.reset()
- }
-}
-
internal val sourceMapContentEmbeddingMap: Map<String, SourceMapSourceEmbedding> = mapOf(
K2JsArgumentConstants.SOURCE_MAP_SOURCE_CONTENT_ALWAYS to SourceMapSourceEmbedding.ALWAYS,
K2JsArgumentConstants.SOURCE_MAP_SOURCE_CONTENT_NEVER to SourceMapSourceEmbedding.NEVER,
diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.kt
index 382ea83..7e037ea 100644
--- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.kt
+++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.kt
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.cli.js
import com.intellij.openapi.Disposable
-import com.intellij.openapi.util.Disposer
import org.jetbrains.kotlin.analyzer.CompilationErrorException
import org.jetbrains.kotlin.backend.common.LoadedKlibs
import org.jetbrains.kotlin.cli.common.CLICompiler
@@ -29,7 +28,6 @@
import org.jetbrains.kotlin.cli.pipeline.web.WebCliPipeline
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
-import org.jetbrains.kotlin.config.KlibConfigurationKeys
import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.ir.backend.js.*
@@ -119,14 +117,10 @@
val pluginLoadResult = loadPlugins(paths, arguments, configuration, rootDisposable)
if (pluginLoadResult != OK) return pluginLoadResult
- CommonWebConfigurationUpdater.initializeCommonConfiguration(compilerImpl.configuration, arguments)
+ CommonWebConfigurationUpdater.initializeCommonConfiguration(compilerImpl.configuration, arguments, rootDisposable)
val targetEnvironment = compilerImpl.tryInitializeCompiler(rootDisposable) ?: return COMPILATION_ERROR
- val zipAccessor = DisposableZipFileSystemAccessor(64)
- Disposer.register(rootDisposable, zipAccessor)
- targetEnvironment.configuration.put(KlibConfigurationKeys.ZIP_FILE_SYSTEM_ACCESSOR, zipAccessor)
-
val sourcesFiles = targetEnvironment.getSourceFiles()
if (!checkKotlinPackageUsageForPsi(targetEnvironment.configuration, sourcesFiles)) return COMPILATION_ERROR
diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/pipeline/web/WebConfigurationPhase.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/pipeline/web/WebConfigurationPhase.kt
index c570845..56b84a5 100644
--- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/pipeline/web/WebConfigurationPhase.kt
+++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/pipeline/web/WebConfigurationPhase.kt
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.cli.pipeline.web
-import com.intellij.openapi.util.Disposer
+import com.intellij.openapi.Disposable
import com.intellij.openapi.util.text.StringUtil
import org.jetbrains.kotlin.backend.common.linkage.partial.setupPartialLinkageConfig
import org.jetbrains.kotlin.cli.common.allowKotlinPackage
@@ -60,7 +60,7 @@
) {
val (arguments, services, rootDisposable, _, _) = input
setupPlatformSpecificArgumentsAndServices(configuration, arguments, services)
- initializeCommonConfiguration(configuration, arguments)
+ initializeCommonConfiguration(configuration, arguments, rootDisposable)
configuration.jsIncrementalCompilationEnabled = incrementalCompilationIsEnabledForJs(arguments)
val messageCollector = configuration.messageCollector
@@ -85,9 +85,6 @@
arguments.main?.let { configuration.callMainMode = it }
configuration.dce = arguments.irDce
- val zipAccessor = DisposableZipFileSystemAccessor(64)
- Disposer.register(rootDisposable, zipAccessor)
- configuration.zipFileSystemAccessor = zipAccessor
configuration.perModuleOutputName = arguments.irPerModuleOutputName
configuration.icCacheDirectory = arguments.cacheDirectory
configuration.icCacheReadOnly = arguments.icCacheReadonly
@@ -222,8 +219,8 @@
)
}
- internal fun initializeCommonConfiguration(configuration: CompilerConfiguration, arguments: K2JSCompilerArguments) {
- configuration.setupCommonKlibArguments(arguments, canBeMetadataKlibCompilation = false)
+ internal fun initializeCommonConfiguration(configuration: CompilerConfiguration, arguments: K2JSCompilerArguments, rootDisposable: Disposable) {
+ configuration.setupCommonKlibArguments(arguments, canBeMetadataKlibCompilation = false, rootDisposable = rootDisposable)
val libraries: List<String> = configureLibraries(arguments.libraries) + listOfNotNull(arguments.includes)
val friendLibraries: List<String> = configureLibraries(arguments.friendModules)
diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/klibArguments.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/klibArguments.kt
index 1697ec3..ccce865 100644
--- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/klibArguments.kt
+++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/klibArguments.kt
@@ -5,22 +5,17 @@
package org.jetbrains.kotlin.cli.common
+import com.intellij.openapi.Disposable
+import com.intellij.openapi.util.Disposer
import org.jetbrains.kotlin.cli.common.arguments.CommonKlibBasedCompilerArguments
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
+import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.config.CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS
-import org.jetbrains.kotlin.config.CompilerConfiguration
-import org.jetbrains.kotlin.config.DuplicatedUniqueNameStrategy
-import org.jetbrains.kotlin.config.KlibAbiCompatibilityLevel
-import org.jetbrains.kotlin.config.LanguageFeature
-import org.jetbrains.kotlin.config.LanguageVersion
-import org.jetbrains.kotlin.config.customKlibAbiVersion
-import org.jetbrains.kotlin.config.duplicatedUniqueNameStrategy
-import org.jetbrains.kotlin.config.klibAbiCompatibilityLevel
-import org.jetbrains.kotlin.config.klibNormalizeAbsolutePath
-import org.jetbrains.kotlin.config.klibRelativePathBases
-import org.jetbrains.kotlin.config.messageCollector
-import org.jetbrains.kotlin.config.produceKlibSignaturesClashChecks
+import org.jetbrains.kotlin.config.zipFileSystemAccessor
+import org.jetbrains.kotlin.konan.file.ZipFileSystemAccessor
+import org.jetbrains.kotlin.konan.file.ZipFileSystemCacheableAccessor
+import org.jetbrains.kotlin.konan.file.ZipFileSystemInPlaceAccessor
import org.jetbrains.kotlin.library.KotlinAbiVersion
import java.util.EnumMap
import kotlin.collections.plus
@@ -31,7 +26,8 @@
*/
fun CompilerConfiguration.setupCommonKlibArguments(
arguments: CommonKlibBasedCompilerArguments,
- canBeMetadataKlibCompilation: Boolean
+ canBeMetadataKlibCompilation: Boolean,
+ rootDisposable: Disposable,
) {
val isKlibMetadataCompilation = canBeMetadataKlibCompilation && arguments.metadataKlib
@@ -55,6 +51,8 @@
if (!isKlibMetadataCompilation) {
setupKlibAbiCompatibilityLevel()
}
+
+ zipFileSystemAccessor = getZipFileSystemAccessor(arguments, messageCollector, rootDisposable)
}
/**
@@ -76,6 +74,8 @@
// ABI compatibility level (the one that actually affects the KLIB serialization).
klibAbiCompatibilityLevel = source.klibAbiCompatibilityLevel
+
+ zipFileSystemAccessor = source.zipFileSystemAccessor
}
private fun parseCustomKotlinAbiVersion(customKlibAbiVersion: String?, collector: MessageCollector): KotlinAbiVersion? {
@@ -99,6 +99,39 @@
return KotlinAbiVersion(version[0], version[1], version[2])
}
+private fun getZipFileSystemAccessor(
+ arguments: CommonKlibBasedCompilerArguments,
+ collector: MessageCollector,
+ rootDisposable: Disposable,
+): ZipFileSystemAccessor? {
+ val cacheLimit = arguments.klibZipFileAccessorCacheLimit.toIntOrNull()
+ if (cacheLimit == null || cacheLimit < 0) {
+ collector.report(
+ CompilerMessageSeverity.ERROR,
+ buildString {
+ append("Cannot parse -Xklib-zip-file-accessor-cache-limit value: \"${arguments.klibZipFileAccessorCacheLimit}\". ")
+ append("It must be an integer >= 0.")
+ }
+ )
+ return null
+ }
+ return if (cacheLimit > 0) {
+ DisposableZipFileSystemAccessor(cacheLimit).also { Disposer.register(rootDisposable, it) }
+ } else {
+ ZipFileSystemInPlaceAccessor
+ }
+}
+
+private class DisposableZipFileSystemAccessor(
+ private val zipAccessor: ZipFileSystemCacheableAccessor
+) : Disposable, ZipFileSystemAccessor by zipAccessor {
+ constructor(cacheLimit: Int) : this(ZipFileSystemCacheableAccessor(cacheLimit))
+
+ override fun dispose() {
+ zipAccessor.reset()
+ }
+}
+
private fun CompilerConfiguration.setupKlibAbiCompatibilityLevel() {
val languageVersionSettings = this[LANGUAGE_VERSION_SETTINGS]
?: error("Language version settings should be already set up")
diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/loadMetadataKlibs.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/loadMetadataKlibs.kt
index e011953..f83d977 100644
--- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/loadMetadataKlibs.kt
+++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/loadMetadataKlibs.kt
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.backend.common
import org.jetbrains.kotlin.config.CompilerConfiguration
+import org.jetbrains.kotlin.config.zipFileSystemAccessor
import org.jetbrains.kotlin.library.loader.KlibLoader
/**
@@ -17,6 +18,7 @@
fun loadMetadataKlibs(libraryPaths: List<String>, configuration: CompilerConfiguration): LoadedKlibs {
val result = KlibLoader {
libraryPaths(libraryPaths)
+ configuration.zipFileSystemAccessor?.let { zipFileSystemAccessor(it)}
// IMPORTANT: Do not set any ABI version requirements - metadata libraries are not supposed to have any ABI.
}.load()
result.reportLoadingProblemsIfAny(configuration)
diff --git a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/loadJvmKlibs.kt b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/loadJvmKlibs.kt
index 34b24ab..fdc284e 100644
--- a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/loadJvmKlibs.kt
+++ b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/loadJvmKlibs.kt
@@ -4,6 +4,7 @@
import org.jetbrains.kotlin.backend.common.reportLoadingProblemsIfAny
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.klibPaths
+import org.jetbrains.kotlin.config.zipFileSystemAccessor
import org.jetbrains.kotlin.library.loader.KlibLoader
/**
@@ -12,7 +13,10 @@
* @param configuration The current compiler configuration.
*/
fun loadJvmKlibs(configuration: CompilerConfiguration): LoadedKlibs {
- val result = KlibLoader { libraryPaths(configuration.klibPaths) }.load()
+ val result = KlibLoader {
+ libraryPaths(configuration.klibPaths)
+ configuration.zipFileSystemAccessor?.let { zipFileSystemAccessor(it)}
+ }.load()
result.reportLoadingProblemsIfAny(configuration, allAsErrors = true)
return LoadedKlibs(all = result.librariesStdlibFirst)
}
diff --git a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/loadNativeKlibs.kt b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/loadNativeKlibs.kt
index f1c27f1..5a75e83 100644
--- a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/loadNativeKlibs.kt
+++ b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/loadNativeKlibs.kt
@@ -10,6 +10,7 @@
import org.jetbrains.kotlin.backend.common.loadFriendLibraries
import org.jetbrains.kotlin.backend.common.reportLoadingProblemsIfAny
import org.jetbrains.kotlin.config.CompilerConfiguration
+import org.jetbrains.kotlin.config.zipFileSystemAccessor
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.library.KotlinAbiVersion
import org.jetbrains.kotlin.library.loader.KlibLoader
@@ -38,6 +39,7 @@
libraryPaths(libraryPaths)
platformChecker(KlibPlatformChecker.Native(nativeTarget.name))
maxPermittedAbiVersion(KotlinAbiVersion.CURRENT)
+ configuration.zipFileSystemAccessor?.let { zipFileSystemAccessor(it)}
}.load()
.apply { reportLoadingProblemsIfAny(configuration, allAsErrors = true) }
// TODO (KT-76785): Handling of duplicated names is a workaround that needs to be removed in the future.
diff --git a/compiler/testData/cli/js/jsExtraHelp.out b/compiler/testData/cli/js/jsExtraHelp.out
index c9d9e2c..955f2d6 100644
--- a/compiler/testData/cli/js/jsExtraHelp.out
+++ b/compiler/testData/cli/js/jsExtraHelp.out
@@ -78,6 +78,8 @@
-Xklib-abi-version=<version> Specify the custom ABI version to be written in KLIB. This option is intended only for tests.
Warning: This option does not affect KLIB ABI. Neither allows it making a KLIB backward-compatible with older ABI versions.
The only observable effect is that a custom ABI version is written to KLIB manifest file.
+ -Xklib-zip-file-accessor-cache-limit
+ Maximum number of klibs that can be cached during compilation. Default is 64.
-Xrepl Run Kotlin REPL (deprecated)
-Xno-inline Disable method inlining.
-Xskip-metadata-version-check Allow loading classes with bad metadata versions and pre-release classes.
diff --git a/native/cli-native/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/native/cli-native/src/org/jetbrains/kotlin/cli/bc/K2Native.kt
index 32b1155..a88c930 100644
--- a/native/cli-native/src/org/jetbrains/kotlin/cli/bc/K2Native.kt
+++ b/native/cli-native/src/org/jetbrains/kotlin/cli/bc/K2Native.kt
@@ -106,7 +106,7 @@
configuration.phaseConfig = createPhaseConfig(arguments)
// Values for keys for non-nullable arguments below must be also copied during 1st stage preparation within `KonanDriver.splitOntoTwoStages()`
- configuration.setupCommonKlibArguments(arguments, canBeMetadataKlibCompilation = true)
+ configuration.setupCommonKlibArguments(arguments, canBeMetadataKlibCompilation = true, rootDisposable)
return environment
}