IR: refactor IdSignatureSerializer

Use a separate instance for each file.
This commit is contained in:
Anton Bannykh
2021-04-27 15:37:14 +03:00
parent 87dd357ec6
commit 600099585d
10 changed files with 60 additions and 50 deletions
@@ -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<IrClass>()
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
@@ -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<IrDeclaration, IdSignature>()
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<IrDeclaration, IdSignature>()
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)
@@ -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<IrDeclaration>(), 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() })
@@ -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)
}
@@ -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
@@ -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<JsIrFileSerializer>(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)
@@ -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")
@@ -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)
}
@@ -16,8 +16,7 @@ class KonanIrModuleSerializer(
val skipExpects: Boolean
) : IrModuleSerializer<KonanIrFileSerializer>(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.
@@ -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) {