Add new jvm compilation key ignoreConstOptimizationErrors

This key suppose to be a workaround in keys if something goes
wrong in ir interpreter.
This commit is contained in:
Ivan Kylchik
2022-08-18 15:44:31 +03:00
committed by Space
parent 44af612775
commit 3027ea9551
6 changed files with 23 additions and 3 deletions
@@ -518,6 +518,12 @@ Also sets `-jvm-target` value equal to the selected JDK version"""
)
var enableDebugMode: Boolean by FreezableVar(false)
@Argument(
value = "-Xignore-const-optimization-errors",
description = "Ignore all compilation exceptions while optimizing some constant expressions."
)
var ignoreConstOptimizationErrors: Boolean by FreezableVar(false)
override fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap<AnalysisFlag<*>, Any> {
val result = super.configureAnalysisFlags(collector, languageVersion)
result[JvmAnalysisFlags.strictMetadataVersionSemantics] = strictMetadataVersionSemantics
@@ -311,6 +311,7 @@ fun CompilerConfiguration.configureAdvancedJvmOptions(arguments: K2JVMCompilerAr
put(JVMConfigurationKeys.LINK_VIA_SIGNATURES, arguments.linkViaSignatures)
put(JVMConfigurationKeys.ENABLE_DEBUG_MODE, arguments.enableDebugMode)
put(JVMConfigurationKeys.IGNORE_CONST_OPTIMIZATION_ERRORS, arguments.ignoreConstOptimizationErrors)
val assertionsMode =
JVMAssertionsMode.fromStringOrNull(arguments.assertionsMode)
@@ -159,4 +159,7 @@ public class JVMConfigurationKeys {
public static final CompilerConfigurationKey<Boolean> ENABLE_DEBUG_MODE =
CompilerConfigurationKey.create("Enable debug mode");
public static final CompilerConfigurationKey<Boolean> IGNORE_CONST_OPTIMIZATION_ERRORS =
CompilerConfigurationKey.create("Ignore errors from IrConstTransformer");
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.lower
import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.expressions.IrErrorExpression
@@ -40,7 +41,10 @@ class ConstEvaluationLowering(val context: JvmBackendContext) : FileLoweringPass
.report(JvmBackendErrors.EXCEPTION_IN_CONST_EXPRESSION, warning.description)
}
val transformer = IrConstTransformer(interpreter, irFile, mode = EvaluationMode.ONLY_INTRINSIC_CONST, ::onWarning, ::onError)
val suppressErrors = context.configuration.getBoolean(JVMConfigurationKeys.IGNORE_CONST_OPTIMIZATION_ERRORS)
val transformer = IrConstTransformer(
interpreter, irFile, mode = EvaluationMode.ONLY_INTRINSIC_CONST, ::onWarning, ::onError, suppressErrors
)
irFile.transformChildren(transformer, null)
}
}
@@ -7,12 +7,14 @@ package org.jetbrains.kotlin.ir.interpreter.checker
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl
import org.jetbrains.kotlin.ir.interpreter.IrInterpreter
import org.jetbrains.kotlin.ir.interpreter.isPrimitiveArray
@@ -26,7 +28,8 @@ class IrConstTransformer(
private val irFile: IrFile,
private val mode: EvaluationMode,
private val onWarning: (IrElement, IrErrorExpression) -> Unit = { _, _ -> },
private val onError: (IrElement, IrErrorExpression) -> Unit = { _, _ -> }
private val onError: (IrElement, IrErrorExpression) -> Unit = { _, _ -> },
private val suppressExceptions: Boolean = false,
) : IrElementTransformerVoid() {
private fun IrExpression.warningIfError(original: IrExpression): IrExpression {
if (this is IrErrorExpression) {
@@ -52,7 +55,8 @@ class IrConstTransformer(
val result = try {
interpreter.interpret(this, irFile)
} catch (e: Throwable) {
throw AssertionError("Error occurred while optimizing an expression:\n${this.dump()}", e)
if (!suppressExceptions) throw AssertionError("Error occurred while optimizing an expression:\n${this.dump()}", e)
return IrErrorExpressionImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, this.type, e.message.toString()).warningIfError(this)
}
return if (failAsError) result.reportIfError(this) else result.warningIfError(this)
+2
View File
@@ -35,6 +35,8 @@ where advanced options include:
-Xenhance-type-parameter-types-to-def-not-null
Enhance not null annotated type parameter's types to definitely not null types (@NotNull T => T & Any)
-Xfriend-paths=<path> Paths to output directories for friend modules (whose internals should be visible)
-Xignore-const-optimization-errors
Ignore all compilation exceptions while optimizing some constant expressions.
-Xmultifile-parts-inherit Compile multifile classes as a hierarchy of parts and facade
-Xmodule-path=<path> Paths where to find Java 9+ modules
-Xjava-package-prefix Package prefix for Java files