[KLIB] Resolve deserialization on for each file separately

Needs for IC
This commit is contained in:
Roman Artemev
2021-09-07 13:49:01 +03:00
committed by TeamCityServer
parent 28ffcf1e81
commit 78cd45f937
9 changed files with 57 additions and 51 deletions
@@ -32,7 +32,7 @@ class IcModuleDeserializer(
val icData: SerializedIcData,
moduleDescriptor: ModuleDescriptor,
override val klib: IrLibrary,
override val strategy: DeserializationStrategy,
override val strategyResolver: (String) -> DeserializationStrategy,
private val containsErrorCode: Boolean = false,
) : IrModuleDeserializer(moduleDescriptor, (klib as KotlinLibrary).versions.abiVersion ?: KotlinAbiVersion.CURRENT) {
@@ -129,17 +129,18 @@ class IcModuleDeserializer(
val fileReader = IrLibraryFileFromKlib(moduleDeserializer.klib, fileIndex)
val file = fileReader.createFile(moduleFragment, fileProto)
val fileStrategy = strategyResolver(file.fileEntry.name)
val icFileData = pathToIcFileData[file.path]!!
val icFileData = pathToIcFileData[file.path] ?: error("No IC cache found for file ${file.path}")
val icDeserializer = IcFileDeserializer(
linker,
file,
fileReader,
fileProto,
strategy.needBodies,
fileStrategy.needBodies,
allowErrorNodes,
strategy.inlineBodies,
fileStrategy.inlineBodies,
moduleDeserializer,
{ fileDeserializer -> originalEnqueue(fileDeserializer) },
icFileData,
@@ -169,10 +170,10 @@ class IcModuleDeserializer(
}
}
if (strategy.theWholeWorld) {
if (fileStrategy.theWholeWorld) {
icDeserializer.allOriginalDeclarationSignatures().forEach { it.originalEnqueue(icDeserializer) }
}
if (strategy.theWholeWorld || strategy.explicitlyExported) {
if (fileStrategy.theWholeWorld || fileStrategy.explicitlyExported) {
linker.modulesWithReachableTopLevels.add(this)
}
@@ -288,7 +288,7 @@ fun loadIr(
irLinker.deserializeIrModuleHeader(
depsDescriptors.getModuleDescriptor(klib),
klib,
deserializationStrategy = DeserializationStrategy.EXPLICITLY_EXPORTED
deserializationStrategy = { DeserializationStrategy.EXPLICITLY_EXPORTED }
).also { moduleFragment ->
klib.manifestProperties.getProperty(KLIB_PROPERTY_JS_OUTPUT_NAME)?.let {
moduleFragmentToUniqueName[moduleFragment] = it
@@ -359,19 +359,21 @@ fun loadIr(
it.library.libraryFile.canonicalPath == mainPath
}
val deserializedModuleFragments = sortDependencies(reachableDependencies.getFullResolvedList(), depsDescriptors.descriptors).map { klib ->
val strategy =
if (klib == mainModuleLib)
DeserializationStrategy.ALL
else
DeserializationStrategy.EXPLICITLY_EXPORTED
val deserializedModuleFragments =
sortDependencies(reachableDependencies.getFullResolvedList(), depsDescriptors.descriptors).map { klib ->
val strategy =
if (klib == mainModuleLib)
DeserializationStrategy.ALL
else
DeserializationStrategy.EXPLICITLY_EXPORTED
irLinker.deserializeIrModuleHeader(depsDescriptors.getModuleDescriptor(klib), klib, strategy).also { moduleFragment ->
klib.manifestProperties.getProperty(KLIB_PROPERTY_JS_OUTPUT_NAME)?.let {
moduleFragmentToUniqueName[moduleFragment] = it
}
irLinker.deserializeIrModuleHeader(depsDescriptors.getModuleDescriptor(klib), klib, { strategy })
.also { moduleFragment ->
klib.manifestProperties.getProperty(KLIB_PROPERTY_JS_OUTPUT_NAME)?.let {
moduleFragmentToUniqueName[moduleFragment] = it
}
}
}
}
val moduleFragment = deserializedModuleFragments.last()
@@ -40,7 +40,7 @@ class JsIrLinker(
private val IrLibrary.libContainsErrorCode: Boolean
get() = this is KotlinLibrary && this.containsErrorCode
override fun createModuleDeserializer(moduleDescriptor: ModuleDescriptor, klib: KotlinLibrary?, strategy: DeserializationStrategy): IrModuleDeserializer {
override fun createModuleDeserializer(moduleDescriptor: ModuleDescriptor, klib: KotlinLibrary?, strategyResolver: (String) -> DeserializationStrategy): IrModuleDeserializer {
require(klib != null) { "Expecting kotlin library" }
loweredIcData[moduleDescriptor]?.let { loweredIcData ->
return IcModuleDeserializer(
@@ -50,17 +50,17 @@ class JsIrLinker(
loweredIcData,
moduleDescriptor,
klib,
strategy,
strategyResolver,
containsErrorCode = klib.libContainsErrorCode,
)
}
return JsModuleDeserializer(moduleDescriptor, klib, strategy, klib.versions.abiVersion ?: KotlinAbiVersion.CURRENT, klib.libContainsErrorCode)
return JsModuleDeserializer(moduleDescriptor, klib, strategyResolver, klib.versions.abiVersion ?: KotlinAbiVersion.CURRENT, klib.libContainsErrorCode)
}
val mapping: JsMapping by lazy { JsMapping(symbolTable.irFactory) }
private inner class JsModuleDeserializer(moduleDescriptor: ModuleDescriptor, klib: IrLibrary, strategy: DeserializationStrategy, libraryAbiVersion: KotlinAbiVersion, allowErrorCode: Boolean) :
BasicIrModuleDeserializer(this, moduleDescriptor, klib, strategy, libraryAbiVersion, allowErrorCode)
private inner class JsModuleDeserializer(moduleDescriptor: ModuleDescriptor, klib: IrLibrary, strategyResolver: (String) -> DeserializationStrategy, libraryAbiVersion: KotlinAbiVersion, allowErrorCode: Boolean) :
BasicIrModuleDeserializer(this, moduleDescriptor, klib, strategyResolver, libraryAbiVersion, allowErrorCode)
override fun maybeWrapWithBuiltInAndInit(
moduleDescriptor: ModuleDescriptor,
@@ -75,7 +75,7 @@ class JsIrLinker(
val currentModuleDeserializer = super.createCurrentModuleDeserializer(moduleFragment, dependencies)
icData?.let {
return CurrentModuleWithICDeserializer(currentModuleDeserializer, symbolTable, builtIns, it.icData) { lib ->
JsModuleDeserializer(currentModuleDeserializer.moduleDescriptor, lib, currentModuleDeserializer.strategy, KotlinAbiVersion.CURRENT, it.containsErrorCode)
JsModuleDeserializer(currentModuleDeserializer.moduleDescriptor, lib, currentModuleDeserializer.strategyResolver, KotlinAbiVersion.CURRENT, it.containsErrorCode)
}
}
return currentModuleDeserializer