[K/N] Remove unused default dependencies from klib

^KT-55603
This commit is contained in:
Pavel Kunyavskiy
2023-04-02 12:22:17 +02:00
committed by Space Team
parent f662908440
commit 95541da9a1
5 changed files with 51 additions and 20 deletions
@@ -1147,23 +1147,28 @@ open class SymbolTable(
throw IllegalArgumentException("Unexpected value descriptor: $value") throw IllegalArgumentException("Unexpected value descriptor: $value")
} }
private inline fun <D : DeclarationDescriptor, IR : IrSymbolOwner, S : IrBindableSymbol<D, IR>> FlatSymbolTable<D, IR, S>.forEachPublicSymbolImpl( private inline fun <D : DeclarationDescriptor, IR : IrSymbolOwner, S : IrBindableSymbol<D, IR>> FlatSymbolTable<D, IR, S>.forEachSymbolImpl(
block: (IrSymbol) -> Unit block: (IrSymbol) -> Unit
) { ) {
idSigToSymbol.forEach { (_, sym) -> idSigToSymbol.forEach { (_, sym) ->
assert(sym.isPublicApi)
block(sym) block(sym)
} }
} }
fun forEachPublicSymbol(block: (IrSymbol) -> Unit) { /**
classSymbolTable.forEachPublicSymbolImpl { block(it) } * This function is quite messy and doesn't have good contract of what exactly is traversed.
constructorSymbolTable.forEachPublicSymbolImpl { block(it) } * Basic idea is it traverse symbols which can be reasonable referered from other module
simpleFunctionSymbolTable.forEachPublicSymbolImpl { block(it) } *
propertySymbolTable.forEachPublicSymbolImpl { block(it) } * Be careful when using it, and avoid it, except really need.
enumEntrySymbolTable.forEachPublicSymbolImpl { block(it) } */
typeAliasSymbolTable.forEachPublicSymbolImpl { block(it) } fun forEachDeclarationSymbol(block: (IrSymbol) -> Unit) {
fieldSymbolTable.forEachPublicSymbolImpl { block(it) } classSymbolTable.forEachSymbolImpl { block(it) }
constructorSymbolTable.forEachSymbolImpl { block(it) }
simpleFunctionSymbolTable.forEachSymbolImpl { block(it) }
propertySymbolTable.forEachSymbolImpl { block(it) }
enumEntrySymbolTable.forEachSymbolImpl { block(it) }
typeAliasSymbolTable.forEachSymbolImpl { block(it) }
fieldSymbolTable.forEachSymbolImpl { block(it) }
} }
} }
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.isPublicApi
import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.library.IrLibrary import org.jetbrains.kotlin.library.IrLibrary
@@ -144,7 +145,8 @@ class CurrentModuleWithICDeserializer(
override fun init(delegate: IrModuleDeserializer) { override fun init(delegate: IrModuleDeserializer) {
val knownBuiltIns = irBuiltIns.knownBuiltins.map { (it as IrSymbolOwner).symbol }.toSet() val knownBuiltIns = irBuiltIns.knownBuiltins.map { (it as IrSymbolOwner).symbol }.toSet()
symbolTable.forEachPublicSymbol { symbolTable.forEachDeclarationSymbol {
assert(it.isPublicApi)
if (it.descriptor.isDirtyDescriptor()) { // public && non-deserialized should be dirty symbol if (it.descriptor.isDirtyDescriptor()) { // public && non-deserialized should be dirty symbol
if (it !in knownBuiltIns) { if (it !in knownBuiltIns) {
dirtyDeclarations[it.signature!!] = it dirtyDeclarations[it.signature!!] = it
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.isEmpty
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.*
@@ -25,10 +25,14 @@ import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.fir.pipeline.convertToIrAndActualize import org.jetbrains.kotlin.fir.pipeline.convertToIrAndActualize
import org.jetbrains.kotlin.fir.signaturer.Ir2FirManglerAdapter import org.jetbrains.kotlin.fir.signaturer.Ir2FirManglerAdapter
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories
import org.jetbrains.kotlin.library.metadata.impl.ForwardDeclarationKind
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
internal val KlibFactories = KlibMetadataFactories(::KonanBuiltIns, DynamicTypeDeserializer, PlatformDependentTypeTransformer.None) internal val KlibFactories = KlibMetadataFactories(::KonanBuiltIns, DynamicTypeDeserializer, PlatformDependentTypeTransformer.None)
@@ -39,7 +43,6 @@ internal fun PhaseContext.fir2Ir(
val fir2IrExtensions = Fir2IrExtensions.Default val fir2IrExtensions = Fir2IrExtensions.Default
var builtInsModule: KotlinBuiltIns? = null var builtInsModule: KotlinBuiltIns? = null
val dependencies = mutableListOf<ModuleDescriptorImpl>()
val resolvedLibraries = config.resolvedLibraries.getFullResolvedList() val resolvedLibraries = config.resolvedLibraries.getFullResolvedList()
val configuration = config.configuration val configuration = config.configuration
@@ -54,7 +57,6 @@ internal fun PhaseContext.fir2Ir(
packageAccessHandler = null, packageAccessHandler = null,
lookupTracker = LookupTracker.DO_NOTHING lookupTracker = LookupTracker.DO_NOTHING
) )
dependencies += moduleDescriptor
val isBuiltIns = moduleDescriptor.isNativeStdlib() val isBuiltIns = moduleDescriptor.isNativeStdlib()
if (isBuiltIns) builtInsModule = moduleDescriptor.builtIns if (isBuiltIns) builtInsModule = moduleDescriptor.builtIns
@@ -64,7 +66,7 @@ internal fun PhaseContext.fir2Ir(
librariesDescriptors.forEach { moduleDescriptor -> librariesDescriptors.forEach { moduleDescriptor ->
// Yes, just to all of them. // Yes, just to all of them.
moduleDescriptor.setDependencies(ArrayList(dependencies)) moduleDescriptor.setDependencies(ArrayList(librariesDescriptors))
} }
val diagnosticsReporter = DiagnosticReporterFactory.createPendingReporter() val diagnosticsReporter = DiagnosticReporterFactory.createPendingReporter()
@@ -92,6 +94,23 @@ internal fun PhaseContext.fir2Ir(
"`${irModuleFragment.name}` must be Name.special, since it's required by KlibMetadataModuleDescriptorFactoryImpl.createDescriptorOptionalBuiltIns()" "`${irModuleFragment.name}` must be Name.special, since it's required by KlibMetadataModuleDescriptorFactoryImpl.createDescriptorOptionalBuiltIns()"
} }
val usedPackages = buildSet {
components.symbolTable.forEachDeclarationSymbol {
val p = it.owner as? IrDeclaration ?: return@forEachDeclarationSymbol
val fragment = (p.getPackageFragment() as? IrExternalPackageFragment) ?: return@forEachDeclarationSymbol
add(fragment.fqName)
}
// This packages exists in all platform libraries, but can contain only synthetic declarations.
// These declarations are not really located in klib, so we don't need to depend on klib to use them.
removeAll(ForwardDeclarationKind.values().map { it.packageFqName })
}.toList()
val usedLibraries = librariesDescriptors.zip(resolvedLibraries).filter { (module, _) ->
usedPackages.any { !module.packageFragmentProviderForModuleContentWithoutDependencies.isEmpty(it) }
}.map { it.second }.toSet()
val symbols = createKonanSymbols(irModuleFragment, components, pluginContext) val symbols = createKonanSymbols(irModuleFragment, components, pluginContext)
val renderDiagnosticNames = configuration.getBoolean(CLIConfigurationKeys.RENDER_DIAGNOSTIC_INTERNAL_NAME) val renderDiagnosticNames = configuration.getBoolean(CLIConfigurationKeys.RENDER_DIAGNOSTIC_INTERNAL_NAME)
@@ -101,7 +120,7 @@ internal fun PhaseContext.fir2Ir(
throw KonanCompilationException("Compilation failed: there were some diagnostics during fir2ir") throw KonanCompilationException("Compilation failed: there were some diagnostics during fir2ir")
} }
return Fir2IrOutput(input.firResult, symbols, irModuleFragment, components, pluginContext, irActualizationResult) return Fir2IrOutput(input.firResult, symbols, irModuleFragment, components, pluginContext, irActualizationResult, usedLibraries)
} }
private fun PhaseContext.createKonanSymbols( private fun PhaseContext.createKonanSymbols(
@@ -45,13 +45,16 @@ internal fun PhaseContext.firSerializer(
configuration.get(CommonConfigurationKeys.METADATA_VERSION) configuration.get(CommonConfigurationKeys.METADATA_VERSION)
?: configuration.languageVersionSettings.languageVersion.toMetadataVersion() ?: configuration.languageVersionSettings.languageVersion.toMetadataVersion()
val resolvedLibraries = config.resolvedLibraries.getFullResolvedList(TopologicalLibraryOrder) // FIXME KT-55603 val resolvedLibraries = config.resolvedLibraries.getFullResolvedList(TopologicalLibraryOrder)
val usedResolvedLibraries = resolvedLibraries.filter {
(!it.isDefault && !configuration.getBoolean(KonanConfigKeys.PURGE_USER_LIBS)) || it in input.usedLibraries
}
val actualizedFirDeclarations = input.irActualizationResult.extractFirDeclarations() val actualizedFirDeclarations = input.irActualizationResult.extractFirDeclarations()
return serializeNativeModule( return serializeNativeModule(
configuration = configuration, configuration = configuration,
messageLogger = configuration.get(IrMessageLogger.IR_MESSAGE_LOGGER) ?: IrMessageLogger.None, messageLogger = configuration.get(IrMessageLogger.IR_MESSAGE_LOGGER) ?: IrMessageLogger.None,
sourceFiles, sourceFiles,
resolvedLibraries.map { it.library as KonanLibrary }, usedResolvedLibraries.map { it.library as KonanLibrary },
input.irModuleFragment, input.irModuleFragment,
expectDescriptorToSymbol = mutableMapOf() // TODO: expect -> actual mapping expectDescriptorToSymbol = mutableMapOf() // TODO: expect -> actual mapping
) { file -> ) { file ->
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.Fir2IrPluginContext import org.jetbrains.kotlin.fir.backend.Fir2IrPluginContext
import org.jetbrains.kotlin.fir.pipeline.FirResult import org.jetbrains.kotlin.fir.pipeline.FirResult
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
internal data class Fir2IrOutput( internal data class Fir2IrOutput(
val firResult: FirResult, val firResult: FirResult,
@@ -21,7 +22,8 @@ internal data class Fir2IrOutput(
val irModuleFragment: IrModuleFragment, val irModuleFragment: IrModuleFragment,
val components: Fir2IrComponents, val components: Fir2IrComponents,
val pluginContext: Fir2IrPluginContext, val pluginContext: Fir2IrPluginContext,
val irActualizationResult: IrActualizationResult? val irActualizationResult: IrActualizationResult?,
val usedLibraries: Set<KotlinResolvedLibrary>
) )
internal val Fir2IrPhase = createSimpleNamedCompilerPhase( internal val Fir2IrPhase = createSimpleNamedCompilerPhase(