diff --git a/backend.native/build.gradle b/backend.native/build.gradle index feb5d046afd..36147b6c208 100644 --- a/backend.native/build.gradle +++ b/backend.native/build.gradle @@ -200,7 +200,7 @@ targetList.each { target -> "-Dkonan.home=${project.parent.file('dist')}", "-Djava.library.path=${project.buildDir}/nativelibs" args('-output', project(':runtime').file("build/${target}/stdlib.kt.bc"), - '-nolink', '-nostdlib', '-compile_as_stdlib', + '-nolink', '-nostdlib', '-compile_as_stdlib', '-ea', '-target', target, '-runtime', project(':runtime').file("build/${target}/runtime.bc"), '-properties', project(':backend.native').file('konan.properties'), @@ -226,7 +226,7 @@ targetList.each { target -> "-Dkonan.home=${project.parent.file('dist')}", "-Djava.library.path=${project.buildDir}/nativelibs" args('-output', project(':runtime').file("build/${target}/start.kt.bc"), - '-nolink', '-nostdlib', + '-nolink', '-nostdlib', '-ea', '-target', target, '-library', project(':runtime').file("build/${target}/stdlib.kt.bc"), '-runtime', project(':runtime').file("build/${target}/runtime.bc"), diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 7d773b150dd..036f2c96b80 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -105,6 +105,8 @@ class K2Native : CLICompiler() { arguments.verbosePhases.toNonNullList()) put(LIST_PHASES, arguments.listPhases) put(TIME_PHASES, arguments.timePhases) + + put(ENABLE_ASSERTIONS, arguments.enableAssertions) }} } diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java index b42122c2a13..b97375db487 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java @@ -83,5 +83,8 @@ public class K2NativeCompilerArguments extends CommonCompilerArguments { @Argument(value = "time", description = "Report execution time for compiler phases") public boolean timePhases; + + @Argument(value = "enable_assertions", alias = "ea", description = "Enable runtime assertions in generated code") + public boolean enableAssertions; } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index 2ceb403cd23..6eb75c50d78 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -65,6 +65,9 @@ class KonanConfigKeys { = CompilerConfigurationKey.create("list backend phases") val TIME_PHASES: CompilerConfigurationKey = CompilerConfigurationKey.create("time backend phases") + + val ENABLE_ASSERTIONS: CompilerConfigurationKey + = CompilerConfigurationKey.create("enable runtime assertions in generated code") } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt index 2fe58726c32..4cfc8afdfe2 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt @@ -2,6 +2,7 @@ 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.backend.konan.KonanConfigKeys.Companion.ENABLE_ASSERTIONS import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalFunctions import org.jetbrains.kotlin.backend.konan.util.atMostOne import org.jetbrains.kotlin.descriptors.FunctionDescriptor @@ -9,12 +10,15 @@ import org.jetbrains.kotlin.ir.descriptors.IrBuiltinOperatorDescriptor import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrBinaryPrimitiveImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl import org.jetbrains.kotlin.ir.expressions.impl.IrTryImpl import org.jetbrains.kotlin.ir.util.isNullConst import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.types.typeUtil.isNothing import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf +import org.jetbrains.kotlin.types.typeUtil.isUnit /** * This lowering pass lowers some calls to [IrBuiltinOperatorDescriptor]s. @@ -34,10 +38,21 @@ private class BuiltinOperatorTransformer(val context: Context) : IrElementTransf private val builtIns = context.builtIns private val irBuiltins = context.irModule!!.irBuiltins + private val assertFqName = "kotlin.assert" + override fun visitCall(expression: IrCall): IrExpression { expression.transformChildrenVoid(this) + val descriptor = expression.descriptor - if (expression.descriptor is IrBuiltinOperatorDescriptor) { + // TODO: use stdlib assert's descriptors instead of fqName + // Replace assert() call with an empty composite if assertions are not enabled. + if (descriptor.fqNameSafe.asString() == assertFqName && + !context.config.configuration.getBoolean(ENABLE_ASSERTIONS)) { + assert(expression.type.isUnit()) + return IrCompositeImpl(expression.startOffset, expression.endOffset, expression.type) + } + + if (descriptor is IrBuiltinOperatorDescriptor) { return transformBuiltinOperator(expression) } diff --git a/buildSrc/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy b/buildSrc/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy index c89c7d437c6..e7b61334d97 100644 --- a/buildSrc/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy +++ b/buildSrc/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy @@ -75,9 +75,10 @@ abstract class KonanTest extends JavaExec { classpath = project.configurations.cli_bc enableAssertions = true args = ["-output", output, - *filesToCompile, - *moreArgs, - *project.globalArgs] + "-ea", + *filesToCompile, + *moreArgs, + *project.globalArgs] standardOutput = log errorOutput = log super.exec()