[IR][Native] Decouple CacheDeserializationStrategy from KonanIrLinker ^KT-73754 Fixed
diff --git a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/CacheDeserializationStrategyBase.kt b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/CacheDeserializationStrategyBase.kt new file mode 100644 index 0000000..056366c --- /dev/null +++ b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/CacheDeserializationStrategyBase.kt
@@ -0,0 +1,16 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.konan + +import org.jetbrains.kotlin.library.KotlinLibrary +import org.jetbrains.kotlin.name.FqName + +class PartialCacheInfo(val klib: KotlinLibrary, val strategy: CacheDeserializationStrategyBase) + +abstract class CacheDeserializationStrategyBase { + abstract fun contains(filePath: String): Boolean + abstract fun contains(fqName: FqName, fileName: String): Boolean +}
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheDeserializationStrategy.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheDeserializationStrategy.kt new file mode 100644 index 0000000..712b685 --- /dev/null +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheDeserializationStrategy.kt
@@ -0,0 +1,38 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.konan + +import org.jetbrains.kotlin.konan.file.File +import org.jetbrains.kotlin.name.FqName + +object CacheDeserializationStrategy { + object Nothing : CacheDeserializationStrategyBase() { + override fun contains(filePath: String) = false + override fun contains(fqName: FqName, fileName: String) = false + } + + object WholeModule : CacheDeserializationStrategyBase() { + override fun contains(filePath: String) = true + override fun contains(fqName: FqName, fileName: String) = true + } + + class SingleFile(val filePath: String, val fqName: String) : CacheDeserializationStrategyBase() { + override fun contains(filePath: String) = filePath == this.filePath + + override fun contains(fqName: FqName, fileName: String) = + fqName.asString() == this.fqName && File(filePath).name == fileName + } + + class MultipleFiles(filePaths: List<String>, fqNames: List<String>) : CacheDeserializationStrategyBase() { + private val filePaths = filePaths.toSet() + + private val fqNamesWithNames = fqNames.mapIndexed { i: Int, fqName: String -> Pair(fqName, File(filePaths[i]).name) }.toSet() + + override fun contains(filePath: String) = filePath in filePaths + + override fun contains(fqName: FqName, fileName: String) = Pair(fqName.asString(), fileName) in fqNamesWithNames + } +}
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheSupport.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheSupport.kt index 2fa0886..a64d56f 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheSupport.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheSupport.kt
@@ -44,40 +44,6 @@ } } -sealed class CacheDeserializationStrategy { - abstract fun contains(filePath: String): Boolean - abstract fun contains(fqName: FqName, fileName: String): Boolean - - object Nothing : CacheDeserializationStrategy() { - override fun contains(filePath: String) = false - override fun contains(fqName: FqName, fileName: String) = false - } - - object WholeModule : CacheDeserializationStrategy() { - override fun contains(filePath: String) = true - override fun contains(fqName: FqName, fileName: String) = true - } - - class SingleFile(val filePath: String, val fqName: String) : CacheDeserializationStrategy() { - override fun contains(filePath: String) = filePath == this.filePath - - override fun contains(fqName: FqName, fileName: String) = - fqName.asString() == this.fqName && File(filePath).name == fileName - } - - class MultipleFiles(filePaths: List<String>, fqNames: List<String>) : CacheDeserializationStrategy() { - private val filePaths = filePaths.toSet() - - private val fqNamesWithNames = fqNames.mapIndexed { i: Int, fqName: String -> Pair(fqName, File(filePaths[i]).name) }.toSet() - - override fun contains(filePath: String) = filePath in filePaths - - override fun contains(fqName: FqName, fileName: String) = Pair(fqName.asString(), fileName) in fqNamesWithNames - } -} - -class PartialCacheInfo(val klib: KotlinLibrary, val strategy: CacheDeserializationStrategy) - class CacheSupport( private val configuration: CompilerConfiguration, private val resolvedLibraries: KotlinLibraryResolveResult, @@ -109,7 +75,7 @@ incrementalCacheDirectory?.let { add(it) } } - internal fun tryGetImplicitOutput(cacheDeserializationStrategy: CacheDeserializationStrategy?): String? { + internal fun tryGetImplicitOutput(cacheDeserializationStrategy: CacheDeserializationStrategyBase?): String? { val libraryToCache = libraryToCache ?: return null // Put the resulting library in the first cache directory. val cacheDirectory = implicitCacheDirectories.firstOrNull() ?: return null
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt index b00ec54..666e3eb 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt
@@ -38,7 +38,7 @@ val CompilerOutputKind.involvesBitcodeGeneration: Boolean get() = this != CompilerOutputKind.LIBRARY -internal val CacheDeserializationStrategy?.containsKFunctionImpl: Boolean +internal val CacheDeserializationStrategyBase?.containsKFunctionImpl: Boolean get() = this?.contains(KonanFqNames.internalPackageName, "KFunctionImpl.kt") != false internal val NativeGenerationState.shouldDefineFunctionClasses: Boolean @@ -48,7 +48,7 @@ get() = producedLlvmModuleContainsStdlib && cacheDeserializationStrategy?.contains(KonanFqNames.internalPackageName, "Boxing.kt") != false -internal val CacheDeserializationStrategy?.containsRuntime: Boolean +internal val CacheDeserializationStrategyBase?.containsRuntime: Boolean get() = this?.contains(KonanFqNames.internalPackageName, "Runtime.kt") != false internal val NativeGenerationState.shouldLinkRuntimeNativeLibraries: Boolean
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeGenerationState.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeGenerationState.kt index e39237075..0786e20 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeGenerationState.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeGenerationState.kt
@@ -53,7 +53,7 @@ // TODO: Get rid of this property completely once transition to the dynamic driver is complete. // It will reduce code coupling and make it easier to create NativeGenerationState instances. val context: Context, - val cacheDeserializationStrategy: CacheDeserializationStrategy?, + val cacheDeserializationStrategy: CacheDeserializationStrategyBase?, val dependenciesTracker: DependenciesTracker, val llvmModuleSpecification: LlvmModuleSpecification, val outputFiles: OutputFiles,
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt index 9af2198..edf8b6e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt
@@ -278,7 +278,7 @@ private data class BackendJobFragment( val irModule: IrModuleFragment, - val cacheDeserializationStrategy: CacheDeserializationStrategy?, + val cacheDeserializationStrategy: CacheDeserializationStrategyBase?, val dependenciesTracker: DependenciesTracker, val llvmModuleSpecification: LlvmModuleSpecification, val performanceManager: CommonCompilerPerformanceManager?,
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/utilities/FileManagement.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/utilities/FileManagement.kt index 2a2d18b..9f8a258 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/utilities/FileManagement.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/utilities/FileManagement.kt
@@ -6,13 +6,14 @@ package org.jetbrains.kotlin.backend.konan.driver.utilities import org.jetbrains.kotlin.backend.konan.CacheDeserializationStrategy +import org.jetbrains.kotlin.backend.konan.CacheDeserializationStrategyBase import org.jetbrains.kotlin.backend.konan.CacheSupport import org.jetbrains.kotlin.backend.konan.KonanConfig import org.jetbrains.kotlin.backend.konan.KonanConfigKeys import org.jetbrains.kotlin.konan.TempFiles import java.io.File -internal fun createTempFiles(config: KonanConfig, cacheDeserializationStrategy: CacheDeserializationStrategy?): TempFiles { +internal fun createTempFiles(config: KonanConfig, cacheDeserializationStrategy: CacheDeserializationStrategyBase?): TempFiles { val pathToTempDir = config.configuration.get(KonanConfigKeys.TEMPORARY_FILES_DIR)?.let { val singleFileStrategy = cacheDeserializationStrategy as? CacheDeserializationStrategy.SingleFile if (singleFileStrategy == null)
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPartialModuleDeserializer.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPartialModuleDeserializer.kt index e583ea8..30fe9be 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPartialModuleDeserializer.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPartialModuleDeserializer.kt
@@ -42,7 +42,7 @@ private val cachedLibraries: CachedLibraries, private val inlineFunctionFiles: MutableMap<IrExternalPackageFragment, IrFile>, strategyResolver: (String) -> DeserializationStrategy, - private val cacheDeserializationStrategy: CacheDeserializationStrategy, + private val cacheDeserializationStrategy: CacheDeserializationStrategyBase, containsErrorCode: Boolean = false ) : BasicIrModuleDeserializer(konanIrLinker, moduleDescriptor, klib, { fileName ->