JVM_IR: call serialization for IR.

Serializer for IR is called when -Xserialize-ir flag is set.
This commit is contained in:
Georgy Bronnikov
2021-02-26 17:42:58 +03:00
committed by TeamCityServer
parent 9efd0d7589
commit b2617199bc
10 changed files with 85 additions and 11 deletions

View File

@@ -499,6 +499,12 @@ default: `indy-with-constants` for JVM target 9 or greater, `inline` otherwise""
)
var typeEnhancementImprovementsInStrictMode: Boolean by FreezableVar(false)
@Argument(
value = "-Xserialize-ir",
description = "Save IR to metadata (EXPERIMENTAL)"
)
var serializeIr: Boolean by FreezableVar(false)
override fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap<AnalysisFlag<*>, Any> {
val result = super.configureAnalysisFlags(collector, languageVersion)
result[JvmAnalysisFlags.strictMetadataVersionSemantics] = strictMetadataVersionSemantics

View File

@@ -252,6 +252,8 @@ fun CompilerConfiguration.configureAdvancedJvmOptions(arguments: K2JVMCompilerAr
put(JVMConfigurationKeys.NO_RESET_JAR_TIMESTAMPS, arguments.noResetJarTimestamps)
put(JVMConfigurationKeys.NO_UNIFIED_NULL_CHECKS, arguments.noUnifiedNullChecks)
put(JVMConfigurationKeys.SERIALIZE_IR, arguments.serializeIr)
if (!JVMConstructorCallNormalizationMode.isSupportedValue(arguments.constructorCallNormalizationMode)) {
messageCollector.report(
ERROR,

View File

@@ -152,4 +152,7 @@ public class JVMConfigurationKeys {
public static final CompilerConfigurationKey<Boolean> NO_REFLECT =
CompilerConfigurationKey.create("Don't automatically include kotlin-reflect.jar into the output if the output is a jar");
public static final CompilerConfigurationKey<Boolean> SERIALIZE_IR =
CompilerConfigurationKey.create("serialize IR to class metadata");
}

View File

@@ -26,9 +26,13 @@ sealed class FirMetadataSource : MetadataSource {
else -> null
}
class File(override val fir: FirFile) : FirMetadataSource(), MetadataSource.File
class File(override val fir: FirFile) : FirMetadataSource(), MetadataSource.File {
override var serializedIr: ByteArray? = null
}
class Class(override val fir: FirClass) : FirMetadataSource(), MetadataSource.Class
class Class(override val fir: FirClass) : FirMetadataSource(), MetadataSource.Class {
override var serializedIr: ByteArray? = null
}
class Function(override val fir: FirFunction) : FirMetadataSource(), MetadataSource.Function

View File

@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrLinker
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.descriptors.IrFunctionFactory
@@ -186,6 +187,16 @@ open class JvmIrCodegenFactory(
/* JvmBackendContext creates new unbound symbols, have to resolve them. */
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
if (state.configuration.getBoolean(JVMConfigurationKeys.SERIALIZE_IR)) {
for (irFile in irModuleFragment.files) {
(irFile.metadata as? MetadataSource.File)?.serializedIr = serializeIrFile(context, irFile)
for (irClass in irFile.declarations.filterIsInstance<IrClass>()) {
(irClass.metadata as? MetadataSource.Class)?.serializedIr = serializeTopLevelIrClass(context, irClass)
}
}
}
context.state.factory.registerSourceFiles(irModuleFragment.files.map(IrFile::getKtFile))
jvmPhases.invokeToplevel(phaseConfig, context, irModuleFragment)

View File

@@ -11,10 +11,8 @@ 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.jvm.codegen.ClassCodegen
import org.jetbrains.kotlin.backend.jvm.codegen.IrTypeMapper
import org.jetbrains.kotlin.backend.jvm.codegen.MethodSignatureMapper
import org.jetbrains.kotlin.backend.jvm.codegen.createFakeContinuation
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
import org.jetbrains.kotlin.backend.jvm.lower.BridgeLowering
@@ -22,6 +20,7 @@ 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
@@ -224,4 +223,6 @@ class JvmBackendContext(
override fun shouldGenerateHandlerParameterForDefaultBodyFun() = true
}
val declarationTable = DeclarationTable(JvmGlobalDeclarationTable())
}

View File

@@ -0,0 +1,27 @@
/*
* 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(),
)

View File

@@ -11,8 +11,12 @@ import org.jetbrains.kotlin.name.Name
interface MetadataSource {
val name: Name?
interface File : MetadataSource
interface Class : MetadataSource
interface File : MetadataSource {
var serializedIr: ByteArray?
}
interface Class : MetadataSource {
var serializedIr: ByteArray?
}
interface Script : MetadataSource
interface Function : MetadataSource
interface Property : MetadataSource {
@@ -27,9 +31,13 @@ sealed class DescriptorMetadataSource : MetadataSource {
override val name: Name?
get() = descriptor?.name
class File(val descriptors: List<DeclarationDescriptor>) : DescriptorMetadataSource(), MetadataSource.File
class File(val descriptors: List<DeclarationDescriptor>) : DescriptorMetadataSource(), MetadataSource.File {
override var serializedIr: ByteArray? = null
}
class Class(override val descriptor: ClassDescriptor) : DescriptorMetadataSource(), MetadataSource.Class
class Class(override val descriptor: ClassDescriptor) : DescriptorMetadataSource(), MetadataSource.Class {
override var serializedIr: ByteArray? = null
}
class Script(override val descriptor: ScriptDescriptor) : DescriptorMetadataSource(), MetadataSource.Script

View File

@@ -0,0 +1,12 @@
/*
* 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.serialization
import org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
class JvmGlobalDeclarationTable : GlobalDeclarationTable(IdSignatureSerializer(JvmIrMangler), JvmIrMangler)

View File

@@ -113,6 +113,7 @@ where advanced options include:
problems with parentheses in identifiers on certain platforms
-Xscript-resolver-environment=<key=value[,]>
Script resolver environment in key-value pairs (the value could be quoted and escaped)
-Xserialize-ir Save IR to metadata (EXPERIMENTAL)
-Xsingle-module Combine modules for source files and binary dependencies into a single module
-Xskip-runtime-version-check Allow Kotlin runtime libraries of incompatible versions in the classpath
-Xstrict-java-nullability-assertions
@@ -203,4 +204,3 @@ where advanced options include:
Advanced options are non-standard and may be changed or removed without any notice.
OK