[Native] `isFromCInteropLibrary()`: Don't process IR based descriptors
The goal of `isFromCInteropLibrary()` function is to check whether
the given declaration is from a C-interop library. For such
declarations either of the following conditions should be met:
1. It is Fir2Ir lazy declaration built around the corresponding
FIR declaration. And we can look into the FIR declaration to
figure out it's <source>.
2. It is an IR declaration built around the deserialized metadata (K1).
In different compiler modes it can be either an instance of
`IrLazyDeclarationBase`, or an instance of `IrDeclaration`, but
always with the appropriate DeclarationDescriptor.
That means the following: If we meet an IR declaration that is not
Fir2Ir lazy declaration and has no real descriptor, then it can't
be a declaration deserialized from a C-interop library.
^KT-69563
diff --git a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrUtils.kt b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrUtils.kt
index 5ce7b42..26cc2b0 100644
--- a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrUtils.kt
+++ b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrUtils.kt
@@ -70,7 +70,10 @@
} else {
// There can be no descriptor. So take if with caution.
val symbol = topLevelDeclaration.symbol
- if (symbol.hasDescriptor) symbol.descriptor else null
+ if (symbol.hasDescriptor)
+ symbol.descriptor.takeUnless { it is IrBasedDeclarationDescriptor<*> }
+ else
+ null
}
return (topLevelDeclarationDescriptor?.containingDeclaration as? PackageFragmentDescriptor)?.source
diff --git a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt
index 5006f67..e40eec4 100644
--- a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt
+++ b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDeclarationTable.kt
@@ -30,14 +30,8 @@
// TODO: We should get rid of this extension point in favor of proper support in IR-based mangler.
@OptIn(ObsoleteDescriptorBasedAPI::class)
- override fun tryComputeBackendSpecificSignature(declaration: IrDeclaration): IdSignature? {
- // TODO: this is a workaround for KT-69563, need to find a better fix
- try {
+ override fun tryComputeBackendSpecificSignature(declaration: IrDeclaration): IdSignature? =
if (declaration.isFromCInteropLibrary()) {
- return signatureIdComposer.computeSignature(declaration)
- } else return null
- } catch (e: Exception) {
- return null
- }
- }
+ signatureIdComposer.computeSignature(declaration)
+ } else null
}
\ No newline at end of file