From 79fa0d2648c9047e8961d2d10fb1923a8656220d Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Tue, 15 Aug 2023 12:50:09 +0200 Subject: [PATCH] [Native] Move `KonanForwardDeclarationModuleDeserializer` to a separate file --- ...nanForwardDeclarationModuleDeserializer.kt | 82 +++++++++++++++++++ .../konan/serialization/KonanIrLinker.kt | 64 --------------- 2 files changed, 82 insertions(+), 64 deletions(-) create mode 100644 kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanForwardDeclarationModuleDeserializer.kt diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanForwardDeclarationModuleDeserializer.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanForwardDeclarationModuleDeserializer.kt new file mode 100644 index 00000000000..8bfa72d0ac4 --- /dev/null +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanForwardDeclarationModuleDeserializer.kt @@ -0,0 +1,82 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.konan.serialization + +import org.jetbrains.kotlin.backend.common.serialization.IrModuleDeserializer +import org.jetbrains.kotlin.backend.common.serialization.IrModuleDeserializerKind +import org.jetbrains.kotlin.backend.common.serialization.KotlinIrLinker +import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData +import org.jetbrains.kotlin.backend.konan.descriptors.isForwardDeclarationModule +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrModuleFragment +import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl +import org.jetbrains.kotlin.ir.symbols.IrSymbol +import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator +import org.jetbrains.kotlin.ir.util.IdSignature +import org.jetbrains.kotlin.library.KotlinAbiVersion +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.NativeForwardDeclarationKind +import org.jetbrains.kotlin.resolve.descriptorUtil.module + +internal class KonanForwardDeclarationModuleDeserializer( + moduleDescriptor: ModuleDescriptor, + private val linker: KotlinIrLinker, + private val stubGenerator: DeclarationStubGenerator, +) : IrModuleDeserializer(moduleDescriptor, KotlinAbiVersion.CURRENT) { + init { + require(moduleDescriptor.isForwardDeclarationModule) + } + + private val declaredDeclaration = mutableMapOf() + + private fun IdSignature.isForwardDeclarationSignature(): Boolean { + if (isPubliclyVisible) { + return packageFqName() in NativeForwardDeclarationKind.packageFqNameToKind + } + + return false + } + + override fun contains(idSig: IdSignature): Boolean = idSig.isForwardDeclarationSignature() + + private fun resolveDescriptor(idSig: IdSignature): ClassDescriptor? = + with(idSig as IdSignature.CommonSignature) { + val classId = ClassId(packageFqName(), FqName(declarationFqName), false) + moduleDescriptor.findClassAcrossModuleDependencies(classId) + } + + private fun buildForwardDeclarationStub(descriptor: ClassDescriptor): IrClass { + return stubGenerator.generateClassStub(descriptor).also { + it.origin = KonanIrLinker.FORWARD_DECLARATION_ORIGIN + } + } + + override fun tryDeserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol? { + require(symbolKind == BinarySymbolData.SymbolKind.CLASS_SYMBOL) { + "Only class could be a Forward declaration $idSig (kind $symbolKind)" + } + val descriptor = resolveDescriptor(idSig) ?: return null + val actualModule = descriptor.module + if (actualModule !== moduleDescriptor) { + val moduleDeserializer = linker.resolveModuleDeserializer(actualModule, idSig) + moduleDeserializer.addModuleReachableTopLevel(idSig) + return linker.symbolTable.referenceClass(idSig) + } + + return declaredDeclaration.getOrPut(idSig) { buildForwardDeclarationStub(descriptor) }.symbol + } + + override fun deserializedSymbolNotFound(idSig: IdSignature): Nothing = error("No descriptor found for $idSig") + + override val moduleFragment: IrModuleFragment = IrModuleFragmentImpl(moduleDescriptor, linker.builtIns) + override val moduleDependencies: Collection = emptyList() + + override val kind get() = IrModuleDeserializerKind.SYNTHETIC +} \ No newline at end of file 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 037edd3afb3..722be4b420a 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 @@ -25,7 +25,6 @@ import org.jetbrains.kotlin.backend.common.serialization.encodings.BinaryNameAnd import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData import org.jetbrains.kotlin.backend.common.serialization.encodings.FunctionFlags import org.jetbrains.kotlin.backend.konan.* -import org.jetbrains.kotlin.backend.konan.descriptors.isForwardDeclarationModule import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForCEnumAndCStructStubs @@ -38,20 +37,13 @@ import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyClass import org.jetbrains.kotlin.ir.symbols.IrClassSymbol -import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrPublicSymbolBase import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.library.KotlinAbiVersion import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.metadata.impl.KlibResolvedModuleDescriptorsFactoryImpl.Companion.FORWARD_DECLARATIONS_MODULE_NAME -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.NativeForwardDeclarationKind -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.resolve.descriptorUtil.module import sun.misc.Unsafe import org.jetbrains.kotlin.backend.common.serialization.proto.IrClass as ProtoClass import org.jetbrains.kotlin.backend.common.serialization.proto.IrDeclaration as ProtoDeclaration @@ -557,62 +549,6 @@ internal class KonanIrLinker( else -> error("Unknown package fragment kind ${packageFragment::class.java}") } - private class KonanForwardDeclarationModuleDeserializer( - moduleDescriptor: ModuleDescriptor, - private val linker: KotlinIrLinker, - private val stubGenerator: DeclarationStubGenerator, - ) : IrModuleDeserializer(moduleDescriptor, KotlinAbiVersion.CURRENT) { - init { - require(moduleDescriptor.isForwardDeclarationModule) - } - - private val declaredDeclaration = mutableMapOf() - - private fun IdSignature.isForwardDeclarationSignature(): Boolean { - if (isPubliclyVisible) { - return packageFqName() in NativeForwardDeclarationKind.packageFqNameToKind - } - - return false - } - - override fun contains(idSig: IdSignature): Boolean = idSig.isForwardDeclarationSignature() - - private fun resolveDescriptor(idSig: IdSignature): ClassDescriptor? = - with(idSig as IdSignature.CommonSignature) { - val classId = ClassId(packageFqName(), FqName(declarationFqName), false) - moduleDescriptor.findClassAcrossModuleDependencies(classId) - } - - private fun buildForwardDeclarationStub(descriptor: ClassDescriptor): IrClass { - return stubGenerator.generateClassStub(descriptor).also { - it.origin = FORWARD_DECLARATION_ORIGIN - } - } - - override fun tryDeserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol? { - require(symbolKind == BinarySymbolData.SymbolKind.CLASS_SYMBOL) { - "Only class could be a Forward declaration $idSig (kind $symbolKind)" - } - val descriptor = resolveDescriptor(idSig) ?: return null - val actualModule = descriptor.module - if (actualModule !== moduleDescriptor) { - val moduleDeserializer = linker.resolveModuleDeserializer(actualModule, idSig) - moduleDeserializer.addModuleReachableTopLevel(idSig) - return linker.symbolTable.referenceClass(idSig) - } - - return declaredDeclaration.getOrPut(idSig) { buildForwardDeclarationStub(descriptor) }.symbol - } - - override fun deserializedSymbolNotFound(idSig: IdSignature): Nothing = error("No descriptor found for $idSig") - - override val moduleFragment: IrModuleFragment = IrModuleFragmentImpl(moduleDescriptor, linker.builtIns) - override val moduleDependencies: Collection = emptyList() - - override val kind get() = IrModuleDeserializerKind.SYNTHETIC - } - private val String.isForwardDeclarationModuleName: Boolean get() = this == FORWARD_DECLARATIONS_MODULE_NAME.asString() val modules: Map