JVM_IR: untangle backend.jvm and serialization.jvm (again)

This commit is contained in:
Georgy Bronnikov
2021-05-26 16:18:30 +03:00
committed by TeamCityServer
parent 1c4466951f
commit a63cc95a2a
7 changed files with 58 additions and 39 deletions
@@ -179,8 +179,11 @@ open class JvmIrCodegenFactory(
fun doGenerateFilesInternal(input: JvmIrBackendInput) {
val (state, irModuleFragment, symbolTable, phaseConfig, irProviders, extensions, backendExtension, notifyCodegenStart) = input
val irSerializer = if (state.configuration.getBoolean(JVMConfigurationKeys.SERIALIZE_IR))
JvmIrSerializerImpl(state.configuration)
else null
val context = JvmBackendContext(
state, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions, backendExtension,
state, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions, backendExtension, irSerializer,
notifyCodegenStart
)
/* JvmBackendContext creates new unbound symbols, have to resolve them. */
@@ -0,0 +1,35 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.backend.jvm
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.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.util.IrMessageLogger
class JvmIrSerializerImpl(private val configuration: CompilerConfiguration) : JvmIrSerializer {
private val declarationTable = DeclarationTable(JvmGlobalDeclarationTable())
override fun serializeIrFile(irFile: IrFile): ByteArray {
return makeSerializerSession().serializeJvmIrFile(irFile).toByteArray()
}
override fun serializeTopLevelIrClass(irClass: IrClass): ByteArray {
assert(irClass.parent is IrFile)
return makeSerializerSession().serializeTopLevelClass(irClass).toByteArray()
}
private fun makeSerializerSession() =
JvmIrSerializerSession(
configuration.get(IrMessageLogger.IR_MESSAGE_LOGGER) ?: IrMessageLogger.None,
declarationTable,
mutableMapOf(),
)
}
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.backend.common.Mapping
import org.jetbrains.kotlin.backend.common.ir.Ir
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
import org.jetbrains.kotlin.backend.common.psi.PsiErrorBuilder
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
import org.jetbrains.kotlin.backend.jvm.codegen.*
import org.jetbrains.kotlin.backend.jvm.descriptors.JvmSharedVariablesManager
import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods
@@ -20,7 +19,6 @@ import org.jetbrains.kotlin.backend.jvm.lower.CollectionStubComputer
import org.jetbrains.kotlin.backend.jvm.lower.JvmInnerClassesSupport
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.InlineClassAbi
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.MemoizedInlineClassReplacements
import org.jetbrains.kotlin.backend.jvm.serialization.JvmGlobalDeclarationTable
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
@@ -50,6 +48,7 @@ class JvmBackendContext(
val phaseConfig: PhaseConfig,
val generatorExtensions: JvmGeneratorExtensions,
val backendExtension: JvmBackendExtension,
val irSerializer: JvmIrSerializer?,
val notifyCodegenStart: () -> Unit,
) : CommonBackendContext {
// If the JVM fqname of a class differs from what is implied by its parent, e.g. if it's a file class
@@ -225,6 +224,4 @@ class JvmBackendContext(
override fun shouldGenerateHandlerParameterForDefaultBodyFun() = true
}
val declarationTable = DeclarationTable(JvmGlobalDeclarationTable())
}
@@ -0,0 +1,14 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.backend.jvm
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile
interface JvmIrSerializer {
fun serializeTopLevelIrClass(irClass: IrClass): ByteArray
fun serializeIrFile(irFile: IrFile): ByteArray
}
@@ -10,9 +10,6 @@ import org.jetbrains.kotlin.backend.common.lower
import org.jetbrains.kotlin.backend.common.phaser.makeCustomPhase
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.expectDeclarationsRemovingPhase
import org.jetbrains.kotlin.backend.jvm.serializeIrFile
import org.jetbrains.kotlin.backend.jvm.serializeTopLevelIrClass
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
@@ -27,11 +24,11 @@ internal val serializeIrPhase = makeCustomPhase<JvmBackendContext, IrModuleFragm
class SerializeIrPhase(val context: JvmBackendContext) : FileLoweringPass {
override fun lower(irFile: IrFile) {
if (context.state.configuration.getBoolean(JVMConfigurationKeys.SERIALIZE_IR)) {
(irFile.metadata as? MetadataSource.File)?.serializedIr = serializeIrFile(context, irFile)
context.irSerializer?.let { irSerializer ->
(irFile.metadata as? MetadataSource.File)?.serializedIr = irSerializer.serializeIrFile(irFile)
for (irClass in irFile.declarations.filterIsInstance<IrClass>()) {
(irClass.metadata as? MetadataSource.Class)?.serializedIr = serializeTopLevelIrClass(context, irClass)
(irClass.metadata as? MetadataSource.Class)?.serializedIr = irSerializer.serializeTopLevelIrClass(irClass)
}
}
}
@@ -1,27 +0,0 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.backend.jvm
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIrSerializer
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.util.IrMessageLogger
fun serializeIrFile(context: JvmBackendContext, irFile: IrFile): ByteArray {
return makeSerializer(context).serializeJvmIrFile(irFile).toByteArray()
}
fun serializeTopLevelIrClass(context: JvmBackendContext, irClass: IrClass): ByteArray {
assert(irClass.parent is IrFile)
return makeSerializer(context).serializeTopLevelClass(irClass).toByteArray()
}
private fun makeSerializer(context: JvmBackendContext) =
JvmIrSerializer(
context.configuration.get(IrMessageLogger.IR_MESSAGE_LOGGER) ?: IrMessageLogger.None,
context.declarationTable,
mutableMapOf(),
)
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.ir.util.IrMessageLogger
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.protobuf.ByteString
class JvmIrSerializer(
class JvmIrSerializerSession(
messageLogger: IrMessageLogger,
declarationTable: DeclarationTable,
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,