backend: Generate assert call depending on the compiler key

This commit is contained in:
Ilya Matveev
2017-03-10 16:30:57 +03:00
committed by ilmat192
parent 30be84cd55
commit 97b5bb527d
6 changed files with 30 additions and 6 deletions
+2 -2
View File
@@ -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;
}
@@ -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")
}
}
@@ -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()