diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index 4cd2a830344..9d8cae222b5 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -425,11 +425,13 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { lateinit var compilerOutput: List - val llvmModuleSpecification: LlvmModuleSpecification = LlvmModuleSpecificationImpl( - config.cachedLibraries, - producingCache = config.produce.isCache, - librariesToCache = config.librariesToCache - ) + val llvmModuleSpecification: LlvmModuleSpecification by lazy { + when { + config.produce.isCache -> + CacheLlvmModuleSpecification(config.cachedLibraries, config.librariesToCache) + else -> DefaultLlvmModuleSpecification(config.cachedLibraries) + } + } val declaredLocalArrays: MutableMap = HashMap() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt index 76e7645947c..5e3ce5256ca 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt @@ -12,27 +12,13 @@ import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.util.module import org.jetbrains.kotlin.library.KotlinLibrary -// TODO: consider making two implementations: for producing cache and anything else. -internal class LlvmModuleSpecificationImpl( - private val cachedLibraries: CachedLibraries, - private val producingCache: Boolean, - private val librariesToCache: Set -) : LlvmModuleSpecification { - override val isFinal: Boolean - get() = !producingCache - +internal abstract class LlvmModuleSpecificationBase(protected val cachedLibraries: CachedLibraries) : LlvmModuleSpecification { override fun importsKotlinDeclarationsFromOtherObjectFiles(): Boolean = cachedLibraries.hasStaticCaches // A bit conservative but still valid. override fun importsKotlinDeclarationsFromOtherSharedLibraries(): Boolean = cachedLibraries.hasDynamicCaches // A bit conservative but still valid. - override fun containsLibrary(library: KotlinLibrary): Boolean = if (producingCache) { - library in librariesToCache - } else { - !cachedLibraries.isLibraryCached(library) - } - override fun containsModule(module: IrModuleFragment): Boolean = containsModule(module.descriptor) @@ -42,3 +28,19 @@ internal class LlvmModuleSpecificationImpl( override fun containsDeclaration(declaration: IrDeclaration): Boolean = declaration.module.konanLibrary.let { it == null || containsLibrary(it) } } + +internal class DefaultLlvmModuleSpecification(cachedLibraries: CachedLibraries) + : LlvmModuleSpecificationBase(cachedLibraries) { + override val isFinal = true + + override fun containsLibrary(library: KotlinLibrary): Boolean = !cachedLibraries.isLibraryCached(library) +} + +internal class CacheLlvmModuleSpecification( + cachedLibraries: CachedLibraries, + private val librariesToCache: Set +) : LlvmModuleSpecificationBase(cachedLibraries) { + override val isFinal = false + + override fun containsLibrary(library: KotlinLibrary): Boolean = library in librariesToCache +}