[K/N] Extracted asserts removal to a separate lowering
This commit is contained in:
+1
@@ -63,6 +63,7 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration
|
|||||||
?: target.family.isAppleFamily // Default is true for Apple targets.
|
?: target.family.isAppleFamily // Default is true for Apple targets.
|
||||||
val generateDebugTrampoline = debug && configuration.get(KonanConfigKeys.GENERATE_DEBUG_TRAMPOLINE) ?: false
|
val generateDebugTrampoline = debug && configuration.get(KonanConfigKeys.GENERATE_DEBUG_TRAMPOLINE) ?: false
|
||||||
val optimizationsEnabled = configuration.getBoolean(KonanConfigKeys.OPTIMIZATION)
|
val optimizationsEnabled = configuration.getBoolean(KonanConfigKeys.OPTIMIZATION)
|
||||||
|
val assertsEnabled = configuration.getBoolean(KonanConfigKeys.ENABLE_ASSERTIONS)
|
||||||
val sanitizer = configuration.get(BinaryOptions.sanitizer)?.takeIf {
|
val sanitizer = configuration.get(BinaryOptions.sanitizer)?.takeIf {
|
||||||
when {
|
when {
|
||||||
it != SanitizerKind.THREAD -> "${it.name} sanitizer is not supported yet"
|
it != SanitizerKind.THREAD -> "${it.name} sanitizer is not supported yet"
|
||||||
|
|||||||
+7
@@ -487,6 +487,12 @@ private val objectClassesPhase = createFileLoweringPhase(
|
|||||||
description = "Object classes lowering"
|
description = "Object classes lowering"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private val assertsRemovalPhase = createFileLoweringPhase(
|
||||||
|
lowering = ::AssertRemovalLowering,
|
||||||
|
name = "AssertsRemoval",
|
||||||
|
description = "Asserts removal"
|
||||||
|
)
|
||||||
|
|
||||||
private val constEvaluationPhase = createFileLoweringPhase(
|
private val constEvaluationPhase = createFileLoweringPhase(
|
||||||
lowering = { context: Context ->
|
lowering = { context: Context ->
|
||||||
val configuration = IrInterpreterConfiguration(printOnlyExceptionMessage = true)
|
val configuration = IrInterpreterConfiguration(printOnlyExceptionMessage = true)
|
||||||
@@ -509,6 +515,7 @@ private fun PhaseEngine<NativeGenerationState>.getAllLowerings() = listOfNotNull
|
|||||||
inlinePhase,
|
inlinePhase,
|
||||||
removeExpectDeclarationsPhase,
|
removeExpectDeclarationsPhase,
|
||||||
stripTypeAliasDeclarationsPhase,
|
stripTypeAliasDeclarationsPhase,
|
||||||
|
assertsRemovalPhase.takeUnless { context.config.assertsEnabled },
|
||||||
constEvaluationPhase,
|
constEvaluationPhase,
|
||||||
provisionalFunctionExpressionPhase,
|
provisionalFunctionExpressionPhase,
|
||||||
postInlinePhase,
|
postInlinePhase,
|
||||||
|
|||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 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.konan.lower
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
|
||||||
|
import org.jetbrains.kotlin.backend.konan.Context
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrBlock
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrReturnableBlock
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
|
||||||
|
import org.jetbrains.kotlin.ir.util.inlineFunction
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
|
|
||||||
|
internal class AssertRemovalLowering(val context: Context) : BodyLoweringPass {
|
||||||
|
private val asserts = context.ir.symbols.asserts.toSet()
|
||||||
|
|
||||||
|
override fun lower(irBody: IrBody, container: IrDeclaration) {
|
||||||
|
irBody.transformChildrenVoid(object : IrElementTransformerVoid() {
|
||||||
|
override fun visitBlock(expression: IrBlock): IrExpression {
|
||||||
|
if ((expression as? IrReturnableBlock)?.inlineFunction?.let { it.symbol in asserts } == true)
|
||||||
|
return IrCompositeImpl(expression.startOffset, expression.endOffset, expression.type)
|
||||||
|
return super.visitBlock(expression)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
-14
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.backend.common.ir.Symbols
|
|||||||
import org.jetbrains.kotlin.backend.common.lower.at
|
import org.jetbrains.kotlin.backend.common.lower.at
|
||||||
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
import org.jetbrains.kotlin.backend.konan.Context
|
||||||
import org.jetbrains.kotlin.backend.konan.KonanConfigKeys
|
|
||||||
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
|
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
|
||||||
@@ -19,8 +18,6 @@ import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
|
|||||||
import org.jetbrains.kotlin.ir.expressions.IrBody
|
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
|
|
||||||
import org.jetbrains.kotlin.ir.types.isUnit
|
|
||||||
import org.jetbrains.kotlin.ir.util.file
|
import org.jetbrains.kotlin.ir.util.file
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||||
|
|
||||||
@@ -30,12 +27,6 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
|||||||
* - First phase of typeOf intrinsic lowering.
|
* - First phase of typeOf intrinsic lowering.
|
||||||
*/
|
*/
|
||||||
internal class PreInlineLowering(val context: Context) : BodyLoweringPass {
|
internal class PreInlineLowering(val context: Context) : BodyLoweringPass {
|
||||||
|
|
||||||
private val symbols get() = context.ir.symbols
|
|
||||||
|
|
||||||
private val asserts = symbols.asserts.toSet()
|
|
||||||
private val enableAssertions = context.config.configuration.getBoolean(KonanConfigKeys.ENABLE_ASSERTIONS)
|
|
||||||
|
|
||||||
override fun lower(irBody: IrBody, container: IrDeclaration) = lower(irBody, container, container.file)
|
override fun lower(irBody: IrBody, container: IrDeclaration) = lower(irBody, container, container.file)
|
||||||
|
|
||||||
fun lower(irBody: IrBody, container: IrDeclaration, irFile: IrFile) {
|
fun lower(irBody: IrBody, container: IrDeclaration, irFile: IrFile) {
|
||||||
@@ -50,11 +41,6 @@ internal class PreInlineLowering(val context: Context) : BodyLoweringPass {
|
|||||||
expression.transformChildren(this, data)
|
expression.transformChildren(this, data)
|
||||||
|
|
||||||
return when {
|
return when {
|
||||||
!enableAssertions && expression.symbol in asserts -> {
|
|
||||||
// Replace assert() call with an empty composite if assertions are not enabled.
|
|
||||||
require(expression.type.isUnit())
|
|
||||||
IrCompositeImpl(expression.startOffset, expression.endOffset, expression.type)
|
|
||||||
}
|
|
||||||
Symbols.isTypeOfIntrinsic(expression.symbol) -> {
|
Symbols.isTypeOfIntrinsic(expression.symbol) -> {
|
||||||
with (KTypeGenerator(context, irFile, expression, needExactTypeParameters = true)) {
|
with (KTypeGenerator(context, irFile, expression, needExactTypeParameters = true)) {
|
||||||
data.at(expression).irKType(expression.getTypeArgument(0)!!, leaveReifiedForLater = true)
|
data.at(expression).irKType(expression.getTypeArgument(0)!!, leaveReifiedForLater = true)
|
||||||
|
|||||||
Reference in New Issue
Block a user