From 600099585d61e2a64738266a29cc8cffb66b5175 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Tue, 27 Apr 2021 15:37:14 +0300 Subject: [PATCH] IR: refactor IdSignatureSerializer Use a separate instance for each file. --- .../backend/common/overrides/FakeOverrides.kt | 16 ++--- .../common/serialization/DeclarationTable.kt | 14 ++--- .../signature/IdSignatureSerializer.kt | 58 +++++++++++-------- .../serialization/ir/JsDeclarationTable.kt | 5 +- .../js/lower/serialization/ir/JsIrLinker.kt | 3 +- .../serialization/ir/JsIrModuleSerializer.kt | 4 +- .../backend/jvm/serialization/JvmIrLinker.kt | 3 +- .../serialization/KonanDeclarationTable.kt | 2 +- .../serialization/KonanIrModuleSerializer.kt | 3 +- .../konan/serialization/KonanIrlinker.kt | 2 +- 10 files changed, 60 insertions(+), 50 deletions(-) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt index 34d83db357b..744f5d7eeab 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.common.overrides import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable import org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer +import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.overrides.FakeOverrideBuilderStrategy @@ -28,18 +29,19 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrPropertySymbolImpl import org.jetbrains.kotlin.ir.types.getClass import org.jetbrains.kotlin.ir.util.IdSignature +import org.jetbrains.kotlin.ir.util.KotlinMangler import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.parentAsClass class FakeOverrideGlobalDeclarationTable( - signatureSerializer: IdSignatureSerializer -) : GlobalDeclarationTable(signatureSerializer, signatureSerializer.mangler) { + mangler: KotlinMangler.IrMangler +) : GlobalDeclarationTable(mangler) { fun clear() = table.clear() } class FakeOverrideDeclarationTable( - signatureSerializer: IdSignatureSerializer, - globalTable: FakeOverrideGlobalDeclarationTable = FakeOverrideGlobalDeclarationTable(signatureSerializer) + mangler: KotlinMangler.IrMangler, + globalTable: FakeOverrideGlobalDeclarationTable = FakeOverrideGlobalDeclarationTable(mangler) ) : DeclarationTable(globalTable) { override val globalDeclarationTable: FakeOverrideGlobalDeclarationTable = globalTable fun clear() { @@ -64,7 +66,7 @@ object DefaultFakeOverrideClassFilter : FakeOverrideClassFilter { class FakeOverrideBuilder( val linker: FileLocalAwareLinker, val symbolTable: SymbolTable, - val signaturer: IdSignatureSerializer, + mangler: KotlinMangler.IrMangler, irBuiltIns: IrBuiltIns, val platformSpecificClassFilter: FakeOverrideClassFilter = DefaultFakeOverrideClassFilter ) : FakeOverrideBuilderStrategy() { @@ -73,7 +75,7 @@ class FakeOverrideBuilder( private val irOverridingUtil = IrOverridingUtil(irBuiltIns, this) // TODO: The declaration table is needed for the signaturer. - private val fakeOverrideDeclarationTable = FakeOverrideDeclarationTable(signaturer) + private val fakeOverrideDeclarationTable = FakeOverrideDeclarationTable(mangler) private val fakeOverrideClassQueue = mutableListOf() fun enqueueClass(clazz: IrClass, signature: IdSignature) { @@ -135,7 +137,7 @@ class FakeOverrideBuilder( } private fun composeSignature(declaration: IrDeclaration) = - signaturer.composeSignatureForDeclaration(declaration) + fakeOverrideDeclarationTable.signaturer.composeSignatureForDeclaration(declaration) private fun declareFunctionFakeOverride(declaration: IrFakeOverrideFunction, signature: IdSignature) { val parent = declaration.parentAsClass diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt index 20dbd575210..e4f53c4c6e3 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.common.serialization import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer +import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns @@ -25,14 +26,14 @@ interface IdSignatureClashTracker { } abstract class GlobalDeclarationTable( - val signaturer: IdSignatureSerializer, private val mangler: KotlinMangler.IrMangler, private val clashTracker: IdSignatureClashTracker ) { + val publicIdSignatureComputer = PublicIdSignatureComputer(mangler) + protected val table = mutableMapOf() - constructor(signaturer: IdSignatureSerializer, mangler: KotlinMangler.IrMangler) : - this(signaturer, mangler, IdSignatureClashTracker.DEFAULT_TRACKER) + constructor(mangler: KotlinMangler.IrMangler) : this(mangler, IdSignatureClashTracker.DEFAULT_TRACKER) protected fun loadKnownBuiltins(builtIns: IrBuiltIns) { builtIns.knownBuiltins.forEach { @@ -43,7 +44,7 @@ abstract class GlobalDeclarationTable( open fun computeSignatureByDeclaration(declaration: IrDeclaration): IdSignature { return table.getOrPut(declaration) { - signaturer.composePublicIdSignature(declaration).also { clashTracker.commit(declaration, it) } + publicIdSignatureComputer.composePublicIdSignature(declaration).also { clashTracker.commit(declaration, it) } } } @@ -54,10 +55,7 @@ open class DeclarationTable(globalTable: GlobalDeclarationTable) { protected val table = mutableMapOf() protected open val globalDeclarationTable: GlobalDeclarationTable = globalTable // TODO: we need to disentangle signature construction with declaration tables. - private val signaturer: IdSignatureSerializer = globalTable.signaturer.also { - it.reset() - it.table = this - } + open val signaturer: IdSignatureSerializer = IdSignatureSerializer(globalTable.publicIdSignatureComputer, this) private fun IrDeclaration.isLocalDeclaration(): Boolean { return !isExportedDeclaration(this) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureSerializer.kt index 3d35498771b..d3615d5c003 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureSerializer.kt @@ -16,29 +16,22 @@ import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid -open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSignatureComputer { +class PublicIdSignatureComputer(val mangler: KotlinMangler.IrMangler) : IdSignatureComputer { + + private val publicSignatureBuilder = PublicIdSigBuilder() override fun computeSignature(declaration: IrDeclaration): IdSignature? { return if (mangler.run { declaration.isExported() }) { - composePublicIdSignature(declaration) + publicSignatureBuilder.buildSignature(declaration) } else null } - fun composeSignatureForDeclaration(declaration: IrDeclaration): IdSignature { - return if (mangler.run { declaration.isExported() }) { - composePublicIdSignature(declaration) - } else composeFileLocalIdSignature(declaration) - } + fun composePublicIdSignature(declaration: IrDeclaration): IdSignature { + assert(mangler.run { declaration.isExported() }) { + "${declaration.render()} expected to be exported" + } - private var localIndex: Long = 0 - private var scopeIndex: Int = 0 - - // TODO: we need to disentangle signature construction with declaration tables. - lateinit var table: DeclarationTable - - fun reset() { - localIndex = 0 - scopeIndex = 0 + return publicSignatureBuilder.buildSignature(declaration) } private inner class PublicIdSigBuilder : IdSignatureBuilder(), IrElementVisitorVoid { @@ -96,8 +89,31 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna collectFqNames(declaration) } } +} - private val publicSignatureBuilder = PublicIdSigBuilder() +open class IdSignatureSerializer( + private val publicSignatureBuilder: PublicIdSignatureComputer, + private val table: DeclarationTable, + localIndexOffset: Long = 0, + scopeIndexOffset: Int = 0, +) : IdSignatureComputer { + + private val mangler: KotlinMangler.IrMangler = publicSignatureBuilder.mangler + + override fun computeSignature(declaration: IrDeclaration): IdSignature? { + return if (mangler.run { declaration.isExported() }) { + publicSignatureBuilder.composePublicIdSignature(declaration) + } else null + } + + fun composeSignatureForDeclaration(declaration: IrDeclaration): IdSignature { + return if (mangler.run { declaration.isExported() }) { + publicSignatureBuilder.composePublicIdSignature(declaration) + } else composeFileLocalIdSignature(declaration) + } + + private var localIndex: Long = localIndexOffset + private var scopeIndex: Int = scopeIndexOffset private fun composeContainerIdSignature(container: IrDeclarationParent): IdSignature = when (container) { @@ -106,14 +122,6 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna else -> error("Unexpected container ${container.render()}") } - fun composePublicIdSignature(declaration: IrDeclaration): IdSignature { - assert(mangler.run { declaration.isExported() }) { - "${declaration.render()} expected to be exported" - } - - return publicSignatureBuilder.buildSignature(declaration) - } - fun composeFileLocalIdSignature(declaration: IrDeclaration): IdSignature { assert(!mangler.run { declaration.isExported() }) diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsDeclarationTable.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsDeclarationTable.kt index e96342f716c..5775e864cf4 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsDeclarationTable.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsDeclarationTable.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir import org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable import org.jetbrains.kotlin.backend.common.serialization.IdSignatureClashTracker import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer +import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction @@ -40,8 +41,8 @@ class JsUniqIdClashTracker : IdSignatureClashTracker { } } -class JsGlobalDeclarationTable(signatureSerializer: IdSignatureSerializer, builtIns: IrBuiltIns) : - GlobalDeclarationTable(signatureSerializer, JsManglerIr, JsUniqIdClashTracker()) { +class JsGlobalDeclarationTable(builtIns: IrBuiltIns) : + GlobalDeclarationTable(JsManglerIr, JsUniqIdClashTracker()) { init { loadKnownBuiltins(builtIns) } diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt index 8218088e7e7..48478bc63b3 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilder import org.jetbrains.kotlin.backend.common.serialization.* import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer +import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.IrModuleFragment @@ -28,7 +29,7 @@ class JsIrLinker( private val icData: ICData? = null ) : KotlinIrLinker(currentModule, messageLogger, builtIns, symbolTable, emptyList()) { - override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, IdSignatureSerializer(JsManglerIr), builtIns) + override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, JsManglerIr, builtIns) override fun isBuiltInModule(moduleDescriptor: ModuleDescriptor): Boolean = moduleDescriptor === moduleDescriptor.builtIns.builtInsModule diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrModuleSerializer.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrModuleSerializer.kt index 49a7d708b8b..84399737dc0 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrModuleSerializer.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrModuleSerializer.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable import org.jetbrains.kotlin.backend.common.serialization.IrModuleSerializer import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer +import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns @@ -21,8 +22,7 @@ class JsIrModuleSerializer( val skipExpects: Boolean ) : IrModuleSerializer(messageLogger) { - private val signaturer = IdSignatureSerializer(JsManglerIr) - private val globalDeclarationTable = JsGlobalDeclarationTable(signaturer, irBuiltIns) + private val globalDeclarationTable = JsGlobalDeclarationTable(irBuiltIns) override fun createSerializerForFile(file: IrFile): JsIrFileSerializer = JsIrFileSerializer(messageLogger, DeclarationTable(globalDeclarationTable), expectDescriptorToSymbol, skipExpects = skipExpects) diff --git a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmIrLinker.kt b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmIrLinker.kt index a91b54145e3..1564adca0a0 100644 --- a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmIrLinker.kt +++ b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmIrLinker.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilder import org.jetbrains.kotlin.backend.common.serialization.* import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer +import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.konan.KlibModuleOrigin import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI @@ -43,7 +44,7 @@ class JvmIrLinker( private val manglerDesc: JvmManglerDesc ) : KotlinIrLinker(currentModule, messageLogger, builtIns, symbolTable, emptyList()) { - override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, IdSignatureSerializer(JvmManglerIr), builtIns) + override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, JvmManglerIr, builtIns) private val javaName = Name.identifier("java") diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt index a15fcbf129d..47b69450fd8 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.resolve.descriptorUtil.module -class KonanGlobalDeclarationTable(signatureSerializer: IdSignatureSerializer, builtIns: IrBuiltIns) : GlobalDeclarationTable(signatureSerializer, KonanManglerIr) { +class KonanGlobalDeclarationTable(builtIns: IrBuiltIns) : GlobalDeclarationTable(KonanManglerIr) { init { loadKnownBuiltins(builtIns) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrModuleSerializer.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrModuleSerializer.kt index 317a28b5b81..da413a51569 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrModuleSerializer.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrModuleSerializer.kt @@ -16,8 +16,7 @@ class KonanIrModuleSerializer( val skipExpects: Boolean ) : IrModuleSerializer(messageLogger) { - private val signaturer = IdSignatureSerializer(KonanManglerIr) - private val globalDeclarationTable = KonanGlobalDeclarationTable(signaturer, irBuiltIns) + private val globalDeclarationTable = KonanGlobalDeclarationTable(irBuiltIns) // We skip files with IR for C structs and enums because they should be // generated anew. diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt index 0b7b532efdc..e1db08bb25b 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt @@ -91,7 +91,7 @@ internal class KonanIrLinker( override fun isBuiltInModule(moduleDescriptor: ModuleDescriptor): Boolean = moduleDescriptor.isNativeStdlib() private val forwardDeclarationDeserializer = forwardModuleDescriptor?.let { KonanForwardDeclarationModuleDeserializer(it) } - override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, IdSignatureSerializer(KonanManglerIr), builtIns, KonanFakeOverrideClassFilter) + override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, KonanManglerIr, builtIns, KonanFakeOverrideClassFilter) override fun createModuleDeserializer(moduleDescriptor: ModuleDescriptor, klib: IrLibrary?, strategy: DeserializationStrategy): IrModuleDeserializer { if (moduleDescriptor === forwardModuleDescriptor) {