Refactored LlvmModuleSpec

This commit is contained in:
Igor Chevdar
2020-10-07 14:07:07 +05:00
parent 91e457f07a
commit eec9e6b8d5
2 changed files with 24 additions and 20 deletions
@@ -425,11 +425,13 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
lateinit var compilerOutput: List<ObjectFile>
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<String, LLVMTypeRef> = HashMap()
@@ -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<KotlinLibrary>
) : 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<KotlinLibrary>
) : LlvmModuleSpecificationBase(cachedLibraries) {
override val isFinal = false
override fun containsLibrary(library: KotlinLibrary): Boolean = library in librariesToCache
}