backend: Generate assert call depending on the compiler key
This commit is contained in:
@@ -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"),
|
||||
|
||||
@@ -105,6 +105,8 @@ class K2Native : CLICompiler<K2NativeCompilerArguments>() {
|
||||
arguments.verbosePhases.toNonNullList())
|
||||
put(LIST_PHASES, arguments.listPhases)
|
||||
put(TIME_PHASES, arguments.timePhases)
|
||||
|
||||
put(ENABLE_ASSERTIONS, arguments.enableAssertions)
|
||||
}}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+3
@@ -65,6 +65,9 @@ class KonanConfigKeys {
|
||||
= CompilerConfigurationKey.create("list backend phases")
|
||||
val TIME_PHASES: CompilerConfigurationKey<Boolean>
|
||||
= CompilerConfigurationKey.create("time backend phases")
|
||||
|
||||
val ENABLE_ASSERTIONS: CompilerConfigurationKey<Boolean>
|
||||
= CompilerConfigurationKey.create("enable runtime assertions in generated code")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+16
-1
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user