K2: fix cinterop signature computation in Native

This commit is contained in:
Svyatoslav Scherbina
2023-01-10 19:09:56 +01:00
committed by Space Team
parent b7c336217f
commit d096641ddb
3 changed files with 35 additions and 2 deletions
@@ -7,12 +7,20 @@ package org.jetbrains.kotlin.backend.konan.descriptors
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.utils.containerSource
import org.jetbrains.kotlin.fir.lazy.AbstractFir2IrLazyDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.descriptors.IrBasedDeclarationDescriptor
import org.jetbrains.kotlin.konan.library.KLIB_INTEROP_IR_PROVIDER_IDENTIFIER
import org.jetbrains.kotlin.library.BaseKotlinLibrary
import org.jetbrains.kotlin.library.metadata.DeserializedKlibModuleOrigin
import org.jetbrains.kotlin.library.metadata.KlibDeserializedContainerSource
import org.jetbrains.kotlin.library.metadata.klibModuleOrigin
import org.jetbrains.kotlin.library.metadata.kotlinLibrary
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
fun DeclarationDescriptor.deepPrint() {
@@ -51,6 +59,14 @@ fun DeclarationDescriptor.findTopLevelDescriptor(): DeclarationDescriptor {
else this.containingDeclaration!!.findTopLevelDescriptor()
}
private fun IrDeclaration.findTopLevelDeclaration(): IrDeclaration = when (val parent = this.parent) {
is IrDeclaration -> parent.findTopLevelDeclaration()
else -> this
}
private fun IrDeclaration.propertyIfAccessor(): IrDeclaration =
(this as? IrSimpleFunction)?.correspondingPropertySymbol?.owner ?: this
val ModuleDescriptor.isForwardDeclarationModule: Boolean
get() {
// TODO: use KlibResolvedModuleDescriptorsFactoryImpl.FORWARD_DECLARATIONS_MODULE_NAME instead of
@@ -61,6 +77,23 @@ val ModuleDescriptor.isForwardDeclarationModule: Boolean
fun BaseKotlinLibrary.isInteropLibrary() =
manifestProperties["ir_provider"] == KLIB_INTEROP_IR_PROVIDER_IDENTIFIER
fun DeclarationDescriptor.isFromInteropLibrary(): Boolean =
this.isFromFirDeserializedInteropLibrary() || this.module.isFromInteropLibrary()
private fun DeclarationDescriptor.isFromFirDeserializedInteropLibrary(): Boolean {
val declaration = (this as? IrBasedDeclarationDescriptor<*>)?.owner ?: return false
// We need to find top-level non-accessor declaration, because
// - fir2ir lazy IR creates non-AbstractFir2IrLazyDeclaration declarations sometimes, e.g. for enum entries;
// - K2 metadata deserializer doesn't set containerSource for property accessors.
val topLevelDeclaration = declaration.findTopLevelDeclaration().propertyIfAccessor()
val firDeclaration = (topLevelDeclaration as? AbstractFir2IrLazyDeclaration<*>)?.fir ?: return false
val containerSource = (firDeclaration as? FirMemberDeclaration)?.containerSource
return containerSource is KlibDeserializedContainerSource && containerSource.isFromNativeInteropLibrary
}
fun ModuleDescriptor.isFromInteropLibrary() =
when (this) {
is ModuleDescriptorImpl ->
@@ -23,7 +23,7 @@ class KonanDeclarationTable(
// TODO: We should get rid of this extension point in favor of proper support in IR-based mangler.
override fun tryComputeBackendSpecificSignature(declaration: IrDeclaration): IdSignature? =
if (declaration.descriptor.module.isFromInteropLibrary()) {
if (declaration.descriptor.isFromInteropLibrary()) {
signatureIdComposer.computeSignature(declaration)
} else null
}
@@ -23,7 +23,7 @@ class KonanIdSignaturer(private val mangler: KotlinMangler.DescriptorMangler) :
* [IdSignature.Flags.IS_NATIVE_INTEROP_LIBRARY] flag.
*/
private fun markInteropDeclaration(descriptor: DeclarationDescriptor) {
if (descriptor.module.isFromInteropLibrary()) {
if (descriptor.isFromInteropLibrary()) {
mask = mask or IdSignature.Flags.IS_NATIVE_INTEROP_LIBRARY.encode(true)
}
}