From 8f3b9694f74e9ce916dd26db06dec8ed823d115c Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 20 Jul 2023 13:53:22 +0300 Subject: [PATCH] [K/N] Extracted asserts removal to a separate lowering --- .../kotlin/backend/konan/KonanConfig.kt | 1 + .../driver/phases/NativeLoweringPhases.kt | 7 ++++ .../konan/lower/AssertRemovalLowering.kt | 32 +++++++++++++++++++ .../backend/konan/lower/PreInlineLowering.kt | 14 -------- 4 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/AssertRemovalLowering.kt diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index b69c41a050e..fe844dcd146 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -63,6 +63,7 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration ?: target.family.isAppleFamily // Default is true for Apple targets. val generateDebugTrampoline = debug && configuration.get(KonanConfigKeys.GENERATE_DEBUG_TRAMPOLINE) ?: false val optimizationsEnabled = configuration.getBoolean(KonanConfigKeys.OPTIMIZATION) + val assertsEnabled = configuration.getBoolean(KonanConfigKeys.ENABLE_ASSERTIONS) val sanitizer = configuration.get(BinaryOptions.sanitizer)?.takeIf { when { it != SanitizerKind.THREAD -> "${it.name} sanitizer is not supported yet" diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt index 247f2438d5b..417dda8d3d4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt @@ -487,6 +487,12 @@ private val objectClassesPhase = createFileLoweringPhase( description = "Object classes lowering" ) +private val assertsRemovalPhase = createFileLoweringPhase( + lowering = ::AssertRemovalLowering, + name = "AssertsRemoval", + description = "Asserts removal" +) + private val constEvaluationPhase = createFileLoweringPhase( lowering = { context: Context -> val configuration = IrInterpreterConfiguration(printOnlyExceptionMessage = true) @@ -509,6 +515,7 @@ private fun PhaseEngine.getAllLowerings() = listOfNotNull inlinePhase, removeExpectDeclarationsPhase, stripTypeAliasDeclarationsPhase, + assertsRemovalPhase.takeUnless { context.config.assertsEnabled }, constEvaluationPhase, provisionalFunctionExpressionPhase, postInlinePhase, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/AssertRemovalLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/AssertRemovalLowering.kt new file mode 100644 index 00000000000..24aaaa84de7 --- /dev/null +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/AssertRemovalLowering.kt @@ -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) + } + }) + } +} \ No newline at end of file diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PreInlineLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PreInlineLowering.kt index f9bd2887c39..db2616f4718 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PreInlineLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PreInlineLowering.kt @@ -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.createIrBuilder 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.declarations.IrDeclaration 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.IrCall 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.visitors.IrElementTransformer @@ -30,12 +27,6 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer * - First phase of typeOf intrinsic lowering. */ 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) fun lower(irBody: IrBody, container: IrDeclaration, irFile: IrFile) { @@ -50,11 +41,6 @@ internal class PreInlineLowering(val context: Context) : BodyLoweringPass { expression.transformChildren(this, data) 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) -> { with (KTypeGenerator(context, irFile, expression, needExactTypeParameters = true)) { data.at(expression).irKType(expression.getTypeArgument(0)!!, leaveReifiedForLater = true)