[IR] Drop usages of IrBuiltIns from interpreter's map generator
This commit is contained in:
@@ -44,8 +44,6 @@ dependencies {
|
|||||||
wasmApi(project(":wasm:wasm.ir"))
|
wasmApi(project(":wasm:wasm.ir"))
|
||||||
wasmApi(kotlinStdlib())
|
wasmApi(kotlinStdlib())
|
||||||
interpreterApi(project(":compiler:ir.tree"))
|
interpreterApi(project(":compiler:ir.tree"))
|
||||||
interpreterApi(project(":compiler:ir.psi2ir"))
|
|
||||||
interpreterApi(project(":compiler:ir.serialization.jvm"))
|
|
||||||
protobufApi(kotlinStdlib())
|
protobufApi(kotlinStdlib())
|
||||||
protobufCompareApi(projectTests(":kotlin-build-common"))
|
protobufCompareApi(projectTests(":kotlin-build-common"))
|
||||||
nativeInteropRuntimeApi(kotlinStdlib())
|
nativeInteropRuntimeApi(kotlinStdlib())
|
||||||
|
|||||||
@@ -5,29 +5,25 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.generators.interpreter
|
package org.jetbrains.kotlin.generators.interpreter
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.serialization.DisabledIdSignatureDescriptor
|
|
||||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.PrimitiveType
|
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil
|
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil
|
||||||
import org.jetbrains.kotlin.ir.BuiltInOperatorNames
|
import org.jetbrains.kotlin.ir.BuiltInOperatorNames
|
||||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
|
||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
|
||||||
import org.jetbrains.kotlin.ir.types.impl.originalKotlinType
|
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi2ir.descriptors.IrBuiltInsOverDescriptors
|
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.TypeTranslatorImpl
|
|
||||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
|
||||||
import org.jetbrains.kotlin.utils.Printer
|
import org.jetbrains.kotlin.utils.Printer
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
val DESTINATION = File("compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/IrBuiltInsMapGenerated.kt")
|
val DESTINATION = File("compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/IrBuiltInsMapGenerated.kt")
|
||||||
|
|
||||||
|
private val integerTypes = listOf(PrimitiveType.BYTE, PrimitiveType.SHORT, PrimitiveType.INT, PrimitiveType.LONG).map { it.typeName.asString() }
|
||||||
|
private val fpTypes = listOf(PrimitiveType.FLOAT, PrimitiveType.DOUBLE).map { it.typeName.asString() }
|
||||||
|
private val numericTypes = PrimitiveType.NUMBER_TYPES.map { it.typeName.asString() }
|
||||||
|
|
||||||
fun main() {
|
fun main() {
|
||||||
GeneratorsFileUtil.writeFileIfContentChanged(DESTINATION, generateMap())
|
GeneratorsFileUtil.writeFileIfContentChanged(DESTINATION, generateMap())
|
||||||
}
|
}
|
||||||
@@ -37,8 +33,6 @@ fun generateMap(): String {
|
|||||||
val p = Printer(sb)
|
val p = Printer(sb)
|
||||||
printPreamble(p)
|
printPreamble(p)
|
||||||
|
|
||||||
val irBuiltIns = getIrBuiltIns()
|
|
||||||
|
|
||||||
val unaryOperations = getOperationMap(1).apply {
|
val unaryOperations = getOperationMap(1).apply {
|
||||||
this += Operation(BuiltInOperatorNames.CHECK_NOT_NULL, listOf("T0?"), customExpression = "a!!")
|
this += Operation(BuiltInOperatorNames.CHECK_NOT_NULL, listOf("T0?"), customExpression = "a!!")
|
||||||
this += Operation("toString", listOf("Any?"), customExpression = "a?.toString() ?: \"null\"")
|
this += Operation("toString", listOf("Any?"), customExpression = "a?.toString() ?: \"null\"")
|
||||||
@@ -47,7 +41,7 @@ fun generateMap(): String {
|
|||||||
this += Operation("toString", listOf("Unit"), customExpression = "Unit.toString()")
|
this += Operation("toString", listOf("Unit"), customExpression = "Unit.toString()")
|
||||||
}
|
}
|
||||||
|
|
||||||
val binaryOperations = getOperationMap(2) + getBinaryIrOperationMap(irBuiltIns) + getExtensionOperationMap()
|
val binaryOperations = getOperationMap(2) + getBinaryIrOperationMap() + getExtensionOperationMap()
|
||||||
|
|
||||||
val ternaryOperations = getOperationMap(3)
|
val ternaryOperations = getOperationMap(3)
|
||||||
|
|
||||||
@@ -152,19 +146,6 @@ private fun generateInterpretTernaryFunction(p: Printer, ternaryOperations: List
|
|||||||
p.println()
|
p.println()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun castValue(name: String, type: String): String = when (type) {
|
|
||||||
"Any?", "T" -> name
|
|
||||||
"Array" -> "$name as Array<Any?>"
|
|
||||||
"Comparable" -> "$name as Comparable<Any?>"
|
|
||||||
else -> "$name as $type"
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun castValueParenthesized(name: String, type: String): String =
|
|
||||||
if (type == "Any?") name else "(${castValue(name, type)})"
|
|
||||||
|
|
||||||
private fun String.addKotlinPackage(): String =
|
|
||||||
if (this == "T" || this == "T0?") this else "kotlin.$this"
|
|
||||||
|
|
||||||
private data class Operation(
|
private data class Operation(
|
||||||
val name: String,
|
val name: String,
|
||||||
private val parameterTypes: List<String>,
|
private val parameterTypes: List<String>,
|
||||||
@@ -179,9 +160,17 @@ private data class Operation(
|
|||||||
get() {
|
get() {
|
||||||
val receiver = castValueParenthesized("a", parameterTypes[0])
|
val receiver = castValueParenthesized("a", parameterTypes[0])
|
||||||
return when {
|
return when {
|
||||||
name == BuiltInOperatorNames.EQEQEQ && parameterTypes.all { it == "Any?" } ->
|
name == BuiltInOperatorNames.EQEQEQ -> "if (a is Proxy && b is Proxy) a.state === b.state else a === b"
|
||||||
"if (a is Proxy && b is Proxy) a.state === b.state else a === b"
|
|
||||||
customExpression != null -> customExpression
|
customExpression != null -> customExpression
|
||||||
|
getIrMethodSymbolByName(name) != null -> {
|
||||||
|
buildString {
|
||||||
|
append(castValueParenthesized("a", parameterTypes[0]))
|
||||||
|
append(" ")
|
||||||
|
append(getIrMethodSymbolByName(name))
|
||||||
|
append(" ")
|
||||||
|
append(castValueParenthesized("b", parameterTypes[0]))
|
||||||
|
}
|
||||||
|
}
|
||||||
else -> buildString {
|
else -> buildString {
|
||||||
append(receiver)
|
append(receiver)
|
||||||
append(".")
|
append(".")
|
||||||
@@ -194,6 +183,34 @@ private data class Operation(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getIrMethodSymbolByName(methodName: String): String? {
|
||||||
|
return when (methodName) {
|
||||||
|
BuiltInOperatorNames.LESS -> "<"
|
||||||
|
BuiltInOperatorNames.LESS_OR_EQUAL -> "<="
|
||||||
|
BuiltInOperatorNames.GREATER -> ">"
|
||||||
|
BuiltInOperatorNames.GREATER_OR_EQUAL -> ">="
|
||||||
|
BuiltInOperatorNames.EQEQ -> "=="
|
||||||
|
BuiltInOperatorNames.EQEQEQ -> "==="
|
||||||
|
BuiltInOperatorNames.IEEE754_EQUALS -> "=="
|
||||||
|
BuiltInOperatorNames.ANDAND -> "&&"
|
||||||
|
BuiltInOperatorNames.OROR -> "||"
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun String.addKotlinPackage(): String =
|
||||||
|
if (this == "T" || this == "T0?") this else "kotlin.$this"
|
||||||
|
|
||||||
|
private fun castValue(name: String, type: String): String = when (type) {
|
||||||
|
"Any?", "T" -> name
|
||||||
|
"Array" -> "$name as Array<Any?>"
|
||||||
|
"Comparable" -> "$name as Comparable<Any?>"
|
||||||
|
else -> "$name as $type"
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun castValueParenthesized(name: String, type: String): String =
|
||||||
|
if (type == "Any?") name else "(${castValue(name, type)})"
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getOperationMap(argumentsCount: Int): MutableList<Operation> {
|
private fun getOperationMap(argumentsCount: Int): MutableList<Operation> {
|
||||||
@@ -229,27 +246,32 @@ private fun getOperationMap(argumentsCount: Int): MutableList<Operation> {
|
|||||||
return operationMap
|
return operationMap
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getBinaryIrOperationMap(irBuiltIns: IrBuiltIns): List<Operation> {
|
private fun getBinaryIrOperationMap(): List<Operation> {
|
||||||
val operationMap = mutableListOf<Operation>()
|
val operationMap = mutableListOf<Operation>()
|
||||||
val irFunSymbols =
|
|
||||||
(irBuiltIns.lessFunByOperandType.values + irBuiltIns.lessOrEqualFunByOperandType.values +
|
|
||||||
irBuiltIns.greaterFunByOperandType.values + irBuiltIns.greaterOrEqualFunByOperandType.values +
|
|
||||||
irBuiltIns.eqeqSymbol + irBuiltIns.eqeqeqSymbol + irBuiltIns.ieee754equalsFunByOperandType.values +
|
|
||||||
irBuiltIns.andandSymbol + irBuiltIns.ororSymbol)
|
|
||||||
.map { it.owner }
|
|
||||||
|
|
||||||
for (function in irFunSymbols) {
|
fun addOperation(function: String, type: String) {
|
||||||
val parametersTypes = function.valueParameters.map { it.type.originalKotlinType!!.toString() }
|
operationMap.add(Operation(function, listOf(type, type)))
|
||||||
|
}
|
||||||
|
|
||||||
check(parametersTypes.size == 2) { "Couldn't add following method from ir builtins to operations map: ${function.name}" }
|
val compareFunction = setOf(
|
||||||
operationMap.add(
|
BuiltInOperatorNames.LESS, BuiltInOperatorNames.LESS_OR_EQUAL, BuiltInOperatorNames.GREATER, BuiltInOperatorNames.GREATER_OR_EQUAL
|
||||||
Operation(
|
|
||||||
function.name.asString(), parametersTypes,
|
|
||||||
customExpression = castValueParenthesized("a", parametersTypes[0]) + " " +
|
|
||||||
getIrMethodSymbolByName(function.name.asString()) + " " +
|
|
||||||
castValueParenthesized("b", parametersTypes[1])
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for (function in compareFunction) {
|
||||||
|
for (type in numericTypes) {
|
||||||
|
addOperation(function, type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addOperation(BuiltInOperatorNames.EQEQ, "Any?")
|
||||||
|
addOperation(BuiltInOperatorNames.EQEQEQ, "Any?")
|
||||||
|
|
||||||
|
for (type in fpTypes) {
|
||||||
|
addOperation(BuiltInOperatorNames.IEEE754_EQUALS, "$type?")
|
||||||
|
}
|
||||||
|
|
||||||
|
for (function in setOf(BuiltInOperatorNames.ANDAND, BuiltInOperatorNames.OROR)) {
|
||||||
|
addOperation(function, PrimitiveType.BOOLEAN.typeName.asString())
|
||||||
}
|
}
|
||||||
|
|
||||||
return operationMap
|
return operationMap
|
||||||
@@ -258,44 +280,19 @@ private fun getBinaryIrOperationMap(irBuiltIns: IrBuiltIns): List<Operation> {
|
|||||||
// TODO can be drop after serialization introduction
|
// TODO can be drop after serialization introduction
|
||||||
private fun getExtensionOperationMap(): List<Operation> {
|
private fun getExtensionOperationMap(): List<Operation> {
|
||||||
val operationMap = mutableListOf<Operation>()
|
val operationMap = mutableListOf<Operation>()
|
||||||
val integerTypes = listOf(PrimitiveType.BYTE, PrimitiveType.SHORT, PrimitiveType.INT, PrimitiveType.LONG).map { it.typeName.asString() }
|
|
||||||
val fpTypes = listOf(PrimitiveType.FLOAT, PrimitiveType.DOUBLE).map { it.typeName.asString() }
|
|
||||||
|
|
||||||
for (type in integerTypes) {
|
for (type in integerTypes) {
|
||||||
for (otherType in integerTypes) {
|
for (otherType in integerTypes) {
|
||||||
operationMap.add(Operation("mod", listOf(type, otherType), isFunction = true))
|
operationMap.add(Operation("mod", listOf(type, otherType)))
|
||||||
operationMap.add(Operation("floorDiv", listOf(type, otherType), isFunction = true))
|
operationMap.add(Operation("floorDiv", listOf(type, otherType)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (type in fpTypes) {
|
for (type in fpTypes) {
|
||||||
for (otherType in fpTypes) {
|
for (otherType in fpTypes) {
|
||||||
operationMap.add(Operation("mod", listOf(type, otherType), isFunction = true))
|
operationMap.add(Operation("mod", listOf(type, otherType)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return operationMap
|
return operationMap
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getIrMethodSymbolByName(methodName: String): String {
|
|
||||||
return when (methodName) {
|
|
||||||
BuiltInOperatorNames.LESS -> "<"
|
|
||||||
BuiltInOperatorNames.LESS_OR_EQUAL -> "<="
|
|
||||||
BuiltInOperatorNames.GREATER -> ">"
|
|
||||||
BuiltInOperatorNames.GREATER_OR_EQUAL -> ">="
|
|
||||||
BuiltInOperatorNames.EQEQ -> "=="
|
|
||||||
BuiltInOperatorNames.EQEQEQ -> "==="
|
|
||||||
BuiltInOperatorNames.IEEE754_EQUALS -> "=="
|
|
||||||
BuiltInOperatorNames.ANDAND -> "&&"
|
|
||||||
BuiltInOperatorNames.OROR -> "||"
|
|
||||||
else -> throw UnsupportedOperationException("Unknown ir operation \"$methodName\"")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
|
||||||
private fun getIrBuiltIns(): IrBuiltIns {
|
|
||||||
val moduleDescriptor = ModuleDescriptorImpl(Name.special("<test-module>"), LockBasedStorageManager(""), DefaultBuiltIns.Instance)
|
|
||||||
val symbolTable = SymbolTable(DisabledIdSignatureDescriptor, IrFactoryImpl)
|
|
||||||
val typeTranslator = TypeTranslatorImpl(symbolTable, LanguageVersionSettingsImpl.DEFAULT, moduleDescriptor)
|
|
||||||
return IrBuiltInsOverDescriptors(moduleDescriptor.builtIns, typeTranslator, symbolTable)
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user