JVM_IR: introduce modes for IR serialization

Instead of a Boolean flag -Xserialize-ir, use modes: none,inline,all.
In "inline" mode, only information needed to deserialize bodies of inline
functions is serialized.
In the "all" mode, all declarations are serialized completely.
This commit is contained in:
Georgy Bronnikov
2021-09-09 13:35:23 +03:00
committed by TeamCityServer
parent f760cd6736
commit 4caa71538d
12 changed files with 55 additions and 16 deletions
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.backend.jvm.serialization.deserializeClassFromByteAr
import org.jetbrains.kotlin.backend.jvm.serialization.deserializeIrFileFromByteArray
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.JvmSerializeIrMode
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.FilteredAnnotations
@@ -69,7 +70,7 @@ open class JvmGeneratorExtensionsImpl(
) : GeneratorExtensions(), JvmGeneratorExtensions {
override val classNameOverride: MutableMap<IrClass, JvmClassName> = mutableMapOf()
override val irDeserializationEnabled: Boolean = configuration.getBoolean(JVMConfigurationKeys.SERIALIZE_IR)
override val irDeserializationEnabled: Boolean = configuration.get(JVMConfigurationKeys.SERIALIZE_IR) != JvmSerializeIrMode.NONE
override val cachedFields = CachedFieldsForObjectInstances(IrFactoryImpl, configuration.languageVersionSettings)
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.codegen.CodegenFactory
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.JvmSerializeIrMode
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
import org.jetbrains.kotlin.descriptors.konan.KlibModuleOrigin
@@ -209,7 +210,9 @@ open class JvmIrCodegenFactory(
override fun generateModule(state: GenerationState, input: CodegenFactory.BackendInput) {
val (irModuleFragment, symbolTable, customPhaseConfig, irProviders, extensions, backendExtension, notifyCodegenStart) =
input as JvmIrBackendInput
val irSerializer = if (state.configuration.getBoolean(JVMConfigurationKeys.SERIALIZE_IR))
val irSerializer = if (
state.configuration.get(JVMConfigurationKeys.SERIALIZE_IR, JvmSerializeIrMode.NONE) != JvmSerializeIrMode.NONE
)
JvmIrSerializerImpl(state.configuration)
else null
val phaseConfig = customPhaseConfig ?: PhaseConfig(jvmPhases)
@@ -9,6 +9,8 @@ import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
import org.jetbrains.kotlin.backend.jvm.serialization.JvmGlobalDeclarationTable
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIrSerializerSession
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.JvmSerializeIrMode
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.util.IrMessageLogger
@@ -31,5 +33,6 @@ class JvmIrSerializerImpl(private val configuration: CompilerConfiguration) : Jv
configuration.get(IrMessageLogger.IR_MESSAGE_LOGGER) ?: IrMessageLogger.None,
declarationTable,
mutableMapOf(),
configuration.get(JVMConfigurationKeys.SERIALIZE_IR) ?: JvmSerializeIrMode.NONE
)
}
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
import org.jetbrains.kotlin.backend.jvm.serialization.proto.JvmIr
import org.jetbrains.kotlin.config.JvmSerializeIrMode
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile
@@ -20,11 +21,16 @@ class JvmIrSerializerSession(
messageLogger: IrMessageLogger,
private val declarationTable: DeclarationTable,
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
externallyVisibleOnly: Boolean = true,
mode: JvmSerializeIrMode,
skipExpects: Boolean = false,
) : IrFileSerializer(
messageLogger, declarationTable, expectDescriptorToSymbol, CompatibilityMode.CURRENT, externallyVisibleOnly, skipExpects
messageLogger, declarationTable, expectDescriptorToSymbol, CompatibilityMode.CURRENT,
bodiesOnlyForInlines = mode == JvmSerializeIrMode.INLINE,
skipExpects
) {
init {
assert(mode != JvmSerializeIrMode.NONE)
}
// Usage protocol: construct an instance, call only one of `serializeIrFile()` and `serializeTopLevelClass()` only once.