[Native][IR] Partial linkage support for cached inline functions

- Support partial linkage for declarations from inline functions that are lazily deserialized from a KLIB with static cache
- Linker API: Split IrModuleDeserializer.deserializeIrSymbol() into deserializeIrSymbolOrFail() and tryDeserializeIrSymbol()
- Linker API: Refactor KotlinIrLinker.handleSignatureIdNotFoundInModuleWithDependencies() to deserializeOrReturnUnboundIrSymbolIfPartialLinkageEnabled()

^KT-52478
This commit is contained in:
Dmitriy Dolovov
2022-06-23 01:20:52 +04:00
parent 66de825508
commit 532b9e2c5f
18 changed files with 378 additions and 202 deletions
@@ -134,12 +134,10 @@ class JvmIrLinker(
DescriptorByIdSignatureFinderImpl.LookupMode.MODULE_ONLY
)
private fun resolveDescriptor(idSig: IdSignature): DeclarationDescriptor {
return descriptorFinder.findDescriptorBySignature(idSig) ?: error("No descriptor found for $idSig")
}
private fun resolveDescriptor(idSig: IdSignature): DeclarationDescriptor? = descriptorFinder.findDescriptorBySignature(idSig)
override fun deserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol {
val descriptor = resolveDescriptor(idSig)
override fun tryDeserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol? {
val descriptor = resolveDescriptor(idSig) ?: return null
val declaration = stubGenerator.run {
when (symbolKind) {
@@ -156,6 +154,8 @@ class JvmIrLinker(
return declaration.symbol
}
override fun deserializedSymbolNotFound(idSig: IdSignature): Nothing = error("No descriptor found for $idSig")
override fun declareIrSymbol(symbol: IrSymbol) {
if (symbol is IrFieldSymbol) {
declareJavaFieldStub(symbol)