Skip to content

Commit 866574b

Browse files
committed
Create a compiler argument to adjust the klib zip file cache.
^KT-79675
1 parent 5360a8d commit 866574b

File tree

13 files changed

+130
-34
lines changed

13 files changed

+130
-34
lines changed

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6292,6 +6292,37 @@
62926292
"deprecatedVersion": null,
62936293
"removedVersion": null
62946294
}
6295+
},
6296+
{
6297+
"name": "Xklib-zip-file-accessor-cache-limit",
6298+
"shortName": null,
6299+
"deprecatedName": null,
6300+
"description": {
6301+
"current": "Maximum number of klibs that can be cached during compilation. Default is 64.",
6302+
"valueInVersions": []
6303+
},
6304+
"delimiter": null,
6305+
"valueType": {
6306+
"type": "org.jetbrains.kotlin.arguments.dsl.types.IntType",
6307+
"isNullable": {
6308+
"current": false,
6309+
"valueInVersions": []
6310+
},
6311+
"defaultValue": {
6312+
"current": 64,
6313+
"valueInVersions": []
6314+
}
6315+
},
6316+
"valueDescription": {
6317+
"current": null,
6318+
"valueInVersions": []
6319+
},
6320+
"releaseVersionsMetadata": {
6321+
"introducedVersion": "2.3.0",
6322+
"stabilizedVersion": null,
6323+
"deprecatedVersion": null,
6324+
"removedVersion": null
6325+
}
62956326
}
62966327
],
62976328
"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
@@ -1069,7 +1069,8 @@ The default value is 1.""".asReleaseDependent()
10691069

10701070
compilerArgument {
10711071
name = "Xmanifest-native-targets"
1072-
description = "Comma-separated list that will be written as the value of 'native_targets' property in the .klib manifest. Unknown values are discarded.".asReleaseDependent()
1072+
description =
1073+
"Comma-separated list that will be written as the value of 'native_targets' property in the .klib manifest. Unknown values are discarded.".asReleaseDependent()
10731074
valueType = StringArrayType.defaultNull
10741075

10751076
lifecycle(

compiler/build-tools/kotlin-build-tools-api/gen/org/jetbrains/kotlin/buildtools/api/arguments/CommonKlibBasedArguments.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package org.jetbrains.kotlin.buildtools.api.arguments
55

66
import kotlin.Array
77
import kotlin.Boolean
8+
import kotlin.Int
89
import kotlin.String
910
import kotlin.jvm.JvmField
1011

@@ -118,5 +119,15 @@ public interface CommonKlibBasedArguments : CommonCompilerArguments {
118119
@ExperimentalCompilerArgument
119120
public val X_KLIB_ABI_VERSION: CommonKlibBasedArgument<String?> =
120121
CommonKlibBasedArgument("X_KLIB_ABI_VERSION")
122+
123+
/**
124+
* Maximum number of klibs that can be cached during compilation. Default is 64.
125+
*
126+
* WARNING: this option is EXPERIMENTAL and it may be changed in the future without notice or may be removed entirely.
127+
*/
128+
@JvmField
129+
@ExperimentalCompilerArgument
130+
public val X_KLIB_ZIP_FILE_ACCESSOR_CACHE_LIMIT: CommonKlibBasedArgument<Int> =
131+
CommonKlibBasedArgument("X_KLIB_ZIP_FILE_ACCESSOR_CACHE_LIMIT")
121132
}
122133
}

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: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ import org.jetbrains.kotlin.cli.pipeline.web.CommonWebConfigurationUpdater
2929
import org.jetbrains.kotlin.cli.pipeline.web.WebCliPipeline
3030
import org.jetbrains.kotlin.config.CommonConfigurationKeys
3131
import org.jetbrains.kotlin.config.CompilerConfiguration
32-
import org.jetbrains.kotlin.config.KlibConfigurationKeys
3332
import org.jetbrains.kotlin.config.Services
33+
import org.jetbrains.kotlin.config.zipFileSystemAccessor
3434
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
3535
import org.jetbrains.kotlin.ir.backend.js.*
3636
import org.jetbrains.kotlin.ir.backend.js.ic.IncrementalCacheGuard
@@ -123,9 +123,10 @@ class K2JSCompiler : CLICompiler<K2JSCompilerArguments>() {
123123

124124
val targetEnvironment = compilerImpl.tryInitializeCompiler(rootDisposable) ?: return COMPILATION_ERROR
125125

126-
val zipAccessor = DisposableZipFileSystemAccessor(64)
127-
Disposer.register(rootDisposable, zipAccessor)
128-
targetEnvironment.configuration.put(KlibConfigurationKeys.ZIP_FILE_SYSTEM_ACCESSOR, zipAccessor)
126+
val zipAccessor = targetEnvironment.configuration.zipFileSystemAccessor
127+
if (zipAccessor is Disposable) {
128+
Disposer.register(rootDisposable, zipAccessor)
129+
}
129130

130131
val sourcesFiles = targetEnvironment.getSourceFiles()
131132

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org.jetbrains.kotlin.cli.pipeline.web
77

88
import com.intellij.openapi.util.Disposer
9+
import com.intellij.openapi.Disposable
910
import com.intellij.openapi.util.text.StringUtil
1011
import org.jetbrains.kotlin.backend.common.linkage.partial.setupPartialLinkageConfig
1112
import org.jetbrains.kotlin.cli.common.allowKotlinPackage
@@ -31,6 +32,7 @@ import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider
3132
import org.jetbrains.kotlin.incremental.js.IncrementalNextRoundChecker
3233
import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer
3334
import org.jetbrains.kotlin.js.config.*
35+
import org.jetbrains.kotlin.konan.file.ZipFileSystemAccessor
3436
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
3537
import org.jetbrains.kotlin.metadata.deserialization.MetadataVersion
3638
import org.jetbrains.kotlin.platform.wasm.WasmTarget
@@ -84,9 +86,10 @@ object CommonWebConfigurationUpdater : ConfigurationUpdater<K2JSCompilerArgument
8486
arguments.main?.let { configuration.callMainMode = it }
8587
configuration.dce = arguments.irDce
8688

87-
val zipAccessor = DisposableZipFileSystemAccessor(64)
88-
Disposer.register(rootDisposable, zipAccessor)
89-
configuration.zipFileSystemAccessor = zipAccessor
89+
val zipAccessor = configuration.zipFileSystemAccessor
90+
if (zipAccessor is Disposable) {
91+
Disposer.register(rootDisposable, zipAccessor)
92+
}
9093
configuration.perModuleOutputName = arguments.irPerModuleOutputName
9194
configuration.icCacheDirectory = arguments.cacheDirectory
9295
configuration.icCacheReadOnly = arguments.icCacheReadonly

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

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,15 @@
55

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

8+
import com.intellij.openapi.Disposable
89
import org.jetbrains.kotlin.cli.common.arguments.CommonKlibBasedCompilerArguments
910
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
1011
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
12+
import org.jetbrains.kotlin.config.*
1113
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
14+
import org.jetbrains.kotlin.konan.file.ZipFileSystemAccessor
15+
import org.jetbrains.kotlin.konan.file.ZipFileSystemCacheableAccessor
16+
import org.jetbrains.kotlin.konan.file.ZipFileSystemInPlaceAccessor
2417
import org.jetbrains.kotlin.library.KotlinAbiVersion
2518
import java.util.EnumMap
2619
import kotlin.collections.plus
@@ -55,6 +48,8 @@ fun CompilerConfiguration.setupCommonKlibArguments(
5548
if (!isKlibMetadataCompilation) {
5649
setupKlibAbiCompatibilityLevel()
5750
}
51+
52+
zipFileSystemAccessor = getZipFileSystemAccessor(arguments, messageCollector)
5853
}
5954

6055
/**
@@ -76,6 +71,8 @@ fun CompilerConfiguration.copyCommonKlibArgumentsFrom(source: CompilerConfigurat
7671

7772
// ABI compatibility level (the one that actually affects the KLIB serialization).
7873
klibAbiCompatibilityLevel = source.klibAbiCompatibilityLevel
74+
75+
zipFileSystemAccessor = source.zipFileSystemAccessor
7976
}
8077

8178
private fun parseCustomKotlinAbiVersion(customKlibAbiVersion: String?, collector: MessageCollector): KotlinAbiVersion? {
@@ -99,6 +96,35 @@ private fun parseCustomKotlinAbiVersion(customKlibAbiVersion: String?, collector
9996
return KotlinAbiVersion(version[0], version[1], version[2])
10097
}
10198

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

0 commit comments

Comments
 (0)