[KLIB] Cutting down usages of moduleDescriptor in linker

Replace map key `ModuleDescriptor` with `String` which is module name
This commit is contained in:
Roman Artemev
2021-06-30 14:57:51 +03:00
committed by teamcityserver
parent eadf252de9
commit 0326518fc9
6 changed files with 38 additions and 28 deletions
@@ -139,7 +139,7 @@ open class JvmIrCodegenFactory(
// We have to ensure that deserializer for built-ins module is created // We have to ensure that deserializer for built-ins module is created
irLinker.deserializeIrModuleHeader(it.builtIns.builtInsModule, null) irLinker.deserializeIrModuleHeader(it.builtIns.builtInsModule, null)
} }
irLinker.deserializeIrModuleHeader(it, kotlinLibrary) irLinker.deserializeIrModuleHeader(it, kotlinLibrary, _moduleName = it.name.asString())
} }
val irProviders = listOf(irLinker) val irProviders = listOf(irLinker)
@@ -14,7 +14,8 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.descriptors.* import org.jetbrains.kotlin.ir.descriptors.IrAbstractFunctionFactory
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.linkage.IrDeserializer import org.jetbrains.kotlin.ir.linkage.IrDeserializer
import org.jetbrains.kotlin.ir.linkage.KotlinIrLinkerInternalException import org.jetbrains.kotlin.ir.linkage.KotlinIrLinkerInternalException
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
@@ -23,6 +24,7 @@ import org.jetbrains.kotlin.ir.util.IrMessageLogger
import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.file import org.jetbrains.kotlin.ir.util.file
import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.uniqueName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
@@ -42,8 +44,7 @@ abstract class KotlinIrLinker(
internal val modulesWithReachableTopLevels = mutableSetOf<IrModuleDeserializer>() internal val modulesWithReachableTopLevels = mutableSetOf<IrModuleDeserializer>()
// TODO: replace with Map<Name, IrModuleDeserializer> protected val deserializersForModules = mutableMapOf<String, IrModuleDeserializer>()
protected val deserializersForModules = mutableMapOf<ModuleDescriptor, IrModuleDeserializer>()
abstract val fakeOverrideBuilder: FakeOverrideBuilder abstract val fakeOverrideBuilder: FakeOverrideBuilder
@@ -68,7 +69,7 @@ abstract class KotlinIrLinker(
} }
public open fun resolveModuleDeserializer(module: ModuleDescriptor, signature: IdSignature?): IrModuleDeserializer { public open fun resolveModuleDeserializer(module: ModuleDescriptor, signature: IdSignature?): IrModuleDeserializer {
return deserializersForModules[module] ?: run { return deserializersForModules[module.name.asString()] ?: run {
val message = buildString { val message = buildString {
append("Could not load module ") append("Could not load module ")
append(module) append(module)
@@ -196,7 +197,7 @@ abstract class KotlinIrLinker(
resolveModuleDeserializer(it, null) resolveModuleDeserializer(it, null)
} }
val currentModuleDeserializer = createCurrentModuleDeserializer(moduleFragment, currentModuleDependencies) val currentModuleDeserializer = createCurrentModuleDeserializer(moduleFragment, currentModuleDependencies)
deserializersForModules[moduleFragment.descriptor] = deserializersForModules[moduleFragment.name.asString()] =
maybeWrapWithBuiltInAndInit(moduleFragment.descriptor, currentModuleDeserializer) maybeWrapWithBuiltInAndInit(moduleFragment.descriptor, currentModuleDeserializer)
} }
deserializersForModules.values.forEach { it.init() } deserializersForModules.values.forEach { it.init() }
@@ -253,7 +254,8 @@ abstract class KotlinIrLinker(
override fun resolveBySignatureInModule(signature: IdSignature, kind: IrDeserializer.TopLevelSymbolKind, moduleName: Name): IrSymbol { override fun resolveBySignatureInModule(signature: IdSignature, kind: IrDeserializer.TopLevelSymbolKind, moduleName: Name): IrSymbol {
val moduleDeserializer = val moduleDeserializer =
deserializersForModules.entries.find { it.key.name == moduleName }?.value ?: error("No module for name '$moduleName' found") deserializersForModules.entries.find { it.key == moduleName.asString() }?.value
?: error("No module for name '$moduleName' found")
assert(signature == signature.topLevelSignature()) { "Signature '$signature' has to be top level" } assert(signature == signature.topLevelSignature()) { "Signature '$signature' has to be top level" }
if (signature !in moduleDeserializer) error("No signature $signature in module $moduleName") if (signature !in moduleDeserializer) error("No signature $signature in module $moduleName")
return moduleDeserializer.deserializeIrSymbol(signature, topLevelKindToSymbolKind(kind)).also { return moduleDeserializer.deserializeIrSymbol(signature, topLevelKindToSymbolKind(kind)).also {
@@ -290,9 +292,15 @@ abstract class KotlinIrLinker(
fun deserializeIrModuleHeader( fun deserializeIrModuleHeader(
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
kotlinLibrary: KotlinLibrary?, kotlinLibrary: KotlinLibrary?,
deserializationStrategy: DeserializationStrategy = DeserializationStrategy.ONLY_REFERENCED deserializationStrategy: DeserializationStrategy = DeserializationStrategy.ONLY_REFERENCED,
_moduleName: String? = null
): IrModuleFragment { ): IrModuleFragment {
val deserializerForModule = deserializersForModules.getOrPut(moduleDescriptor) { assert(kotlinLibrary != null || _moduleName != null) { "Either library or explicit name have to be provided $moduleDescriptor" }
val moduleName = kotlinLibrary?.uniqueName?.let { "<$it>" } ?: _moduleName!!
assert(moduleDescriptor.name.asString() == moduleName) {
"${moduleDescriptor.name.asString()} != $moduleName"
}
val deserializerForModule = deserializersForModules.getOrPut(moduleName) {
maybeWrapWithBuiltInAndInit(moduleDescriptor, createModuleDeserializer(moduleDescriptor, kotlinLibrary, deserializationStrategy)) maybeWrapWithBuiltInAndInit(moduleDescriptor, createModuleDeserializer(moduleDescriptor, kotlinLibrary, deserializationStrategy))
} }
// The IrModule and its IrFiles have been created during module initialization. // The IrModule and its IrFiles have been created during module initialization.
@@ -306,7 +314,7 @@ abstract class KotlinIrLinker(
if (isBuiltInModule(moduleDescriptor)) IrModuleDeserializerWithBuiltIns(builtIns, functionalInterfaceFactory, moduleDeserializer) if (isBuiltInModule(moduleDescriptor)) IrModuleDeserializerWithBuiltIns(builtIns, functionalInterfaceFactory, moduleDeserializer)
else moduleDeserializer else moduleDeserializer
fun deserializeIrModuleHeader(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary?): IrModuleFragment { fun deserializeIrModuleHeader(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary?, moduleName: String): IrModuleFragment {
// TODO: consider skip deserializing explicitly exported declarations for libraries. // TODO: consider skip deserializing explicitly exported declarations for libraries.
// Now it's not valid because of all dependencies that must be computed. // Now it's not valid because of all dependencies that must be computed.
val deserializationStrategy = val deserializationStrategy =
@@ -315,16 +323,16 @@ abstract class KotlinIrLinker(
} else { } else {
DeserializationStrategy.EXPLICITLY_EXPORTED DeserializationStrategy.EXPLICITLY_EXPORTED
} }
return deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, deserializationStrategy) return deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, deserializationStrategy, moduleName)
} }
fun deserializeFullModule(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary?): IrModuleFragment = fun deserializeFullModule(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary): IrModuleFragment =
deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, DeserializationStrategy.ALL) deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, DeserializationStrategy.ALL)
fun deserializeOnlyHeaderModule(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary?): IrModuleFragment = fun deserializeOnlyHeaderModule(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary?): IrModuleFragment =
deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, DeserializationStrategy.ONLY_DECLARATION_HEADERS) deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, DeserializationStrategy.ONLY_DECLARATION_HEADERS)
fun deserializeHeadersWithInlineBodies(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary?): IrModuleFragment = fun deserializeHeadersWithInlineBodies(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary): IrModuleFragment =
deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, DeserializationStrategy.WITH_INLINE_BODIES) deserializeIrModuleHeader(moduleDescriptor, kotlinLibrary, DeserializationStrategy.WITH_INLINE_BODIES)
} }
@@ -275,7 +275,11 @@ fun loadIr(
val irLinker = val irLinker =
JsIrLinker(psi2IrContext.moduleDescriptor, messageLogger, irBuiltIns, symbolTable, functionFactory, feContext, null) JsIrLinker(psi2IrContext.moduleDescriptor, messageLogger, irBuiltIns, symbolTable, functionFactory, feContext, null)
val deserializedModuleFragments = sortDependencies(allDependencies, depsDescriptors.descriptors).map { klib -> val deserializedModuleFragments = sortDependencies(allDependencies, depsDescriptors.descriptors).map { klib ->
irLinker.deserializeIrModuleHeader(depsDescriptors.getModuleDescriptor(klib), klib).also { moduleFragment -> irLinker.deserializeIrModuleHeader(
depsDescriptors.getModuleDescriptor(klib),
klib,
deserializationStrategy = DeserializationStrategy.EXPLICITLY_EXPORTED
).also { moduleFragment ->
klib.manifestProperties.getProperty(KLIB_PROPERTY_JS_OUTPUT_NAME)?.let { klib.manifestProperties.getProperty(KLIB_PROPERTY_JS_OUTPUT_NAME)?.let {
moduleFragmentToUniqueName[moduleFragment] = it moduleFragmentToUniqueName[moduleFragment] = it
} }
@@ -64,6 +64,7 @@ abstract class AbstractKlibTextTestCase : CodegenTestCase() {
companion object { companion object {
val SKIP_KLIB_TEST = Regex("""// SKIP_KLIB_TEST""") val SKIP_KLIB_TEST = Regex("""// SKIP_KLIB_TEST""")
const val MODULE_NAME = "testModule"
} }
override fun doMultiFileTest(wholeFile: File, files: List<TestFile>) { override fun doMultiFileTest(wholeFile: File, files: List<TestFile>) {
@@ -83,7 +84,7 @@ abstract class AbstractKlibTextTestCase : CodegenTestCase() {
listOfNotNull(writeJavaFiles(files)), listOfNotNull(writeJavaFiles(files)),
files files
) )
configuration.put(CommonConfigurationKeys.MODULE_NAME, "testModule") configuration.put(CommonConfigurationKeys.MODULE_NAME, MODULE_NAME)
myEnvironment = KotlinCoreEnvironment.createForTests(testRootDisposable, configuration, EnvironmentConfigFiles.JS_CONFIG_FILES) myEnvironment = KotlinCoreEnvironment.createForTests(testRootDisposable, configuration, EnvironmentConfigFiles.JS_CONFIG_FILES)
} }
@@ -194,7 +195,7 @@ abstract class AbstractKlibTextTestCase : CodegenTestCase() {
metadata = serializedMetadata, metadata = serializedMetadata,
dataFlowGraph = null, dataFlowGraph = null,
manifestProperties = properties, manifestProperties = properties,
moduleName = irModuleFragment.name.asString(), moduleName = MODULE_NAME,
nopack = true, nopack = true,
perFile = false, perFile = false,
output = klibDir.canonicalPath, output = klibDir.canonicalPath,
@@ -125,7 +125,7 @@ internal fun Context.psiToIr(
isProducingLibrary -> linker.deserializeOnlyHeaderModule(dependency, kotlinLibrary) isProducingLibrary -> linker.deserializeOnlyHeaderModule(dependency, kotlinLibrary)
kotlinLibrary != null && config.cachedLibraries.isLibraryCached(kotlinLibrary) -> kotlinLibrary != null && config.cachedLibraries.isLibraryCached(kotlinLibrary) ->
linker.deserializeHeadersWithInlineBodies(dependency, kotlinLibrary) linker.deserializeHeadersWithInlineBodies(dependency, kotlinLibrary)
else -> linker.deserializeIrModuleHeader(dependency, kotlinLibrary) else -> linker.deserializeIrModuleHeader(dependency, kotlinLibrary, dependency.name.asString())
} }
} }
if (dependencies.size == dependenciesCount) break if (dependencies.size == dependenciesCount) break
@@ -20,11 +20,9 @@ import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilder
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideClassFilter import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideClassFilter
import org.jetbrains.kotlin.backend.common.serialization.* import org.jetbrains.kotlin.backend.common.serialization.*
import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
import org.jetbrains.kotlin.backend.konan.CachedLibraries import org.jetbrains.kotlin.backend.konan.CachedLibraries
import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary
import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForCEnumAndCStructStubs import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForCEnumAndCStructStubs
import org.jetbrains.kotlin.backend.konan.ir.konanLibrary
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
@@ -208,7 +206,7 @@ internal class KonanIrLinker(
val descriptor = resolveDescriptor(idSig) val descriptor = resolveDescriptor(idSig)
val actualModule = descriptor.module val actualModule = descriptor.module
if (actualModule !== moduleDescriptor) { if (actualModule !== moduleDescriptor) {
val moduleDeserializer = deserializersForModules[actualModule] ?: error("No module deserializer for $actualModule") val moduleDeserializer = deserializersForModules[actualModule.name.asString()] ?: error("No module deserializer for $actualModule")
moduleDeserializer.addModuleReachableTopLevel(idSig) moduleDeserializer.addModuleReachableTopLevel(idSig)
return symbolTable.referenceClassFromLinker(idSig) return symbolTable.referenceClassFromLinker(idSig)
} }
@@ -220,18 +218,17 @@ internal class KonanIrLinker(
override val moduleDependencies: Collection<IrModuleDeserializer> = emptyList() override val moduleDependencies: Collection<IrModuleDeserializer> = emptyList()
} }
private val String.isForwardDeclarationModuleName: Boolean get() = this == "<forward declarations>"
val modules: Map<String, IrModuleFragment> val modules: Map<String, IrModuleFragment>
get() = mutableMapOf<String, IrModuleFragment>().apply { get() = mutableMapOf<String, IrModuleFragment>().apply {
deserializersForModules deserializersForModules
.filter { !it.key.isForwardDeclarationModule && it.value.moduleDescriptor !== currentModule } .filter { !it.key.isForwardDeclarationModuleName && it.value.moduleDescriptor !== currentModule }
.forEach { this.put(it.key.konanLibrary!!.libraryName, it.value.moduleFragment) } .forEach {
val klib = it.value.klib as? KotlinLibrary ?: error("Expected to be KotlinLibrary (${it.key})")
this[klib.libraryName] = it.value.moduleFragment
}
} }
class KonanPluginContext(
override val moduleDescriptor: ModuleDescriptor,
override val symbolTable: ReferenceSymbolTable,
override val typeTranslator: TypeTranslator,
override val irBuiltIns: IrBuiltIns
):TranslationPluginContext
} }
class KonanIrModuleFragmentImpl( class KonanIrModuleFragmentImpl(