JVM_IR: read Klib

This commit is contained in:
Georgy Bronnikov
2019-11-29 11:49:20 +03:00
parent 47d6bdfd35
commit 5ede65c525
15 changed files with 462 additions and 28 deletions
@@ -27,11 +27,11 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
abstract class DescriptorReferenceDeserializer(
val currentModule: ModuleDescriptor,
val mangler: KotlinMangler,
val builtIns: IrBuiltIns,
val builtIns: IrBuiltIns?,
val resolvedForwardDeclarations: MutableMap<UniqId, UniqId>
) : DescriptorUniqIdAware {
protected open fun resolveSpecialDescriptor(fqn: FqName) = builtIns.builtIns.getBuiltInClassByFqName(fqn)
protected open fun resolveSpecialDescriptor(fqn: FqName) = builtIns!!.builtIns.getBuiltInClassByFqName(fqn)
open fun checkIfSpecialDescriptorId(id: Long) = with(mangler) { id.isSpecial }
protected open fun getDescriptorIdOrNull(descriptor: DeclarationDescriptor) =
@@ -46,7 +46,8 @@ abstract class KotlinIrLinker(
val symbolTable: SymbolTable,
private val exportedDependencies: List<ModuleDescriptor>,
private val forwardModuleDescriptor: ModuleDescriptor?,
mangler: KotlinMangler
mangler: KotlinMangler,
private val tolerateNonKlibDescriptors: Boolean = false
) : DescriptorUniqIdAware, IrDeserializer {
private val expectUniqIdToActualUniqId = mutableMapOf<UniqId, UniqId>()
@@ -133,7 +134,9 @@ abstract class KotlinIrLinker(
private val moduleDeserializationState = DeserializationState.ModuleDeserializationState(this)
val moduleReversedFileIndex = mutableMapOf<UniqId, IrDeserializerForFile>()
private val moduleDependencies by lazy {
moduleDescriptor.allDependencyModules.filter { it != moduleDescriptor }.map { deserializersForModules[it]!! }
moduleDescriptor.allDependencyModules.filter { it != moduleDescriptor }.mapNotNull {
deserializersForModules[it] ?: if (tolerateNonKlibDescriptors) null else error("Module without deserializer $it")
}
}
// This is a heavy initializer
@@ -562,12 +565,21 @@ abstract class KotlinIrLinker(
}
val descriptorUniqId = topLevelDescriptor.getUniqId()
?: error("Could not get descriptor uniq id for $topLevelDescriptor")
?: if (tolerateNonKlibDescriptors) {
return null
} else {
error("Could not get descriptor uniq id for $topLevelDescriptor")
}
val topLevelKey = UniqId(descriptorUniqId)
val moduleOfOrigin = topLevelDescriptor.module
val moduleDeserializer = deserializersForModules[moduleOfOrigin] ?: error("No module deserializer found for $moduleOfOrigin")
val moduleDeserializer = deserializersForModules[moduleOfOrigin] ?:
if (tolerateNonKlibDescriptors) {
return null
} else {
error("No module deserializer found for $moduleOfOrigin")
}
moduleDeserializer.addModuleReachableTopLevel(topLevelKey)
@@ -697,6 +709,10 @@ abstract class KotlinIrLinker(
fun deserializeOnlyHeaderModule(moduleDescriptor: ModuleDescriptor): IrModuleFragment =
deserializeIrModuleHeader(moduleDescriptor, DeserializationStrategy.ONLY_DECLARATION_HEADERS)
fun getAllIrFiles(): List<IrFile> {
return deserializersForModules.values.flatMap { it.module.files }
}
}
enum class DeserializationStrategy(val needBodies: Boolean, val explicitlyExported: Boolean, val theWholeWorld: Boolean) {