Skip to content

Commit c90cd1c

Browse files
committed
Create a compiler argument to adjust the klib zip file cache.
^KT-79675
1 parent 7de5742 commit c90cd1c

File tree

12 files changed

+113
-43
lines changed

12 files changed

+113
-43
lines changed

compiler/arguments/resources/kotlin-compiler-arguments.json

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6391,6 +6391,37 @@
63916391
"deprecatedVersion": null,
63926392
"removedVersion": null
63936393
}
6394+
},
6395+
{
6396+
"name": "Xklib-zip-file-accessor-cache-limit",
6397+
"shortName": null,
6398+
"deprecatedName": null,
6399+
"description": {
6400+
"current": "Maximum number of klibs that can be cached during compilation. Default is 64.",
6401+
"valueInVersions": []
6402+
},
6403+
"delimiter": null,
6404+
"valueType": {
6405+
"type": "org.jetbrains.kotlin.arguments.dsl.types.IntType",
6406+
"isNullable": {
6407+
"current": false,
6408+
"valueInVersions": []
6409+
},
6410+
"defaultValue": {
6411+
"current": 64,
6412+
"valueInVersions": []
6413+
}
6414+
},
6415+
"valueDescription": {
6416+
"current": null,
6417+
"valueInVersions": []
6418+
},
6419+
"releaseVersionsMetadata": {
6420+
"introducedVersion": "2.3.0",
6421+
"stabilizedVersion": null,
6422+
"deprecatedVersion": null,
6423+
"removedVersion": null
6424+
}
63946425
}
63956426
],
63966427
"nestedLevels": [

compiler/arguments/src/org/jetbrains/kotlin/arguments/description/CommonKlibBasedCompilerArguments.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.arguments.dsl.defaultFalse
1010
import org.jetbrains.kotlin.arguments.dsl.defaultNull
1111
import org.jetbrains.kotlin.arguments.dsl.defaultTrue
1212
import org.jetbrains.kotlin.arguments.dsl.types.BooleanType
13+
import org.jetbrains.kotlin.arguments.dsl.types.IntType
1314
import org.jetbrains.kotlin.arguments.dsl.types.StringArrayType
1415
import org.jetbrains.kotlin.arguments.dsl.types.StringType
1516

@@ -107,4 +108,16 @@ The only observable effect is that a custom ABI version is written to KLIB manif
107108
introducedVersion = KotlinReleaseVersion.v2_2_0,
108109
)
109110
}
111+
112+
compilerArgument {
113+
name = "Xklib-zip-file-accessor-cache-limit"
114+
description = "Maximum number of klibs that can be cached during compilation. Default is 64.".asReleaseDependent()
115+
valueType = IntType(
116+
defaultValue = 64.asReleaseDependent()
117+
)
118+
119+
lifecycle(
120+
introducedVersion = KotlinReleaseVersion.v2_3_0
121+
)
122+
}
110123
}

compiler/arguments/src/org/jetbrains/kotlin/arguments/description/NativeCompilerArguments.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1062,7 +1062,8 @@ The default value is 1.""".asReleaseDependent()
10621062

10631063
compilerArgument {
10641064
name = "Xmanifest-native-targets"
1065-
description = "Comma-separated list that will be written as the value of 'native_targets' property in the .klib manifest. Unknown values are discarded.".asReleaseDependent()
1065+
description =
1066+
"Comma-separated list that will be written as the value of 'native_targets' property in the .klib manifest. Unknown values are discarded.".asReleaseDependent()
10661067
valueType = StringArrayType.defaultNull
10671068

10681069
lifecycle(

compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonKlibBasedCompilerArguments.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,14 @@ The only observable effect is that a custom ABI version is written to KLIB manif
9595
field = if (value.isNullOrEmpty()) null else value
9696
}
9797

98+
@Argument(
99+
value = "-Xklib-zip-file-accessor-cache-limit",
100+
description = "Maximum number of klibs that can be cached during compilation. Default is 64.",
101+
)
102+
var klibZipFileAccessorCacheLimit: String = "64"
103+
set(value) {
104+
checkFrozen()
105+
field = value
106+
}
107+
98108
}

compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/Helpers.kt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package org.jetbrains.kotlin.cli.js
77

8-
import com.intellij.openapi.Disposable
98
import com.intellij.util.ExceptionUtil
109
import org.jetbrains.kotlin.backend.js.JsGenerationGranularity
1110
import org.jetbrains.kotlin.backend.js.TsCompilationStrategy
@@ -23,8 +22,6 @@ import org.jetbrains.kotlin.js.config.EcmaVersion
2322
import org.jetbrains.kotlin.js.config.SourceMapNamesPolicy
2423
import org.jetbrains.kotlin.js.config.SourceMapSourceEmbedding
2524
import org.jetbrains.kotlin.js.config.wasmCompilation
26-
import org.jetbrains.kotlin.konan.file.ZipFileSystemAccessor
27-
import org.jetbrains.kotlin.konan.file.ZipFileSystemCacheableAccessor
2825
import org.jetbrains.kotlin.library.loader.KlibPlatformChecker
2926
import org.jetbrains.kotlin.psi.KtFile
3027
import org.jetbrains.kotlin.serialization.js.ModuleKind
@@ -60,16 +57,6 @@ val K2JSCompilerArguments.dtsStrategy: TsCompilationStrategy
6057
else -> TsCompilationStrategy.MERGED
6158
}
6259

63-
internal class DisposableZipFileSystemAccessor private constructor(
64-
private val zipAccessor: ZipFileSystemCacheableAccessor,
65-
) : Disposable, ZipFileSystemAccessor by zipAccessor {
66-
constructor(cacheLimit: Int) : this(ZipFileSystemCacheableAccessor(cacheLimit))
67-
68-
override fun dispose() {
69-
zipAccessor.reset()
70-
}
71-
}
72-
7360
internal val sourceMapContentEmbeddingMap: Map<String, SourceMapSourceEmbedding> = mapOf(
7461
K2JsArgumentConstants.SOURCE_MAP_SOURCE_CONTENT_ALWAYS to SourceMapSourceEmbedding.ALWAYS,
7562
K2JsArgumentConstants.SOURCE_MAP_SOURCE_CONTENT_NEVER to SourceMapSourceEmbedding.NEVER,

compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package org.jetbrains.kotlin.cli.js
77

88
import com.intellij.openapi.Disposable
9-
import com.intellij.openapi.util.Disposer
109
import org.jetbrains.kotlin.analyzer.CompilationErrorException
1110
import org.jetbrains.kotlin.backend.common.LoadedKlibs
1211
import org.jetbrains.kotlin.cli.common.CLICompiler
@@ -29,7 +28,6 @@ import org.jetbrains.kotlin.cli.pipeline.web.CommonWebConfigurationUpdater
2928
import org.jetbrains.kotlin.cli.pipeline.web.WebCliPipeline
3029
import org.jetbrains.kotlin.config.CommonConfigurationKeys
3130
import org.jetbrains.kotlin.config.CompilerConfiguration
32-
import org.jetbrains.kotlin.config.KlibConfigurationKeys
3331
import org.jetbrains.kotlin.config.Services
3432
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
3533
import org.jetbrains.kotlin.ir.backend.js.*
@@ -119,14 +117,10 @@ class K2JSCompiler : CLICompiler<K2JSCompilerArguments>() {
119117
val pluginLoadResult = loadPlugins(paths, arguments, configuration, rootDisposable)
120118
if (pluginLoadResult != OK) return pluginLoadResult
121119

122-
CommonWebConfigurationUpdater.initializeCommonConfiguration(compilerImpl.configuration, arguments)
120+
CommonWebConfigurationUpdater.initializeCommonConfiguration(compilerImpl.configuration, arguments, rootDisposable)
123121

124122
val targetEnvironment = compilerImpl.tryInitializeCompiler(rootDisposable) ?: return COMPILATION_ERROR
125123

126-
val zipAccessor = DisposableZipFileSystemAccessor(64)
127-
Disposer.register(rootDisposable, zipAccessor)
128-
targetEnvironment.configuration.put(KlibConfigurationKeys.ZIP_FILE_SYSTEM_ACCESSOR, zipAccessor)
129-
130124
val sourcesFiles = targetEnvironment.getSourceFiles()
131125

132126
if (!checkKotlinPackageUsageForPsi(targetEnvironment.configuration, sourcesFiles)) return COMPILATION_ERROR

compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/pipeline/web/WebConfigurationPhase.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package org.jetbrains.kotlin.cli.pipeline.web
77

8-
import com.intellij.openapi.util.Disposer
8+
import com.intellij.openapi.Disposable
99
import com.intellij.openapi.util.text.StringUtil
1010
import org.jetbrains.kotlin.backend.common.linkage.partial.setupPartialLinkageConfig
1111
import org.jetbrains.kotlin.cli.common.allowKotlinPackage
@@ -60,7 +60,7 @@ object CommonWebConfigurationUpdater : ConfigurationUpdater<K2JSCompilerArgument
6060
) {
6161
val (arguments, services, rootDisposable, _, _) = input
6262
setupPlatformSpecificArgumentsAndServices(configuration, arguments, services)
63-
initializeCommonConfiguration(configuration, arguments)
63+
initializeCommonConfiguration(configuration, arguments, rootDisposable)
6464
configuration.jsIncrementalCompilationEnabled = incrementalCompilationIsEnabledForJs(arguments)
6565

6666
val messageCollector = configuration.messageCollector
@@ -85,9 +85,6 @@ object CommonWebConfigurationUpdater : ConfigurationUpdater<K2JSCompilerArgument
8585
arguments.main?.let { configuration.callMainMode = it }
8686
configuration.dce = arguments.irDce
8787

88-
val zipAccessor = DisposableZipFileSystemAccessor(64)
89-
Disposer.register(rootDisposable, zipAccessor)
90-
configuration.zipFileSystemAccessor = zipAccessor
9188
configuration.perModuleOutputName = arguments.irPerModuleOutputName
9289
configuration.icCacheDirectory = arguments.cacheDirectory
9390
configuration.icCacheReadOnly = arguments.icCacheReadonly
@@ -222,8 +219,8 @@ object CommonWebConfigurationUpdater : ConfigurationUpdater<K2JSCompilerArgument
222219
)
223220
}
224221

225-
internal fun initializeCommonConfiguration(configuration: CompilerConfiguration, arguments: K2JSCompilerArguments) {
226-
configuration.setupCommonKlibArguments(arguments, canBeMetadataKlibCompilation = false)
222+
internal fun initializeCommonConfiguration(configuration: CompilerConfiguration, arguments: K2JSCompilerArguments, rootDisposable: Disposable) {
223+
configuration.setupCommonKlibArguments(arguments, canBeMetadataKlibCompilation = false, rootDisposable = rootDisposable)
227224

228225
val libraries: List<String> = configureLibraries(arguments.libraries) + listOfNotNull(arguments.includes)
229226
val friendLibraries: List<String> = configureLibraries(arguments.friendModules)

compiler/cli/src/org/jetbrains/kotlin/cli/common/klibArguments.kt

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,16 @@
55

66
package org.jetbrains.kotlin.cli.common
77

8+
import com.intellij.openapi.Disposable
9+
import com.intellij.openapi.util.Disposer
810
import org.jetbrains.kotlin.cli.common.arguments.CommonKlibBasedCompilerArguments
911
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
1012
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
13+
import org.jetbrains.kotlin.config.*
1114
import org.jetbrains.kotlin.config.CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS
12-
import org.jetbrains.kotlin.config.CompilerConfiguration
13-
import org.jetbrains.kotlin.config.DuplicatedUniqueNameStrategy
14-
import org.jetbrains.kotlin.config.KlibAbiCompatibilityLevel
15-
import org.jetbrains.kotlin.config.LanguageFeature
16-
import org.jetbrains.kotlin.config.LanguageVersion
17-
import org.jetbrains.kotlin.config.customKlibAbiVersion
18-
import org.jetbrains.kotlin.config.duplicatedUniqueNameStrategy
19-
import org.jetbrains.kotlin.config.klibAbiCompatibilityLevel
20-
import org.jetbrains.kotlin.config.klibNormalizeAbsolutePath
21-
import org.jetbrains.kotlin.config.klibRelativePathBases
22-
import org.jetbrains.kotlin.config.messageCollector
23-
import org.jetbrains.kotlin.config.produceKlibSignaturesClashChecks
15+
import org.jetbrains.kotlin.konan.file.ZipFileSystemAccessor
16+
import org.jetbrains.kotlin.konan.file.ZipFileSystemCacheableAccessor
17+
import org.jetbrains.kotlin.konan.file.ZipFileSystemInPlaceAccessor
2418
import org.jetbrains.kotlin.library.KotlinAbiVersion
2519
import java.util.EnumMap
2620
import kotlin.collections.plus
@@ -31,7 +25,8 @@ import kotlin.collections.plus
3125
*/
3226
fun CompilerConfiguration.setupCommonKlibArguments(
3327
arguments: CommonKlibBasedCompilerArguments,
34-
canBeMetadataKlibCompilation: Boolean
28+
canBeMetadataKlibCompilation: Boolean,
29+
rootDisposable: Disposable
3530
) {
3631
val isKlibMetadataCompilation = canBeMetadataKlibCompilation && arguments.metadataKlib
3732

@@ -55,6 +50,9 @@ fun CompilerConfiguration.setupCommonKlibArguments(
5550
if (!isKlibMetadataCompilation) {
5651
setupKlibAbiCompatibilityLevel()
5752
}
53+
54+
zipFileSystemAccessor = getZipFileSystemAccessor(arguments, messageCollector)
55+
(zipFileSystemAccessor as? Disposable)?.let { Disposer.register(rootDisposable, it) }
5856
}
5957

6058
/**
@@ -76,6 +74,8 @@ fun CompilerConfiguration.copyCommonKlibArgumentsFrom(source: CompilerConfigurat
7674

7775
// ABI compatibility level (the one that actually affects the KLIB serialization).
7876
klibAbiCompatibilityLevel = source.klibAbiCompatibilityLevel
77+
78+
zipFileSystemAccessor = source.zipFileSystemAccessor
7979
}
8080

8181
private fun parseCustomKotlinAbiVersion(customKlibAbiVersion: String?, collector: MessageCollector): KotlinAbiVersion? {
@@ -99,6 +99,35 @@ private fun parseCustomKotlinAbiVersion(customKlibAbiVersion: String?, collector
9999
return KotlinAbiVersion(version[0], version[1], version[2])
100100
}
101101

102+
private fun getZipFileSystemAccessor(arguments: CommonKlibBasedCompilerArguments, collector: MessageCollector): ZipFileSystemAccessor? {
103+
val cacheLimit = arguments.klibZipFileAccessorCacheLimit.toIntOrNull()
104+
if (cacheLimit == null || cacheLimit < 0) {
105+
collector.report(
106+
CompilerMessageSeverity.ERROR,
107+
buildString {
108+
append("Cannot parse -Xklib-zip-file-accessor-cache-limit value: \"${arguments.klibZipFileAccessorCacheLimit}\". ")
109+
append("It must be an integer >= 0.")
110+
}
111+
)
112+
return null
113+
}
114+
if (cacheLimit > 0) {
115+
return DisposableZipFileSystemAccessor(cacheLimit)
116+
} else {
117+
return ZipFileSystemInPlaceAccessor
118+
}
119+
}
120+
121+
private class DisposableZipFileSystemAccessor(
122+
private val zipAccessor: ZipFileSystemCacheableAccessor
123+
) : Disposable, ZipFileSystemAccessor by zipAccessor {
124+
constructor(cacheLimit: Int) : this(ZipFileSystemCacheableAccessor(cacheLimit))
125+
126+
override fun dispose() {
127+
zipAccessor.reset()
128+
}
129+
}
130+
102131
private fun CompilerConfiguration.setupKlibAbiCompatibilityLevel() {
103132
val languageVersionSettings = this[LANGUAGE_VERSION_SETTINGS]
104133
?: error("Language version settings should be already set up")

compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/loadMetadataKlibs.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org.jetbrains.kotlin.backend.common
77

88
import org.jetbrains.kotlin.config.CompilerConfiguration
9+
import org.jetbrains.kotlin.config.zipFileSystemAccessor
910
import org.jetbrains.kotlin.library.loader.KlibLoader
1011

1112
/**
@@ -17,6 +18,7 @@ import org.jetbrains.kotlin.library.loader.KlibLoader
1718
fun loadMetadataKlibs(libraryPaths: List<String>, configuration: CompilerConfiguration): LoadedKlibs {
1819
val result = KlibLoader {
1920
libraryPaths(libraryPaths)
21+
configuration.zipFileSystemAccessor?.let { zipFileSystemAccessor(it)}
2022
// IMPORTANT: Do not set any ABI version requirements - metadata libraries are not supposed to have any ABI.
2123
}.load()
2224
result.reportLoadingProblemsIfAny(configuration)

compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/loadJvmKlibs.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.jetbrains.kotlin.backend.common.LoadedKlibs
44
import org.jetbrains.kotlin.backend.common.reportLoadingProblemsIfAny
55
import org.jetbrains.kotlin.config.CompilerConfiguration
66
import org.jetbrains.kotlin.config.klibPaths
7+
import org.jetbrains.kotlin.config.zipFileSystemAccessor
78
import org.jetbrains.kotlin.library.loader.KlibLoader
89

910
/**
@@ -12,7 +13,10 @@ import org.jetbrains.kotlin.library.loader.KlibLoader
1213
* @param configuration The current compiler configuration.
1314
*/
1415
fun loadJvmKlibs(configuration: CompilerConfiguration): LoadedKlibs {
15-
val result = KlibLoader { libraryPaths(configuration.klibPaths) }.load()
16+
val result = KlibLoader {
17+
libraryPaths(configuration.klibPaths)
18+
configuration.zipFileSystemAccessor?.let { zipFileSystemAccessor(it)}
19+
}.load()
1620
result.reportLoadingProblemsIfAny(configuration, allAsErrors = true)
1721
return LoadedKlibs(all = result.librariesStdlibFirst)
1822
}

0 commit comments

Comments
 (0)