Native: port native to the new IrBuiltIns

This commit is contained in:
Ilya Chernikov
2021-06-16 18:33:09 +02:00
committed by TeamCityServer
parent 48a3c64901
commit cb4999f23c
12 changed files with 119 additions and 159 deletions
@@ -16,8 +16,8 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.*
import org.jetbrains.kotlin.ir.descriptors.IrAbstractFunctionFactory
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.descriptors.IrAbstractDescriptorBasedFunctionFactory
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
import org.jetbrains.kotlin.ir.linkage.IrProvider
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
@@ -38,9 +38,9 @@ internal object DECLARATION_ORIGIN_FUNCTION_CLASS : IrDeclarationOriginImpl("DEC
internal class BuiltInFictitiousFunctionIrClassFactory(
var symbolTable: SymbolTable?,
private val irBuiltIns: IrBuiltIns,
private val irBuiltIns: IrBuiltInsOverDescriptors,
private val reflectionTypes: KonanReflectionTypes
) : IrAbstractFunctionFactory(), IrProvider {
) : IrProvider, IrAbstractDescriptorBasedFunctionFactory() {
override fun getDeclaration(symbol: IrSymbol) =
(symbol.descriptor as? FunctionClassDescriptor)?.let { descriptor ->
@@ -17,8 +17,9 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
import org.jetbrains.kotlin.descriptors.konan.KlibModuleOrigin
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.*
@@ -53,14 +54,15 @@ internal fun Context.psiToIr(
// Note: using [llvmModuleSpecification] since this phase produces IR for generating single LLVM module.
val exportedDependencies = (getExportedDependencies() + modulesWithoutDCE).distinct()
val irBuiltInsOverDescriptors = generatorContext.irBuiltIns as IrBuiltInsOverDescriptors
val functionIrClassFactory = BuiltInFictitiousFunctionIrClassFactory(
symbolTable, generatorContext.irBuiltIns, reflectionTypes)
generatorContext.irBuiltIns.functionFactory = functionIrClassFactory
symbolTable, irBuiltInsOverDescriptors, reflectionTypes)
irBuiltInsOverDescriptors.functionFactory = functionIrClassFactory
val stubGenerator = DeclarationStubGeneratorImpl(
moduleDescriptor, symbolTable,
generatorContext.irBuiltIns
)
val symbols = KonanSymbols(this, generatorContext.irBuiltIns, symbolTable, symbolTable.lazyWrapper, functionIrClassFactory)
val symbols by lazy { KonanSymbols(this, generatorContext.irBuiltIns, symbolTable, symbolTable.lazyWrapper) }
val irDeserializer = if (isProducingLibrary && !useLinkerWhenProducingLibrary) {
// Enable lazy IR generation for newly-created symbols inside BE
@@ -91,7 +93,6 @@ internal fun Context.psiToIr(
KonanIrLinker(
moduleDescriptor,
functionIrClassFactory,
translationContext,
messageLogger,
generatorContext.irBuiltIns,
@@ -198,6 +199,7 @@ internal fun Context.psiToIr(
ir.symbols = symbols
if (!isProducingLibrary) {
// TODO: find out what should be done in the new builtins/symbols about it
if (this.stdlibModule in modulesWithoutDCE)
functionIrClassFactory.buildAllClasses()
internalAbi.init(irModules.values + irModule!!)
@@ -10,12 +10,12 @@ import org.jetbrains.kotlin.backend.konan.PrimitiveBinaryType
import org.jetbrains.kotlin.backend.konan.RuntimeNames
import org.jetbrains.kotlin.backend.konan.getObjCMethodInfo
import org.jetbrains.kotlin.backend.konan.ir.*
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
import org.jetbrains.kotlin.backend.konan.isObjCMetaClass
import org.jetbrains.kotlin.backend.konan.lower.FunctionReferenceLowering
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
import org.jetbrains.kotlin.ir.descriptors.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
@@ -9,13 +9,15 @@ import org.jetbrains.kotlin.backend.jvm.ir.propertyIfAccessor
import org.jetbrains.kotlin.backend.konan.KonanFqNames
import org.jetbrains.kotlin.backend.konan.RuntimeNames
import org.jetbrains.kotlin.backend.konan.ir.*
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
import org.jetbrains.kotlin.backend.konan.ir.isObjCObjectType
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization
import org.jetbrains.kotlin.ir.util.hasAnnotation
import org.jetbrains.kotlin.ir.util.isEnumClass
import org.jetbrains.kotlin.ir.util.isUnsigned
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
@@ -69,7 +71,7 @@ internal fun IrType.isObjCReferenceType(target: KonanTarget, irBuiltIns: IrBuilt
if (isObjCObjectType()) return true
val descriptor = classifierOrNull?.descriptor ?: return false
val builtIns = irBuiltIns.builtIns
val builtIns = (irBuiltIns as IrBuiltInsOverDescriptors).builtIns
return when (descriptor) {
builtIns.any,
@@ -16,10 +16,8 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.addMember
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
import org.jetbrains.kotlin.ir.util.functions
import org.jetbrains.kotlin.ir.util.isAnnotationWithEqualFqName
@@ -14,15 +14,15 @@ import org.jetbrains.kotlin.backend.konan.descriptors.kotlinNativeInternal
import org.jetbrains.kotlin.backend.konan.llvm.findMainEntryPoint
import org.jetbrains.kotlin.backend.konan.lower.TestProcessor
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.builtins.UnsignedType
import org.jetbrains.kotlin.config.coroutinesIntrinsicsPackageFqName
import org.jetbrains.kotlin.config.coroutinesPackageFqName
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
@@ -37,7 +37,6 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.calls.components.isVararg
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.Variance
import kotlin.properties.Delegates
@@ -56,17 +55,16 @@ internal class KonanSymbols(
context: Context,
irBuiltIns: IrBuiltIns,
private val symbolTable: SymbolTable,
lazySymbolTable: ReferenceSymbolTable,
val functionIrClassFactory: BuiltInFictitiousFunctionIrClassFactory
lazySymbolTable: ReferenceSymbolTable
): Symbols<Context>(context, irBuiltIns, symbolTable) {
val entryPoint = findMainEntryPoint(context)?.let { symbolTable.referenceSimpleFunction(it) }
override val externalSymbolTable = lazySymbolTable
val nothing = symbolTable.referenceClass(builtIns.nothing)
val throwable = symbolTable.referenceClass(builtIns.throwable)
val enum = symbolTable.referenceClass(builtIns.enum)
val nothing get() = irBuiltIns.nothingClass
val throwable get() = irBuiltIns.throwableClass
val enum get() = irBuiltIns.enumClass
val nativePtr = symbolTable.referenceClass(context.nativePtr)
val nativePointed = symbolTable.referenceClass(context.interopBuiltIns.nativePointed)
val nativePtrType = nativePtr.typeWith(arguments = emptyList())
@@ -75,15 +73,8 @@ internal class KonanSymbols(
val immutableBlobOf = symbolTable.referenceSimpleFunction(context.immutableBlobOf)
private fun unsignedClass(unsignedType: UnsignedType): IrClassSymbol = classById(unsignedType.classId)
override val uByte = unsignedClass(UnsignedType.UBYTE)
override val uShort = unsignedClass(UnsignedType.USHORT)
override val uInt = unsignedClass(UnsignedType.UINT)
override val uLong = unsignedClass(UnsignedType.ULONG)
val signedIntegerClasses = setOf(byte, short, int, long)
val unsignedIntegerClasses = setOf(uByte, uShort, uInt, uLong)
val unsignedIntegerClasses = setOf(uByte!!, uShort!!, uInt!!, uLong!!)
val allIntegerClasses = signedIntegerClasses + unsignedIntegerClasses
@@ -93,29 +84,26 @@ internal class KonanSymbols(
uShort -> short
uInt -> int
uLong -> long
else -> error(it.descriptor)
else -> error(it.toString())
}
}
val integerConversions = allIntegerClasses.flatMap { fromClass ->
allIntegerClasses.map { toClass ->
val name = Name.identifier("to${toClass.descriptor.name.asString().replaceFirstChar(Char::uppercaseChar)}")
val descriptor = if (fromClass in signedIntegerClasses && toClass in unsignedIntegerClasses) {
builtInsPackage("kotlin")
.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND)
val symbol = if (fromClass in signedIntegerClasses && toClass in unsignedIntegerClasses) {
irBuiltIns.findFunctions(name, "kotlin")
.single {
it.dispatchReceiverParameter == null &&
it.extensionReceiverParameter?.type == fromClass.descriptor.defaultType &&
it.valueParameters.isEmpty()
it.descriptor.dispatchReceiverParameter == null &&
it.descriptor.extensionReceiverParameter?.type == fromClass.descriptor.defaultType &&
it.descriptor.valueParameters.isEmpty()
}
} else {
fromClass.descriptor.unsubstitutedMemberScope
.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND)
irBuiltIns.findBuiltInClassMemberFunctions(fromClass, name)
.single {
it.extensionReceiverParameter == null && it.valueParameters.isEmpty()
it.descriptor.extensionReceiverParameter == null && it.descriptor.valueParameters.isEmpty()
}
}
val symbol = symbolTable.referenceSimpleFunction(descriptor)
(fromClass to toClass) to symbol
}
@@ -242,23 +230,13 @@ internal class KonanSymbols(
it to internalFunction("getCached${it.name.lowercase().replaceFirstChar(Char::uppercaseChar)}Box")
}
val immutableBlob = symbolTable.referenceClass(
builtInsPackage("kotlin", "native").getContributedClassifier(
Name.identifier("ImmutableBlob"), NoLookupLocation.FROM_BACKEND
) as ClassDescriptor
)
val immutableBlob = irBuiltIns.findClass(Name.identifier("ImmutableBlob"), "kotlin", "native")!!
val executeImpl = symbolTable.referenceSimpleFunction(
builtIns.builtInsModule.getPackage(FqName("kotlin.native.concurrent")).memberScope
.getContributedFunctions(Name.identifier("executeImpl"), NoLookupLocation.FROM_BACKEND)
.single()
)
val executeImpl =
irBuiltIns.findFunctions(Name.identifier("executeImpl"),"kotlin", "native", "concurrent").single()
val createCleaner = symbolTable.referenceSimpleFunction(
builtIns.builtInsModule.getPackage(FqName("kotlin.native.internal")).memberScope
.getContributedFunctions(Name.identifier("createCleaner"), NoLookupLocation.FROM_BACKEND)
.single()
)
val createCleaner =
irBuiltIns.findFunctions(Name.identifier("createCleaner"),"kotlin", "native", "internal").single()
val areEqualByValue = context.getKonanInternalFunctions("areEqualByValue").map {
symbolTable.referenceSimpleFunction(it)
@@ -297,11 +275,7 @@ internal class KonanSymbols(
override val throwUninitializedPropertyAccessException = internalFunction("ThrowUninitializedPropertyAccessException")
override val stringBuilder = symbolTable.referenceClass(
builtInsPackage("kotlin", "text").getContributedClassifier(
Name.identifier("StringBuilder"), NoLookupLocation.FROM_BACKEND
) as ClassDescriptor
)
override val stringBuilder = irBuiltIns.findClass(Name.identifier("StringBuilder"),"kotlin", "text")!!
override val defaultConstructorMarker = symbolTable.referenceClass(
context.getKonanInternalClass("DefaultConstructorMarker")
@@ -312,29 +286,21 @@ internal class KonanSymbols(
val getProgressionLast = context.getKonanInternalFunctions("getProgressionLast")
.map { Pair(it.returnType, symbolTable.referenceSimpleFunction(it)) }.toMap()
val arrayContentToString = arrays.associateBy(
{ it },
{ findArrayExtension(it.descriptor, "contentToString") }
)
val arrayContentHashCode = arrays.associateBy(
{ it },
{ findArrayExtension(it.descriptor, "contentHashCode") }
)
val arrayContentToString = arrays.associateBy({ it }, { findArrayExtension(it, "contentToString") })
private val kotlinCollectionsPackageScope: MemberScope
get() = builtInsPackage("kotlin", "collections")
val arrayContentHashCode = arrays.associateBy({ it }, { findArrayExtension(it, "contentHashCode") })
private fun findArrayExtension(classSymbol: IrClassSymbol, name: String): IrSimpleFunctionSymbol =
irBuiltIns.findFunctions(Name.identifier(name), "kotlin", "collections")
.singleOrNull {
it.descriptor.let {
it.valueParameters.isEmpty()
&& it.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == classSymbol.descriptor
&& it.extensionReceiverParameter?.type?.isMarkedNullable == false
&& !it.isExpect
}
} ?: error(classSymbol.toString())
private fun findArrayExtension(descriptor: ClassDescriptor, name: String): IrSimpleFunctionSymbol {
val functionDescriptor = kotlinCollectionsPackageScope
.getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND)
.singleOrNull {
it.valueParameters.isEmpty()
&& it.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == descriptor
&& it.extensionReceiverParameter?.type?.isMarkedNullable == false
&& !it.isExpect
} ?: error(descriptor.toString())
return symbolTable.referenceSimpleFunction(functionDescriptor)
}
fun getNoParamFunction(name: Name, receiverType: KotlinType): IrFunctionSymbol {
val descriptor = receiverType.memberScope.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND)
@@ -343,14 +309,12 @@ internal class KonanSymbols(
}
val copyInto = arrays.map { symbol ->
val packageViewDescriptor = builtIns.builtInsModule.getPackage(StandardNames.COLLECTIONS_PACKAGE_FQ_NAME)
val functionDescriptor = packageViewDescriptor.memberScope
.getContributedFunctions(Name.identifier("copyInto"), NoLookupLocation.FROM_BACKEND)
val funSymbol = irBuiltIns.findFunctions(Name.identifier("copyInto"), StandardNames.COLLECTIONS_PACKAGE_FQ_NAME)
.single {
!it.isExpect &&
it.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == symbol.descriptor
!it.descriptor.isExpect &&
it.descriptor.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == symbol.descriptor
}
symbol.descriptor to symbolTable.referenceSimpleFunction(functionDescriptor)
symbol to funSymbol
}.toMap()
val arrayGet = arrays.associateWith { it.descriptor.unsubstitutedMemberScope
@@ -375,19 +339,13 @@ internal class KonanSymbols(
val initInstance = internalFunction("initInstance")
val freeze = symbolTable.referenceSimpleFunction(
builtInsPackage("kotlin", "native", "concurrent").getContributedFunctions(
Name.identifier("freeze"), NoLookupLocation.FROM_BACKEND).single())
val freeze = irBuiltIns.findFunctions(Name.identifier("freeze"), "kotlin", "native", "concurrent").single()
val println = symbolTable.referenceSimpleFunction(
builtInsPackage("kotlin", "io").getContributedFunctions(
Name.identifier("println"), NoLookupLocation.FROM_BACKEND)
.single { it.valueParameters.singleOrNull()?.type == builtIns.stringType })
val println = irBuiltIns.findFunctions(Name.identifier("println"), "kotlin", "io")
.single { it.descriptor.valueParameters.singleOrNull()?.type == (irBuiltIns as IrBuiltInsOverDescriptors).builtIns.stringType }
val anyNToString = symbolTable.referenceSimpleFunction(
builtInsPackage("kotlin").getContributedFunctions(
Name.identifier("toString"), NoLookupLocation.FROM_BACKEND)
.single { it.extensionReceiverParameter?.type == builtIns.nullableAnyType})
val anyNToString = irBuiltIns.findFunctions(Name.identifier("toString"))
.single { it.descriptor.extensionReceiverParameter?.type == (irBuiltIns as IrBuiltInsOverDescriptors).builtIns.nullableAnyType }
override val getContinuation = internalFunction("getContinuation")
@@ -413,11 +371,13 @@ internal class KonanSymbols(
override val coroutineImpl get() = TODO()
val baseContinuationImpl = topLevelClass("kotlin.coroutines.native.internal.BaseContinuationImpl")
val baseContinuationImpl =
irBuiltIns.findClass(Name.identifier("BaseContinuationImpl"), "kotlin", "coroutines", "native", "internal")!!
val restrictedContinuationImpl = topLevelClass("kotlin.coroutines.native.internal.RestrictedContinuationImpl")
val restrictedContinuationImpl =
irBuiltIns.findClass(Name.identifier("RestrictedContinuationImpl"), "kotlin", "coroutines", "native", "internal")!!
val continuationImpl = topLevelClass("kotlin.coroutines.native.internal.ContinuationImpl")
val continuationImpl = irBuiltIns.findClass(Name.identifier("ContinuationImpl"), "kotlin", "coroutines", "native", "internal")!!
val invokeSuspendFunction =
symbolTable.referenceSimpleFunction(
@@ -434,15 +394,12 @@ internal class KonanSymbols(
val cancellationException = topLevelClass(KonanFqNames.cancellationException)
val kotlinResult = topLevelClass("kotlin.Result")
val kotlinResult = irBuiltIns.findClass(Name.identifier("Result"))!!
val kotlinResultGetOrThrow = symbolTable.referenceSimpleFunction(
builtInsPackage("kotlin")
.getContributedFunctions(Name.identifier("getOrThrow"), NoLookupLocation.FROM_BACKEND)
.single {
it.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == kotlinResult.descriptor
}
)
val kotlinResultGetOrThrow = irBuiltIns.findFunctions(Name.identifier("getOrThrow"))
.single {
it.descriptor.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == kotlinResult.descriptor
}
override val functionAdapter = symbolTable.referenceClass(context.getKonanInternalClass("FunctionAdapter"))
@@ -512,17 +469,12 @@ internal class KonanSymbols(
)
}
val emptyList = symbolTable.referenceSimpleFunction(
kotlinCollectionsPackageScope
.getContributedFunctions(Name.identifier("emptyList"), NoLookupLocation.FROM_BACKEND)
.single { it.valueParameters.isEmpty() }
)
val emptyList = irBuiltIns.findFunctions(Name.identifier("emptyList"), "kotlin", "collections")
.single { it.descriptor.valueParameters.isEmpty() }
val listOf = irBuiltIns.findFunctions(Name.identifier("listOf"), "kotlin", "collections")
.single { it.descriptor.valueParameters.size == 1 && it.descriptor.valueParameters[0].isVararg }
val listOf = symbolTable.referenceSimpleFunction(
kotlinCollectionsPackageScope
.getContributedFunctions(Name.identifier("listOf"), NoLookupLocation.FROM_BACKEND)
.single { it.valueParameters.size == 1 && it.valueParameters[0].isVararg }
)
val listOfInternal = internalFunction("listOfInternal")
val threadLocal = symbolTable.referenceClass(
@@ -533,10 +485,7 @@ internal class KonanSymbols(
context.builtIns.builtInsModule.findClassAcrossModuleDependencies(
ClassId.topLevel(KonanFqNames.sharedImmutable))!!)
private fun topLevelClass(fqName: String): IrClassSymbol = topLevelClass(FqName(fqName))
private fun topLevelClass(fqName: FqName): IrClassSymbol = classById(ClassId.topLevel(fqName))
private fun classById(classId: ClassId): IrClassSymbol =
symbolTable.referenceClass(builtIns.builtInsModule.findClassAcrossModuleDependencies(classId)!!)
private fun topLevelClass(fqName: FqName): IrClassSymbol = irBuiltIns.findClass(fqName.shortName(), fqName.parent())!!
private fun internalFunction(name: String): IrSimpleFunctionSymbol =
symbolTable.referenceSimpleFunction(context.getKonanInternalFunctions(name).single())
@@ -544,10 +493,8 @@ internal class KonanSymbols(
private fun internalClass(name: String): IrClassSymbol =
symbolTable.referenceClass(context.getKonanInternalClass(name))
private fun getKonanTestClass(className: String) = symbolTable.referenceClass(
builtInsPackage("kotlin", "native", "internal", "test").getContributedClassifier(
Name.identifier(className), NoLookupLocation.FROM_BACKEND
) as ClassDescriptor)
private fun getKonanTestClass(className: String) =
irBuiltIns.findClass(Name.identifier(className), "kotlin", "native", "internal", "test")!!
private fun interopFunction(name: String) = symbolTable.referenceSimpleFunction(
context.interopBuiltIns.packageScope
@@ -560,13 +507,9 @@ internal class KonanSymbols(
.getContributedClassifier(Name.identifier(name), NoLookupLocation.FROM_BACKEND) as ClassDescriptor
)
override fun functionN(n: Int) = functionIrClassFactory.functionN(n).symbol
fun kFunctionN(n: Int) = irBuiltIns.kFunctionN(n).symbol
override fun suspendFunctionN(n: Int) = functionIrClassFactory.suspendFunctionN(n).symbol
fun kFunctionN(n: Int) = functionIrClassFactory.kFunctionN(n).symbol
fun kSuspendFunctionN(n: Int) = functionIrClassFactory.kSuspendFunctionN(n).symbol
fun kSuspendFunctionN(n: Int) = irBuiltIns.kSuspendFunctionN(n).symbol
fun getKFunctionType(returnType: IrType, parameterTypes: List<IrType>) =
kFunctionN(parameterTypes.size).typeWith(parameterTypes + returnType)
@@ -12,9 +12,9 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrEnumConstructorCallImpl
@@ -154,7 +154,8 @@ internal class CEnumClassGenerator(
private fun createEnumPrimaryConstructor(descriptor: ClassDescriptor): IrConstructor {
val irConstructor = createConstructor(descriptor.unsubstitutedPrimaryConstructor!!)
val enumConstructor = context.builtIns.enum.constructors.single()
val builtIns = (irBuiltIns as IrBuiltInsOverDescriptors).builtIns
val enumConstructor = builtIns.enum.constructors.single()
val constructorSymbol = symbolTable.referenceConstructor(enumConstructor)
val classSymbol = symbolTable.referenceClass(descriptor)
val type = descriptor.defaultType.toIrType()
@@ -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 +
context.ir.symbols.unsignedArrays
context.ir.symbols.primitiveArrays.values +
context.ir.symbols.unsignedArrays.values
// TODO: extend logic here by taking into account final acyclic classes.
private fun checkAcyclicFieldType(type: IrType): Boolean = acyclicCache.getOrPut(type) {
@@ -10,24 +10,31 @@ import org.jetbrains.kotlin.backend.common.ir.allParameters
import org.jetbrains.kotlin.backend.common.ir.allParametersCount
import org.jetbrains.kotlin.backend.common.ir.simpleFunctions
import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.backend.konan.descriptors.*
import org.jetbrains.kotlin.backend.konan.descriptors.ClassLayoutBuilder
import org.jetbrains.kotlin.backend.konan.descriptors.OverriddenFunctionInfo
import org.jetbrains.kotlin.backend.konan.descriptors.allOverriddenFunctions
import org.jetbrains.kotlin.backend.konan.descriptors.isAbstract
import org.jetbrains.kotlin.backend.konan.ir.*
import org.jetbrains.kotlin.backend.konan.llvm.*
import org.jetbrains.kotlin.backend.konan.llvm.objc.ObjCCodeGenerator
import org.jetbrains.kotlin.backend.konan.llvm.objc.ObjCDataGenerator
import org.jetbrains.kotlin.backend.konan.objcexport.*
import org.jetbrains.kotlin.backend.konan.serialization.resolveFakeOverrideMaybeAbstract
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.konan.CompiledKlibModuleOrigin
import org.jetbrains.kotlin.descriptors.konan.CurrentKlibModuleOrigin
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
import org.jetbrains.kotlin.ir.expressions.IrClassReference
import org.jetbrains.kotlin.ir.expressions.IrVararg
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.isNothing
import org.jetbrains.kotlin.ir.types.isUnit
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.konan.ForeignExceptionMode
import org.jetbrains.kotlin.konan.target.AppleConfigurables
@@ -614,10 +621,10 @@ private fun ObjCExportCodeGenerator.emitBoxConverters() {
emitBoxConverter(irBuiltIns.shortClass, ObjCValueType.SHORT, "numberWithShort:")
emitBoxConverter(irBuiltIns.intClass, ObjCValueType.INT, "numberWithInt:")
emitBoxConverter(irBuiltIns.longClass, ObjCValueType.LONG_LONG, "numberWithLongLong:")
emitBoxConverter(symbols.uByte, ObjCValueType.UNSIGNED_CHAR, "numberWithUnsignedChar:")
emitBoxConverter(symbols.uShort, ObjCValueType.UNSIGNED_SHORT, "numberWithUnsignedShort:")
emitBoxConverter(symbols.uInt, ObjCValueType.UNSIGNED_INT, "numberWithUnsignedInt:")
emitBoxConverter(symbols.uLong, ObjCValueType.UNSIGNED_LONG_LONG, "numberWithUnsignedLongLong:")
emitBoxConverter(symbols.uByte!!, ObjCValueType.UNSIGNED_CHAR, "numberWithUnsignedChar:")
emitBoxConverter(symbols.uShort!!, ObjCValueType.UNSIGNED_SHORT, "numberWithUnsignedShort:")
emitBoxConverter(symbols.uInt!!, ObjCValueType.UNSIGNED_INT, "numberWithUnsignedInt:")
emitBoxConverter(symbols.uLong!!, ObjCValueType.UNSIGNED_LONG_LONG, "numberWithUnsignedLongLong:")
emitBoxConverter(irBuiltIns.floatClass, ObjCValueType.FLOAT, "numberWithFloat:")
emitBoxConverter(irBuiltIns.doubleClass, ObjCValueType.DOUBLE, "numberWithDouble:")
}
@@ -663,8 +670,10 @@ private fun ObjCExportCodeGenerator.generateContinuationToCompletionConverter(
}
}
// TODO: find out what to use instead here and in the dependent code
private val ObjCExportBlockCodeGenerator.mappedFunctionNClasses get() =
context.ir.symbols.functionIrClassFactory.builtFunctionNClasses
// failed attempt to migrate to descriptor-less IrBuiltIns
((context.irBuiltIns as IrBuiltInsOverDescriptors).functionFactory as BuiltInFictitiousFunctionIrClassFactory).builtFunctionNClasses
.filter { it.descriptor.isMappedFunctionClass() }
private fun ObjCExportBlockCodeGenerator.emitFunctionConverters() {
@@ -6,7 +6,10 @@
package org.jetbrains.kotlin.backend.konan.lower
import org.jetbrains.kotlin.backend.common.lower.DefaultParameterInjector
import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.backend.konan.KonanBackendContext
import org.jetbrains.kotlin.backend.konan.PrimitiveBinaryType
import org.jetbrains.kotlin.backend.konan.computePrimitiveBinaryTypeOrNull
import org.jetbrains.kotlin.backend.konan.getInlinedClassNative
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.types.IrType
@@ -23,7 +26,7 @@ internal class KonanDefaultParameterInjector(private val konanContext: KonanBack
PrimitiveBinaryType.BOOLEAN -> IrConstImpl.boolean(startOffset, endOffset, type, false)
PrimitiveBinaryType.BYTE -> IrConstImpl.byte(startOffset, endOffset, type, 0)
PrimitiveBinaryType.SHORT -> when (type.getInlinedClassNative()) {
context.irBuiltIns.char -> IrConstImpl.char(startOffset, endOffset, type, 0.toChar())
context.irBuiltIns.charClass -> IrConstImpl.char(startOffset, endOffset, type, 0.toChar())
else -> IrConstImpl.short(startOffset, endOffset, type, 0)
}
PrimitiveBinaryType.INT -> IrConstImpl.int(startOffset, endOffset, type, 0)
@@ -34,8 +34,13 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classifierOrFail
import org.jetbrains.kotlin.ir.types.isArray
import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization
import org.jetbrains.kotlin.ir.util.functions
import org.jetbrains.kotlin.ir.util.getPropertyGetter
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -211,7 +216,7 @@ internal class VarargInjectionLowering constructor(val context: KonanBackendCont
singleOrNull { it.name == KonanNameConventions.setWithoutBoundCheck } ?: single { it.name == OperatorNameConventions.SET }
}
val sizeGetterSymbol = arraySymbol.getPropertyGetter("size")!!
val copyIntoSymbol = symbols.copyInto[arraySymbol.descriptor]!!
val copyIntoSymbol = symbols.copyInto[arraySymbol]!!
protected val singleParameterConstructor =
arraySymbol.owner.constructors.find { it.valueParameters.size == 1 }!!
@@ -228,7 +233,7 @@ internal class VarargInjectionLowering constructor(val context: KonanBackendCont
}
inner class PrimitiveArrayHandle(primitiveType: PrimitiveType)
: ArrayHandle(symbols.primitiveArrays[primitiveType]!!) {
: ArrayHandle(symbols.irBuiltIns.primitiveTypesToPrimitiveArrays[primitiveType]!!) {
override fun createArray(builder: IrBuilderWithScope, elementType: IrType, size: IrExpression): IrExpression {
return builder.irCall(singleParameterConstructor).apply {
@@ -27,11 +27,10 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
import org.jetbrains.kotlin.descriptors.konan.klibModuleOrigin
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
import org.jetbrains.kotlin.ir.descriptors.IrAbstractFunctionFactory
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrPublicSymbolBase
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
@@ -65,7 +64,6 @@ object KonanFakeOverrideClassFilter : FakeOverrideClassFilter {
internal class KonanIrLinker(
private val currentModule: ModuleDescriptor,
override val functionalInterfaceFactory: IrAbstractFunctionFactory,
override val translationPluginContext: TranslationPluginContext?,
messageLogger: IrMessageLogger,
builtIns: IrBuiltIns,