[minor] IR: minor builtins infrastructure fixes
This commit is contained in:
committed by
TeamCityServer
parent
19f52d9aae
commit
56805dded8
+3
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.backend.common.extensions
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.ir.BuiltinSymbolsBase
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
@@ -34,6 +35,8 @@ interface IrPluginContext : IrGeneratorContext {
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
val typeTranslator: TypeTranslator
|
||||
|
||||
val symbols: BuiltinSymbolsBase
|
||||
|
||||
val platform: TargetPlatform?
|
||||
|
||||
/**
|
||||
|
||||
+3
-1
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.backend.common.extensions
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.ir.BuiltinSymbolsBase
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
@@ -34,7 +35,8 @@ open class IrPluginContextImpl constructor(
|
||||
override val typeTranslator: TypeTranslator,
|
||||
override val irBuiltIns: IrBuiltIns,
|
||||
val linker: IrDeserializer,
|
||||
private val diagnosticReporter: IrMessageLogger
|
||||
private val diagnosticReporter: IrMessageLogger,
|
||||
override val symbols: BuiltinSymbolsBase = BuiltinSymbolsBase(irBuiltIns, st)
|
||||
) : IrPluginContext {
|
||||
|
||||
override val platform: TargetPlatform? = module.platform
|
||||
|
||||
@@ -44,11 +44,7 @@ abstract class Ir<out T : CommonBackendContext>(val context: T, val irModule: Ir
|
||||
open fun shouldGenerateHandlerParameterForDefaultBodyFun() = false
|
||||
}
|
||||
|
||||
// Some symbols below are used in kotlin-native, so they can't be private
|
||||
@Suppress("MemberVisibilityCanBePrivate", "PropertyName")
|
||||
abstract class Symbols<out T : CommonBackendContext>(
|
||||
val context: T, val irBuiltIns: IrBuiltIns, private val symbolTable: ReferenceSymbolTable
|
||||
) {
|
||||
open class BuiltinSymbolsBase(val irBuiltIns: IrBuiltIns, private val symbolTable: ReferenceSymbolTable) {
|
||||
|
||||
private fun getClass(name: Name, vararg packageNameSegments: String = arrayOf("kotlin")): IrClassSymbol =
|
||||
irBuiltIns.findClass(name, *packageNameSegments)
|
||||
@@ -150,11 +146,11 @@ abstract class Symbols<out T : CommonBackendContext>(
|
||||
val doubleArrayType get() = doubleArray.owner.defaultType
|
||||
val booleanArrayType get() = booleanArray.owner.defaultType
|
||||
|
||||
val primitiveArrays get() = irBuiltIns.primitiveTypesToPrimitiveArrays
|
||||
val primitiveTypesToPrimitiveArrays get() = irBuiltIns.primitiveTypesToPrimitiveArrays
|
||||
val primitiveArraysToPrimitiveTypes get() = irBuiltIns.primitiveArraysToPrimitiveTypes
|
||||
val unsignedArrays get() = irBuiltIns.unsignedTypesToUnsignedArrays
|
||||
val unsignedTypesToUnsignedArrays get() = irBuiltIns.unsignedTypesToUnsignedArrays
|
||||
|
||||
val arrays = primitiveArrays.values + unsignedArrays.values + array
|
||||
val arrays get() = primitiveTypesToPrimitiveArrays.values + unsignedTypesToUnsignedArrays.values + array
|
||||
|
||||
val collection get() = irBuiltIns.collectionClass
|
||||
val set get() = irBuiltIns.setClass
|
||||
@@ -193,7 +189,14 @@ abstract class Symbols<out T : CommonBackendContext>(
|
||||
|
||||
val extensionToString: IrSimpleFunctionSymbol get() = irBuiltIns.extensionToString
|
||||
val stringPlus: IrSimpleFunctionSymbol get() = irBuiltIns.stringPlus
|
||||
|
||||
}
|
||||
|
||||
// Some symbols below are used in kotlin-native, so they can't be private
|
||||
@Suppress("MemberVisibilityCanBePrivate", "PropertyName")
|
||||
abstract class Symbols<out T : CommonBackendContext>(
|
||||
val context: T, irBuiltIns: IrBuiltIns, symbolTable: ReferenceSymbolTable
|
||||
) : BuiltinSymbolsBase(irBuiltIns, symbolTable) {
|
||||
|
||||
abstract val throwNullPointerException: IrSimpleFunctionSymbol
|
||||
abstract val throwTypeCastException: IrSimpleFunctionSymbol
|
||||
|
||||
|
||||
+1
-1
@@ -128,7 +128,7 @@ class IrIntrinsicMethods(val irBuiltIns: IrBuiltIns, val symbols: JvmSymbols) {
|
||||
).toMap()
|
||||
|
||||
private fun intrinsicsThatShouldHaveBeenLowered() =
|
||||
(symbols.primitiveArrays.map { (_, primitiveClassSymbol) ->
|
||||
(symbols.primitiveTypesToPrimitiveArrays.map { (_, primitiveClassSymbol) ->
|
||||
val name = primitiveClassSymbol.owner.name.asString()
|
||||
// IntArray -> intArrayOf
|
||||
val arrayOfFunName = name.decapitalizeAsciiOnly() + "Of"
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.psi2ir.generators
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.ir.builders.IrGenerator
|
||||
import org.jetbrains.kotlin.ir.builders.IrGeneratorWithScope
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression
|
||||
@@ -54,7 +55,7 @@ fun Generator.getExpressionTypeWithCoercionToUnit(key: KtExpression): KotlinType
|
||||
if (key.isUsedAsExpression(context.bindingContext))
|
||||
getTypeInferredByFrontend(key)
|
||||
else
|
||||
context.irBuiltInsOverDescriptors.unit
|
||||
(context.irBuiltIns as IrBuiltInsOverDescriptors).unit
|
||||
|
||||
fun Generator.getExpressionTypeWithCoercionToUnitOrFail(key: KtExpression): KotlinType =
|
||||
getExpressionTypeWithCoercionToUnit(key) ?: throw RuntimeException("No type for expression: ${key.text}")
|
||||
|
||||
@@ -66,8 +66,6 @@ class GeneratorContext private constructor(
|
||||
|
||||
val samTypeApproximator = SamTypeApproximator(moduleDescriptor.builtIns, languageVersionSettings)
|
||||
|
||||
val irBuiltInsOverDescriptors: IrBuiltInsOverDescriptors get() = irBuiltIns as IrBuiltInsOverDescriptors
|
||||
|
||||
fun createFileScopeContext(ktFile: KtFile): GeneratorContext {
|
||||
return GeneratorContext(
|
||||
configuration,
|
||||
|
||||
+5
-2
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||
@@ -209,7 +210,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
|
||||
// Infer type for elvis manually. Take into account possibly nested elvises.
|
||||
val rightType = getResultTypeForElvis(binaryExpression.right!!).unwrap()
|
||||
val leftType = getResultTypeForElvis(binaryExpression.left!!).unwrap()
|
||||
val leftNNType = intersectTypes(listOf(leftType, context.irBuiltInsOverDescriptors.any))
|
||||
val leftNNType = intersectTypes(listOf(leftType, (context.irBuiltIns as IrBuiltInsOverDescriptors).any))
|
||||
return NewCommonSuperTypeCalculator.commonSuperType(listOf(rightType, leftNNType))
|
||||
}
|
||||
|
||||
@@ -436,7 +437,9 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
|
||||
return memberScope.findSingleFunction(Name.identifier("to$targetTypeName"))
|
||||
}
|
||||
|
||||
private val primitiveTypeMapping: Map<SimpleType, IrType> = context.irBuiltInsOverDescriptors.run { primitiveTypes.zip(primitiveIrTypes).toMap() }
|
||||
private val primitiveTypeMapping: Map<SimpleType, IrType> =
|
||||
(context.irBuiltIns as IrBuiltInsOverDescriptors).run { primitiveTypes.zip(primitiveIrTypes).toMap() }
|
||||
|
||||
private fun kotlinTypeToIrType(kotlinType: KotlinType?) = kotlinType?.let { primitiveTypeMapping[it] }
|
||||
|
||||
private fun generateComparisonOperator(ktExpression: KtBinaryExpression, origin: IrStatementOrigin): IrExpression {
|
||||
|
||||
+2
-1
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.psi2ir.intermediate
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
||||
@@ -71,7 +72,7 @@ class ArrayAccessAssignmentReceiver(
|
||||
?: throw AssertionError("Array access should have either indexed-get call or indexed-set call")
|
||||
|
||||
val hasResult = origin.isAssignmentOperatorWithResult()
|
||||
val resultType = if (hasResult) kotlinType else callGenerator.context.irBuiltInsOverDescriptors.unit
|
||||
val resultType = if (hasResult) kotlinType else (callGenerator.context.irBuiltIns as IrBuiltInsOverDescriptors).unit
|
||||
val irResultType = callGenerator.translateType(resultType)
|
||||
|
||||
if (indexedGetDescriptor?.isDynamic() != false && indexedSetDescriptor?.isDynamic() != false) {
|
||||
|
||||
+1
-1
@@ -325,7 +325,7 @@ class IrBuiltInsOverDescriptors(
|
||||
)
|
||||
|
||||
// TODO switch to IrType
|
||||
val primitiveTypes = listOf(bool, builtIns.charType, builtIns.byteType, short, int, float, long, double)
|
||||
val primitiveTypes = listOf(bool, char, byte, short, int, float, long, double)
|
||||
override val primitiveIrTypes = listOf(booleanType, charType, byteType, shortType, intType, floatType, longType, doubleType)
|
||||
override val primitiveIrTypesWithComparisons = listOf(charType, byteType, shortType, intType, floatType, longType, doubleType)
|
||||
override val primitiveFloatingPointIrTypes = listOf(floatType, doubleType)
|
||||
|
||||
+1
-1
@@ -62,7 +62,7 @@ internal fun Context.psiToIr(
|
||||
moduleDescriptor, symbolTable,
|
||||
generatorContext.irBuiltIns
|
||||
)
|
||||
val symbols by lazy { KonanSymbols(this, generatorContext.irBuiltIns, symbolTable, symbolTable.lazyWrapper) }
|
||||
val symbols = KonanSymbols(this, generatorContext.irBuiltIns, symbolTable, symbolTable.lazyWrapper)
|
||||
|
||||
val irDeserializer = if (isProducingLibrary && !useLinkerWhenProducingLibrary) {
|
||||
// Enable lazy IR generation for newly-created symbols inside BE
|
||||
|
||||
+1
-1
@@ -64,7 +64,7 @@ internal class FunctionsWithoutBoundCheckGenerator(val context: KonanBackendCont
|
||||
|
||||
|
||||
fun generate() {
|
||||
val arraysClasses = symbols.primitiveArrays.values + symbols.array
|
||||
val arraysClasses = symbols.primitiveTypesToPrimitiveArrays.values + symbols.array
|
||||
arraysClasses.forEach { classSymbol ->
|
||||
val setFunction = classSymbol.owner.functions.single { it.name == OperatorNameConventions.SET }
|
||||
classSymbol.owner.addMember(generateFunction(setFunction, KonanNameConventions.setWithoutBoundCheck))
|
||||
|
||||
-3
@@ -344,9 +344,6 @@ internal class KonanSymbols(
|
||||
val println = irBuiltIns.findFunctions(Name.identifier("println"), "kotlin", "io")
|
||||
.single { it.descriptor.valueParameters.singleOrNull()?.type == (irBuiltIns as IrBuiltInsOverDescriptors).builtIns.stringType }
|
||||
|
||||
val anyNToString = irBuiltIns.findFunctions(Name.identifier("toString"))
|
||||
.single { it.descriptor.extensionReceiverParameter?.type == (irBuiltIns as IrBuiltInsOverDescriptors).builtIns.nullableAnyType }
|
||||
|
||||
override val getContinuation = internalFunction("getContinuation")
|
||||
|
||||
override val returnIfSuspended = internalFunction("returnIfSuspended")
|
||||
|
||||
+2
-2
@@ -30,8 +30,8 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
context.irBuiltIns.byteClass, context.irBuiltIns.shortClass, context.irBuiltIns.intClass,
|
||||
context.irBuiltIns.longClass,
|
||||
context.irBuiltIns.floatClass,context.irBuiltIns.doubleClass) +
|
||||
context.ir.symbols.primitiveArrays.values +
|
||||
context.ir.symbols.unsignedArrays.values
|
||||
context.ir.symbols.primitiveTypesToPrimitiveArrays.values +
|
||||
context.ir.symbols.unsignedTypesToUnsignedArrays.values
|
||||
|
||||
// TODO: extend logic here by taking into account final acyclic classes.
|
||||
private fun checkAcyclicFieldType(type: IrType): Boolean = acyclicCache.getOrPut(type) {
|
||||
|
||||
+1
-1
@@ -258,7 +258,7 @@ internal class VarargInjectionLowering constructor(val context: KonanBackendCont
|
||||
private val primitiveArrayHandles = PrimitiveType.values().associate { it to PrimitiveArrayHandle(it) }
|
||||
|
||||
private val unsignedArrayHandles = UnsignedType.values().mapNotNull { unsignedType ->
|
||||
symbols.unsignedArrays[unsignedType]?.let {
|
||||
symbols.unsignedTypesToUnsignedArrays[unsignedType]?.let {
|
||||
val primitiveType = when (unsignedType) {
|
||||
UnsignedType.UBYTE -> PrimitiveType.BYTE
|
||||
UnsignedType.USHORT -> PrimitiveType.SHORT
|
||||
|
||||
+5
-7
@@ -701,11 +701,6 @@ interface IrBuilderExtension {
|
||||
typeParameters = newTypeParameters
|
||||
}
|
||||
|
||||
fun kClassTypeFor(projection: TypeProjection): SimpleType {
|
||||
val kClass = (compilerContext.irBuiltIns as IrBuiltInsOverDescriptors).builtIns.kClass
|
||||
return KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, kClass, listOf(projection))
|
||||
}
|
||||
|
||||
fun createClassReference(classType: KotlinType, startOffset: Int, endOffset: Int): IrClassReference {
|
||||
val clazz = classType.toClassDescriptor!!
|
||||
val classSymbol = compilerContext.referenceClass(clazz.fqNameSafe) ?: error("Couldn't load class $clazz")
|
||||
@@ -1005,10 +1000,13 @@ interface IrBuilderExtension {
|
||||
kType.toClassDescriptor!!,
|
||||
module
|
||||
)
|
||||
val projectedOutCurrentKClass = kClassTypeFor(TypeProjectionImpl(Variance.OUT_VARIANCE, kType))
|
||||
val projectedOutCurrentKClass =
|
||||
compilerContext.irBuiltIns.kClassClass.typeWithArguments(
|
||||
listOf(makeTypeProjection(thisIrType, Variance.OUT_VARIANCE))
|
||||
)
|
||||
add(
|
||||
createArrayOfExpression(
|
||||
projectedOutCurrentKClass.toIrType(),
|
||||
projectedOutCurrentKClass,
|
||||
subclasses.map { classReference(it) }
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user