[IR] Add a method to get ModuleDescriptor from IrPackageFragment

Ideally, instead of this method, there should be a link
to IrModuleFragment. Unfortunately, it would require to big refactoring,
as some of IrPackageFragment implementations doesn't have any
IrModuleFragment inside, and are not located inside any
IrModuleFragment.

So for now, we just implement and use everywhere a single way of
getting the module descriptor, which respects a IrModuleFragment
link if it exists, and fallbacks to descriptor-based method
if it doesn't.

^KT-62623
This commit is contained in:
Pavel Kunyavskiy
2023-10-16 17:13:02 +02:00
committed by Space Team
parent 9b9ddb760a
commit ad5831acc6
14 changed files with 50 additions and 30 deletions
@@ -90,7 +90,7 @@ val IrPackageFragment.konanLibrary: KotlinLibrary?
val moduleDescriptor = fileMetadata?.descriptors?.singleOrNull() as? ModuleDescriptor
moduleDescriptor?.konanLibrary?.let { return it }
}
return this.packageFragmentDescriptor.containingDeclaration.konanLibrary
return this.moduleDescriptor.konanLibrary
}
// Any changes made to konanLibrary here should be ported to the containsDeclaration
// function in LlvmModuleSpecificationBase in LlvmModuleSpecificationImpl.kt
@@ -7,20 +7,17 @@ package org.jetbrains.kotlin.backend.konan.llvm
import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
import org.jetbrains.kotlin.library.metadata.CompiledKlibModuleOrigin
import org.jetbrains.kotlin.library.metadata.SyntheticModulesOrigin
import org.jetbrains.kotlin.library.metadata.klibModuleOrigin
import org.jetbrains.kotlin.resolve.descriptorUtil.module
internal val DeclarationDescriptor.llvmSymbolOrigin: CompiledKlibModuleOrigin
private val ModuleDescriptor.llvmSymbolOrigin: CompiledKlibModuleOrigin
get() {
assert(!this.isExpectMember) { this }
val module = this.module
val moduleOrigin = module.klibModuleOrigin
val moduleOrigin = klibModuleOrigin
when (moduleOrigin) {
is CompiledKlibModuleOrigin -> return moduleOrigin
SyntheticModulesOrigin -> error("Declaration is synthetic and can't be an origin of LLVM symbol:\n${this}")
@@ -29,6 +26,5 @@ internal val DeclarationDescriptor.llvmSymbolOrigin: CompiledKlibModuleOrigin
internal val Context.standardLlvmSymbolsOrigin: CompiledKlibModuleOrigin get() = this.stdlibModule.llvmSymbolOrigin
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal val IrPackageFragment.llvmSymbolOrigin
get() = packageFragmentDescriptor.llvmSymbolOrigin
get() = moduleDescriptor.llvmSymbolOrigin
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.kotlin.konan.target.supportsCodeCoverage
import org.jetbrains.kotlin.resolve.descriptorUtil.module
/**
* "Umbrella" class of all the of the code coverage related logic.
@@ -75,7 +74,7 @@ internal class CoverageManager(val generationState: NativeGenerationState) {
@OptIn(ObsoleteDescriptorBasedAPI::class)
private fun fileCoverageFilter(file: IrFile) =
file.packageFragmentDescriptor.module in coveredModules
file.moduleDescriptor in coveredModules
/**
* Walk [irModuleFragment] subtree and collect [FileRegionInfo] for files that are part of [coveredModules].
@@ -80,7 +80,7 @@ private abstract class BaseInteropIrTransformer(
builder.getCompilerMessageLocation()
}
val uniqueModuleName = irFile.packageFragmentDescriptor.module.name.asString()
val uniqueModuleName = irFile.moduleDescriptor.name.asString()
.let { it.substring(1, it.lastIndex) }
val uniqueFileName = irFile.fileEntry.name
val uniquePrefix = buildString {
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.backend.common.reportWarning
import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.descriptors.isAbstract
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
import org.jetbrains.kotlin.backend.konan.getIncludedLibraryDescriptors
import org.jetbrains.kotlin.backend.konan.ir.buildSimpleAnnotation
import org.jetbrains.kotlin.backend.konan.reportCompilationError
import org.jetbrains.kotlin.descriptors.ClassKind
@@ -19,10 +18,8 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildField
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
@@ -679,8 +676,7 @@ internal class TestProcessor (val context: Context) {
}
// endregion
@OptIn(ObsoleteDescriptorBasedAPI::class)
private fun shouldProcessFile(irFile: IrFile): Boolean = irFile.packageFragmentDescriptor.module.let {
private fun shouldProcessFile(irFile: IrFile): Boolean = irFile.moduleDescriptor.let {
// Process test annotations in source libraries too.
it in context.sourcesModules
}
@@ -332,7 +332,7 @@ internal class KonanIrLinker(
fun getCachedDeclarationModuleDeserializer(declaration: IrDeclaration): KonanPartialModuleDeserializer? {
val packageFragment = declaration.getPackageFragment()
val moduleDescriptor = packageFragment.packageFragmentDescriptor.containingDeclaration
val moduleDescriptor = packageFragment.moduleDescriptor
val klib = packageFragment.konanLibrary
val declarationBeingCached = packageFragment is IrFile && klib != null && libraryBeingCached?.klib == klib
&& libraryBeingCached.strategy.contains(packageFragment.path)
@@ -394,7 +394,7 @@ internal class KonanIrLinker(
is IrFile -> packageFragment.path
is IrExternalPackageFragment -> {
val moduleDescriptor = packageFragment.packageFragmentDescriptor.containingDeclaration
val moduleDescriptor = packageFragment.moduleDescriptor
val moduleDeserializer = moduleDeserializers[moduleDescriptor] ?: error("No module deserializer for $moduleDescriptor")
moduleDeserializer.getFileNameOf(declaration)
}