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')}",
|
"-Dkonan.home=${project.parent.file('dist')}",
|
||||||
"-Djava.library.path=${project.buildDir}/nativelibs"
|
"-Djava.library.path=${project.buildDir}/nativelibs"
|
||||||
args('-output', project(':runtime').file("build/${target}/stdlib.kt.bc"),
|
args('-output', project(':runtime').file("build/${target}/stdlib.kt.bc"),
|
||||||
'-nolink', '-nostdlib', '-compile_as_stdlib',
|
'-nolink', '-nostdlib', '-compile_as_stdlib', '-ea',
|
||||||
'-target', target,
|
'-target', target,
|
||||||
'-runtime', project(':runtime').file("build/${target}/runtime.bc"),
|
'-runtime', project(':runtime').file("build/${target}/runtime.bc"),
|
||||||
'-properties', project(':backend.native').file('konan.properties'),
|
'-properties', project(':backend.native').file('konan.properties'),
|
||||||
@@ -226,7 +226,7 @@ targetList.each { target ->
|
|||||||
"-Dkonan.home=${project.parent.file('dist')}",
|
"-Dkonan.home=${project.parent.file('dist')}",
|
||||||
"-Djava.library.path=${project.buildDir}/nativelibs"
|
"-Djava.library.path=${project.buildDir}/nativelibs"
|
||||||
args('-output', project(':runtime').file("build/${target}/start.kt.bc"),
|
args('-output', project(':runtime').file("build/${target}/start.kt.bc"),
|
||||||
'-nolink', '-nostdlib',
|
'-nolink', '-nostdlib', '-ea',
|
||||||
'-target', target,
|
'-target', target,
|
||||||
'-library', project(':runtime').file("build/${target}/stdlib.kt.bc"),
|
'-library', project(':runtime').file("build/${target}/stdlib.kt.bc"),
|
||||||
'-runtime', project(':runtime').file("build/${target}/runtime.bc"),
|
'-runtime', project(':runtime').file("build/${target}/runtime.bc"),
|
||||||
|
|||||||
@@ -105,6 +105,8 @@ class K2Native : CLICompiler<K2NativeCompilerArguments>() {
|
|||||||
arguments.verbosePhases.toNonNullList())
|
arguments.verbosePhases.toNonNullList())
|
||||||
put(LIST_PHASES, arguments.listPhases)
|
put(LIST_PHASES, arguments.listPhases)
|
||||||
put(TIME_PHASES, arguments.timePhases)
|
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")
|
@Argument(value = "time", description = "Report execution time for compiler phases")
|
||||||
public boolean timePhases;
|
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")
|
= CompilerConfigurationKey.create("list backend phases")
|
||||||
val TIME_PHASES: CompilerConfigurationKey<Boolean>
|
val TIME_PHASES: CompilerConfigurationKey<Boolean>
|
||||||
= CompilerConfigurationKey.create("time backend phases")
|
= 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.common.BodyLoweringPass
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
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.descriptors.getKonanInternalFunctions
|
||||||
import org.jetbrains.kotlin.backend.konan.util.atMostOne
|
import org.jetbrains.kotlin.backend.konan.util.atMostOne
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
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.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrBinaryPrimitiveImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrBinaryPrimitiveImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
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.expressions.impl.IrTryImpl
|
||||||
import org.jetbrains.kotlin.ir.util.isNullConst
|
import org.jetbrains.kotlin.ir.util.isNullConst
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
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.isNothing
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isUnit
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This lowering pass lowers some calls to [IrBuiltinOperatorDescriptor]s.
|
* 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 builtIns = context.builtIns
|
||||||
private val irBuiltins = context.irModule!!.irBuiltins
|
private val irBuiltins = context.irModule!!.irBuiltins
|
||||||
|
|
||||||
|
private val assertFqName = "kotlin.assert"
|
||||||
|
|
||||||
override fun visitCall(expression: IrCall): IrExpression {
|
override fun visitCall(expression: IrCall): IrExpression {
|
||||||
expression.transformChildrenVoid(this)
|
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)
|
return transformBuiltinOperator(expression)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -75,9 +75,10 @@ abstract class KonanTest extends JavaExec {
|
|||||||
classpath = project.configurations.cli_bc
|
classpath = project.configurations.cli_bc
|
||||||
enableAssertions = true
|
enableAssertions = true
|
||||||
args = ["-output", output,
|
args = ["-output", output,
|
||||||
*filesToCompile,
|
"-ea",
|
||||||
*moreArgs,
|
*filesToCompile,
|
||||||
*project.globalArgs]
|
*moreArgs,
|
||||||
|
*project.globalArgs]
|
||||||
standardOutput = log
|
standardOutput = log
|
||||||
errorOutput = log
|
errorOutput = log
|
||||||
super.exec()
|
super.exec()
|
||||||
|
|||||||
Reference in New Issue
Block a user