From cb4999f23ca97f4878abf0079eb902865b295ee9 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 16 Jun 2021 18:33:09 +0200 Subject: [PATCH] Native: port native to the new IrBuiltIns --- ...BuiltInFictitiousFunctionIrClassFactory.kt | 8 +- .../jetbrains/kotlin/backend/konan/PsiToIr.kt | 12 +- .../kotlin/backend/konan/cgen/CBridgeGen.kt | 3 +- .../backend/konan/cgen/InteropIrUtils.kt | 12 +- .../ir/FunctionsWithoutBoundCheckGenerator.kt | 2 - .../jetbrains/kotlin/backend/konan/ir/Ir.kt | 183 ++++++------------ .../ir/interop/cenum/CEnumClassGenerator.kt | 5 +- .../backend/konan/llvm/RTTIGenerator.kt | 4 +- .../objcexport/ObjCExportCodeGenerator.kt | 25 ++- .../lower/KonanDefaultParameterInjector.kt | 7 +- .../backend/konan/lower/VarargLowering.kt | 13 +- .../konan/serialization/KonanIrlinker.kt | 4 +- 12 files changed, 119 insertions(+), 159 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BuiltInFictitiousFunctionIrClassFactory.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BuiltInFictitiousFunctionIrClassFactory.kt index 799a0faf803..22bfa76f4ce 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BuiltInFictitiousFunctionIrClassFactory.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BuiltInFictitiousFunctionIrClassFactory.kt @@ -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 -> diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt index df116c69855..40d207751ae 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt @@ -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!!) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt index 9d1d15d71eb..ca30c7ff676 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt @@ -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 diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/InteropIrUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/InteropIrUtils.kt index 43fbb3a341b..9bd24c8d679 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/InteropIrUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/InteropIrUtils.kt @@ -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, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FunctionsWithoutBoundCheckGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FunctionsWithoutBoundCheckGenerator.kt index af9cab7e52a..df7d3116aeb 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FunctionsWithoutBoundCheckGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FunctionsWithoutBoundCheckGenerator.kt @@ -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 diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt index 0da7ae4afd2..ee68ac6d6c3 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt @@ -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, 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) = kFunctionN(parameterTypes.size).typeWith(parameterTypes + returnType) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumClassGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumClassGenerator.kt index 3e0e9a5544b..43bdadac68a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumClassGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumClassGenerator.kt @@ -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() diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt index 1c17c0f3fbe..3e6d794a730 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt @@ -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) { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt index f16965b3c86..06cb042dd74 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt @@ -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() { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/KonanDefaultParameterInjector.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/KonanDefaultParameterInjector.kt index d6cb01af9a7..ca279a73e41 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/KonanDefaultParameterInjector.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/KonanDefaultParameterInjector.kt @@ -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) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt index ca00dcf4925..48d6b115db4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt @@ -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 { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt index 1b58e090861..2c494386551 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt @@ -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,