From 176325eaa7e95a7547f7102c291ee6b5327a7500 Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Mon, 3 Apr 2023 14:05:43 +0000 Subject: [PATCH] [K2/N] KT-55598: Use InteropBuiltIns only in KonanSymbols and DescriptorsLookup Merge-request: KT-MR-9431 Merged-by: Vladimir Sukharev --- .../jetbrains/kotlin/backend/konan/Context.kt | 4 - .../kotlin/backend/konan/InlineClasses.kt | 7 +- .../kotlin/backend/konan/InteropUtils.kt | 86 +++++++++++-------- .../jetbrains/kotlin/backend/konan/PsiToIr.kt | 2 +- .../kotlin/backend/konan/cgen/CBridgeGen.kt | 10 +-- .../backend/konan/cgen/InteropIrUtils.kt | 4 +- .../konan/driver/DynamicCompilerDriver.kt | 2 +- .../konan/driver/phases/BackendPhases.kt | 5 +- .../backend/konan/driver/phases/PsiToIr.kt | 7 -- .../jetbrains/kotlin/backend/konan/ir/Ir.kt | 30 +++---- .../interop/DescriptorToIrTranslationUtils.kt | 31 +++---- .../IrProviderForCEnumAndCStructStubs.kt | 16 ++-- .../interop/cenum/CEnumVarClassGenerator.kt | 12 +-- .../cstruct/CStructVarClassGenerator.kt | 12 +-- .../cstruct/CStructVarCompanionGenerator.kt | 7 +- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 5 +- .../llvm/KotlinObjCClassInfoGenerator.kt | 6 +- .../backend/konan/lower/InteropLowering.kt | 18 ++-- .../lower/SpecialBackendChecksTraversal.kt | 26 +++--- 19 files changed, 131 insertions(+), 159 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index cc66a688977..be1ad6f2606 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -93,10 +93,6 @@ internal class Context( override val typeSystem: IrTypeSystemContext get() = IrTypeSystemContextImpl(irBuiltIns) - val interopBuiltIns by lazy { - InteropBuiltIns(this.builtIns) - } - var cAdapterExportedElements: CAdapterExportedElements? = null var objCExportedInterface: ObjCExportedInterface? = null var objCExportCodeSpec: ObjCExportCodeSpec? = null diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt index 58575fc16a1..a4894b03a89 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt @@ -21,10 +21,7 @@ import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.isNullable import org.jetbrains.kotlin.ir.types.makeNullable -import org.jetbrains.kotlin.ir.util.constructors -import org.jetbrains.kotlin.ir.util.defaultType -import org.jetbrains.kotlin.ir.util.isTopLevel -import org.jetbrains.kotlin.ir.util.packageFqName +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqNameUnsafe @@ -300,7 +297,7 @@ internal object IrTypeInlineClassesSupport : InlineClassesSupport CValuesRefArgumentPassing + classifier?.isClassWithFqName(InteropFqNames.cValues.toUnsafe()) == true || // Note: this should not be accepted, but is required for compatibility + classifier?.isClassWithFqName(InteropFqNames.cValuesRef.toUnsafe()) == true -> CValuesRefArgumentPassing classifier == symbols.string && (variadic || parameter?.isCStringParameter() == true) -> { require(!variadic || !isObjCMethod) { stubs.renderCompilerError(argument) } 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 47c2a0d8eb8..6e35b210386 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 @@ -6,10 +6,10 @@ package org.jetbrains.kotlin.backend.konan.cgen import org.jetbrains.kotlin.backend.jvm.ir.propertyIfAccessor +import org.jetbrains.kotlin.backend.konan.InteropFqNames 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.builtins.StandardNames import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.types.* @@ -20,7 +20,7 @@ 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 -import org.jetbrains.kotlin.psi2ir.descriptors.IrBuiltInsOverDescriptors +import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext.getClassFqNameUnsafe internal fun IrType.isCEnumType(): Boolean { if (isNullable()) return false diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt index 22814571ea7..5a2c981750e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt @@ -104,7 +104,7 @@ internal class DynamicCompilerDriver : CompilerDriver() { require(frontendOutput is FirOutput.Full) val fir2IrOutput = engine.runFir2Ir(frontendOutput) -// engine.runK2SpecialBackendChecks(fir2IrOutput) // TODO After fix of KT-56018 try uncommenting this line + //engine.runK2SpecialBackendChecks(fir2IrOutput) // TODO KT-55598 try uncommenting this line after getting rid of InteropBuiltins excessive usage return engine.runFirSerializer(fir2IrOutput) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt index 27d6eec64e8..bba319ecc4f 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.backend.konan.driver.phases import org.jetbrains.kotlin.backend.common.lower -import org.jetbrains.kotlin.backend.konan.InteropBuiltIns import org.jetbrains.kotlin.backend.konan.NativeGenerationState import org.jetbrains.kotlin.backend.konan.driver.PhaseContext import org.jetbrains.kotlin.backend.konan.driver.PhaseEngine @@ -16,7 +15,6 @@ import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols import org.jetbrains.kotlin.backend.konan.lower.ExpectToActualDefaultValueCopier import org.jetbrains.kotlin.backend.konan.lower.SpecialBackendChecksTraversal import org.jetbrains.kotlin.backend.konan.makeEntryPoint -import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment @@ -40,7 +38,7 @@ internal val SpecialBackendChecksPhase = createSimpleNamedCompilerPhase - SpecialBackendChecksTraversal(context, context.interopBuiltIns, input.symbols, input.irModule.irBuiltins).lower(input.irModule) + SpecialBackendChecksTraversal(context, input.symbols, input.irModule.irBuiltins).lower(input.irModule) } internal val K2SpecialBackendChecksPhase = createSimpleNamedCompilerPhase( @@ -50,7 +48,6 @@ internal val K2SpecialBackendChecksPhase = createSimpleNamedCompilerPhase") @@ -112,7 +108,6 @@ internal abstract class KonanSymbols( val interopWcstr = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.wcstr.getter!!) val interopMemScope = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.memScope) val interopCValue = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.cValue) - val interopCValues = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.cValues) val interopCValuesRef = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.cValuesRef) val interopCValueWrite = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.cValueWrite) val interopCValueRead = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.cValueRead) @@ -180,21 +175,10 @@ internal abstract class KonanSymbols( val interopInterpretCPointer = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.interpretCPointer) - val interopCreateNSStringFromKString = - symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.CreateNSStringFromKString) - val createForeignException = interopFunction("CreateForeignException") - val interopObjCGetSelector = interopFunction("objCGetSelector") - - val interopCEnum = interopClass("CEnum") - - val interopCPrimitiveVar = interopClass("CPrimitiveVar") - val interopCEnumVar = interopClass("CEnumVar") - val interopCStructVar = interopClass("CStructVar") - val nativeMemUtils = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.nativeMemUtils) val nativeHeap = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.nativeHeap) @@ -415,6 +399,20 @@ internal abstract class KonanSymbols( val eagerInitialization = topLevelClass(KonanFqNames.eagerInitialization) + val cStructVarConstructorSymbol = symbolTable.referenceConstructor( + descriptorsLookup.interopBuiltIns.cStructVar.unsubstitutedPrimaryConstructor!! + ) + val managedTypeConstructor = symbolTable.referenceConstructor( + descriptorsLookup.interopBuiltIns.managedType.unsubstitutedPrimaryConstructor!! + ) + val enumVarConstructorSymbol = symbolTable.referenceConstructor( + descriptorsLookup.interopBuiltIns.cEnumVar.unsubstitutedPrimaryConstructor!! + ) + val primitiveVarPrimaryConstructor = symbolTable.referenceConstructor( + descriptorsLookup.interopBuiltIns.cPrimitiveVarType.unsubstitutedPrimaryConstructor!!) + val structVarPrimaryConstructor = symbolTable.referenceConstructor( + descriptorsLookup.interopBuiltIns.cStructVarType.unsubstitutedPrimaryConstructor!!) + private fun topLevelClass(fqName: FqName): IrClassSymbol = irBuiltIns.findClass(fqName.shortName(), fqName.parent())!! private fun internalFunction(name: String) = diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/DescriptorToIrTranslationUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/DescriptorToIrTranslationUtils.kt index 6e89b06ffdc..524992a61e3 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/DescriptorToIrTranslationUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/DescriptorToIrTranslationUtils.kt @@ -4,7 +4,7 @@ */ package org.jetbrains.kotlin.backend.konan.ir.interop -import org.jetbrains.kotlin.backend.konan.InteropBuiltIns +import org.jetbrains.kotlin.backend.konan.InteropFqNames import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.IrBuiltIns @@ -17,10 +17,7 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny -import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperInterfaces -import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal -import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf +import org.jetbrains.kotlin.resolve.descriptorUtil.* import org.jetbrains.kotlin.types.KotlinType internal inline fun ClassDescriptor.findDeclarationByName(name: String): T? = @@ -153,32 +150,32 @@ internal fun IrBuilder.irInstanceInitializer(classSymbol: IrClassSymbol): IrExpr context.irBuiltIns.unitType ) -internal fun ClassDescriptor.implementsCEnum(interopBuiltIns: InteropBuiltIns): Boolean = - interopBuiltIns.cEnum in this.getSuperInterfaces() +internal fun ClassDescriptor.implementsCEnum(): Boolean = + getSuperInterfaces().any { it.fqNameSafe == InteropFqNames.cEnum } -internal fun ClassDescriptor.inheritsFromCStructVar(interopBuiltIns: InteropBuiltIns): Boolean = - interopBuiltIns.cStructVar == this.getSuperClassNotAny() +internal fun ClassDescriptor.inheritsFromCStructVar(): Boolean = + getSuperClassNotAny()?.fqNameSafe == InteropFqNames.cStructVar /** * All enums that come from interop library implement CEnum interface. * This function checks that given symbol located in subtree of * CEnum inheritor. */ -internal fun IrSymbol.findCEnumDescriptor(interopBuiltIns: InteropBuiltIns): ClassDescriptor? = - descriptor.findCEnumDescriptor(interopBuiltIns) +internal fun IrSymbol.findCEnumDescriptor(): ClassDescriptor? = + descriptor.findCEnumDescriptor() -internal fun DeclarationDescriptor.findCEnumDescriptor(interopBuiltIns: InteropBuiltIns): ClassDescriptor? = - parentsWithSelf.filterIsInstance().firstOrNull { it.implementsCEnum(interopBuiltIns) } +internal fun DeclarationDescriptor.findCEnumDescriptor(): ClassDescriptor? = + parentsWithSelf.filterIsInstance().firstOrNull { it.implementsCEnum() } /** * All structs that come from interop library inherit from CStructVar class. * This function checks that given symbol located in subtree of * CStructVar inheritor. */ -internal fun IrSymbol.findCStructDescriptor(interopBuiltIns: InteropBuiltIns): ClassDescriptor? = - descriptor.findCStructDescriptor(interopBuiltIns) +internal fun IrSymbol.findCStructDescriptor(): ClassDescriptor? = + descriptor.findCStructDescriptor() -internal fun DeclarationDescriptor.findCStructDescriptor(interopBuiltIns: InteropBuiltIns): ClassDescriptor? = +internal fun DeclarationDescriptor.findCStructDescriptor(): ClassDescriptor? = parentsWithSelf.filterIsInstance().firstOrNull { - it.inheritsFromCStructVar(interopBuiltIns) || it.annotations.hasAnnotation(RuntimeNames.managedType) + it.inheritsFromCStructVar() || it.annotations.hasAnnotation(RuntimeNames.managedType) } \ No newline at end of file diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/IrProviderForCEnumAndCStructStubs.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/IrProviderForCEnumAndCStructStubs.kt index 20cbabe40bb..fe0e23a96a9 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/IrProviderForCEnumAndCStructStubs.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/IrProviderForCEnumAndCStructStubs.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.backend.konan.ir.interop import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData -import org.jetbrains.kotlin.backend.konan.InteropBuiltIns import org.jetbrains.kotlin.backend.konan.descriptors.getPackageFragments import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols import org.jetbrains.kotlin.backend.konan.ir.interop.cenum.CEnumByValueFunctionGenerator @@ -34,7 +33,6 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter */ internal class IrProviderForCEnumAndCStructStubs( context: GeneratorContext, - private val interopBuiltIns: InteropBuiltIns, symbols: KonanSymbols ) { @@ -48,30 +46,30 @@ internal class IrProviderForCEnumAndCStructStubs( private val cEnumCompanionGenerator = CEnumCompanionGenerator(context, cEnumByValueFunctionGenerator) private val cEnumVarClassGenerator = - CEnumVarClassGenerator(context, interopBuiltIns) + CEnumVarClassGenerator(context, symbols) private val cEnumClassGenerator = CEnumClassGenerator(context, cEnumCompanionGenerator, cEnumVarClassGenerator) private val cStructCompanionGenerator = - CStructVarCompanionGenerator(context, interopBuiltIns) + CStructVarCompanionGenerator(context, symbols) private val cStructClassGenerator = - CStructVarClassGenerator(context, interopBuiltIns, cStructCompanionGenerator, symbols) + CStructVarClassGenerator(context, cStructCompanionGenerator, symbols) fun isCEnumOrCStruct(declarationDescriptor: DeclarationDescriptor): Boolean = - declarationDescriptor.run { findCEnumDescriptor(interopBuiltIns) ?: findCStructDescriptor(interopBuiltIns) } != null + declarationDescriptor.run { findCEnumDescriptor() ?: findCStructDescriptor() } != null fun referenceAllEnumsAndStructsFrom(interopModule: ModuleDescriptor) = interopModule.getPackageFragments() .flatMap { it.getMemberScope().getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS) } .filterIsInstance() - .filter { it.implementsCEnum(interopBuiltIns) || it.inheritsFromCStructVar(interopBuiltIns) } + .filter { it.implementsCEnum() || it.inheritsFromCStructVar() } .forEach { symbolTable.referenceClass(it) } private fun generateIrIfNeeded(symbol: IrSymbol, file: IrFile) { // TODO: These `findOrGenerate` calls generate a whole subtree. // This a simple but clearly suboptimal solution. - symbol.findCEnumDescriptor(interopBuiltIns)?.let { enumDescriptor -> + symbol.findCEnumDescriptor()?.let { enumDescriptor -> cEnumClassGenerator.findOrGenerateCEnum(enumDescriptor, file) } - symbol.findCStructDescriptor(interopBuiltIns)?.let { structDescriptor -> + symbol.findCStructDescriptor()?.let { structDescriptor -> cStructClassGenerator.findOrGenerateCStruct(structDescriptor, file) } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumVarClassGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumVarClassGenerator.kt index e5f481878bd..c3c9eca9603 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumVarClassGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumVarClassGenerator.kt @@ -4,8 +4,8 @@ */ package org.jetbrains.kotlin.backend.konan.ir.interop.cenum -import org.jetbrains.kotlin.backend.konan.InteropBuiltIns import org.jetbrains.kotlin.backend.konan.descriptors.getArgumentValueOrNull +import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols import org.jetbrains.kotlin.backend.konan.ir.interop.DescriptorToIrTranslationMixin import org.jetbrains.kotlin.backend.konan.ir.interop.irInstanceInitializer import org.jetbrains.kotlin.descriptors.ClassDescriptor @@ -31,7 +31,7 @@ private val typeSizeAnnotation = FqName("kotlinx.cinterop.internal.CEnumVarTypeS internal class CEnumVarClassGenerator( context: GeneratorContext, - private val interopBuiltIns: InteropBuiltIns + private val symbols: KonanSymbols ) : DescriptorToIrTranslationMixin { override val irBuiltIns: IrBuiltIns = context.irBuiltIns @@ -57,14 +57,11 @@ internal class CEnumVarClassGenerator( private fun createPrimaryConstructor(enumVarClass: IrClass): IrConstructor { val irConstructor = createConstructor(enumVarClass.descriptor.unsubstitutedPrimaryConstructor!!) - val enumVarConstructorSymbol = symbolTable.referenceConstructor( - interopBuiltIns.cEnumVar.unsubstitutedPrimaryConstructor!! - ) val classSymbol = symbolTable.referenceClass(enumVarClass.descriptor) postLinkageSteps.add { irConstructor.body = irBuilder(irBuiltIns, irConstructor.symbol, SYNTHETIC_OFFSET, SYNTHETIC_OFFSET).irBlockBody { +IrDelegatingConstructorCallImpl.fromSymbolOwner( - startOffset, endOffset, context.irBuiltIns.unitType, enumVarConstructorSymbol + startOffset, endOffset, context.irBuiltIns.unitType, symbols.enumVarConstructorSymbol ).also { it.putValueArgument(0, irGet(irConstructor.valueParameters[0])) } @@ -83,14 +80,13 @@ internal class CEnumVarClassGenerator( } private fun createCompanionConstructor(companionObjectDescriptor: ClassDescriptor, typeSize: Int): IrConstructor { - val superConstructorSymbol = symbolTable.referenceConstructor(interopBuiltIns.cPrimitiveVarType.unsubstitutedPrimaryConstructor!!) val classSymbol = symbolTable.referenceClass(companionObjectDescriptor) return createConstructor(companionObjectDescriptor.unsubstitutedPrimaryConstructor!!).also { postLinkageSteps.add { it.body = irBuilder(irBuiltIns, it.symbol, SYNTHETIC_OFFSET, SYNTHETIC_OFFSET).irBlockBody { +IrDelegatingConstructorCallImpl.fromSymbolOwner( startOffset, endOffset, context.irBuiltIns.unitType, - superConstructorSymbol + symbols.primitiveVarPrimaryConstructor ).also { it.putValueArgument(0, irInt(typeSize)) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarClassGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarClassGenerator.kt index 6dde410c463..309231b85a4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarClassGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarClassGenerator.kt @@ -4,7 +4,6 @@ */ package org.jetbrains.kotlin.backend.konan.ir.interop.cstruct -import org.jetbrains.kotlin.backend.konan.InteropBuiltIns import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols import org.jetbrains.kotlin.backend.konan.ir.interop.DescriptorToIrTranslationMixin @@ -29,7 +28,6 @@ import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext internal class CStructVarClassGenerator( context: GeneratorContext, - private val interopBuiltIns: InteropBuiltIns, private val companionGenerator: CStructVarCompanionGenerator, private val symbols: KonanSymbols ) : DescriptorToIrTranslationMixin { @@ -266,15 +264,12 @@ internal class CStructVarClassGenerator( private fun createPrimaryConstructor(irClass: IrClass): IrConstructor { if (!irClass.descriptor.annotations.hasAnnotation(RuntimeNames.managedType)) { - val cStructVarConstructorSymbol = symbolTable.referenceConstructor( - interopBuiltIns.cStructVar.unsubstitutedPrimaryConstructor!! - ) return createConstructor(irClass.descriptor.unsubstitutedPrimaryConstructor!!).also { irConstructor -> postLinkageSteps.add { irConstructor.body = irBuilder(irBuiltIns, irConstructor.symbol, SYNTHETIC_OFFSET, SYNTHETIC_OFFSET).irBlockBody { +IrDelegatingConstructorCallImpl.fromSymbolOwner( startOffset, endOffset, - context.irBuiltIns.unitType, cStructVarConstructorSymbol + context.irBuiltIns.unitType, symbols.cStructVarConstructorSymbol ).also { it.putValueArgument(0, irGet(irConstructor.valueParameters[0])) } @@ -284,14 +279,11 @@ internal class CStructVarClassGenerator( } } else { return createConstructor(irClass.descriptor.unsubstitutedPrimaryConstructor!!).also { irConstructor -> - val managedTypeConstructor = symbolTable.referenceConstructor( - interopBuiltIns.managedType.unsubstitutedPrimaryConstructor!! - ) postLinkageSteps.add { irConstructor.body = irBuilder(irBuiltIns, irConstructor.symbol, SYNTHETIC_OFFSET, SYNTHETIC_OFFSET).irBlockBody { +IrDelegatingConstructorCallImpl.fromSymbolOwner( startOffset, endOffset, - context.irBuiltIns.unitType, managedTypeConstructor + context.irBuiltIns.unitType, symbols.managedTypeConstructor ).also { it.putTypeArgument(0, irConstructor.valueParameters[0].type) it.putValueArgument(0, irGet(irConstructor.valueParameters[0])) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarCompanionGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarCompanionGenerator.kt index 3ed9589f6fa..b9eba5d4a2c 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarCompanionGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cstruct/CStructVarCompanionGenerator.kt @@ -4,9 +4,9 @@ */ package org.jetbrains.kotlin.backend.konan.ir.interop.cstruct -import org.jetbrains.kotlin.backend.konan.InteropBuiltIns import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.backend.konan.descriptors.getArgumentValueOrNull +import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols import org.jetbrains.kotlin.backend.konan.ir.interop.DescriptorToIrTranslationMixin import org.jetbrains.kotlin.backend.konan.ir.interop.irInstanceInitializer import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor @@ -29,7 +29,7 @@ private val varTypeAnnotationFqName = FqName("kotlinx.cinterop.internal.CStruct. internal class CStructVarCompanionGenerator( context: GeneratorContext, - private val interopBuiltIns: InteropBuiltIns + private val symbols: KonanSymbols ) : DescriptorToIrTranslationMixin { override val irBuiltIns: IrBuiltIns = context.irBuiltIns @@ -76,13 +76,12 @@ internal class CStructVarCompanionGenerator( } } } else { - val superConstructorSymbol = symbolTable.referenceConstructor(interopBuiltIns.cStructVarType.unsubstitutedPrimaryConstructor!!) return createConstructor(companionObjectDescriptor.unsubstitutedPrimaryConstructor!!).also { irConstructor -> postLinkageSteps.add { irConstructor.body = irBuilder(irBuiltIns, irConstructor.symbol, SYNTHETIC_OFFSET, SYNTHETIC_OFFSET).irBlockBody { +IrDelegatingConstructorCallImpl.fromSymbolOwner( startOffset, endOffset, context.irBuiltIns.unitType, - superConstructorSymbol + symbols.structVarPrimaryConstructor ).also { it.putValueArgument(0, irLong(size)) it.putValueArgument(1, irInt(align)) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index b466a0e5f6e..0544f6d2022 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.uniqueName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.classId +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe internal enum class FieldStorageKind { GLOBAL, // In the old memory model these are only accessible from the "main" thread. @@ -2303,8 +2304,8 @@ internal class CodeGeneratorVisitor( private fun evaluateFunctionReference(expression: IrFunctionReference): LLVMValueRef { // TODO: consider creating separate IR element for pointer to function. - assert (expression.type.getClass()?.descriptor == context.interopBuiltIns.cPointer) { - "assert: ${expression.type.getClass()?.descriptor} == ${context.interopBuiltIns.cPointer}" + assert (expression.type.getClass()?.descriptor?.fqNameUnsafe == InteropFqNames.cPointer) { + "assert: ${expression.type.getClass()?.descriptor?.fqNameUnsafe} == ${InteropFqNames.cPointer}" } assert (expression.getArguments().isEmpty()) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt index 3239fe18901..bd48e4a13c0 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KotlinObjCClassInfoGenerator.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.backend.konan.llvm import llvm.LLVMLinkage -import llvm.LLVMSetLinkage import llvm.LLVMValueRef import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.descriptors.getAnnotationStringValue @@ -14,7 +13,6 @@ import org.jetbrains.kotlin.backend.konan.ir.* import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe internal class KotlinObjCClassInfoGenerator(override val generationState: NativeGenerationState) : ContextUtils { fun generate(irClass: IrClass) { @@ -92,7 +90,7 @@ internal class KotlinObjCClassInfoGenerator(override val generationState: Native } private fun selectExportedClassName(irClass: IrClass): String? { - val exportObjCClassAnnotation = context.interopBuiltIns.exportObjCClass.fqNameSafe + val exportObjCClassAnnotation = InteropFqNames.exportObjCClass val explicitName = irClass.getAnnotationArgumentValue(exportObjCClassAnnotation, "name") if (explicitName != null) return explicitName @@ -120,7 +118,7 @@ internal class KotlinObjCClassInfoGenerator(override val generationState: Native .filterIsInstance() .mapNotNull { val annotation = - it.annotations.findAnnotation(context.interopBuiltIns.objCMethodImp.fqNameSafe) ?: + it.annotations.findAnnotation(InteropFqNames.objCMethodImp) ?: return@mapNotNull null ObjCMethodDesc( diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt index 2b5b353cb8d..b03f8a00095 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.backend.konan.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass -import org.jetbrains.kotlin.backend.common.ir.inlineDeclaration import org.jetbrains.kotlin.backend.common.ir.inlineFunction import org.jetbrains.kotlin.backend.common.lower.* import org.jetbrains.kotlin.backend.common.peek @@ -51,7 +50,7 @@ import org.jetbrains.kotlin.konan.ForeignExceptionMode import org.jetbrains.kotlin.konan.library.KonanLibrary import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.descriptorUtil.module internal class InteropLowering(generationState: NativeGenerationState) : FileLoweringPass { @@ -189,14 +188,12 @@ private class InteropLoweringPart1(val generationState: NativeGenerationState) : private fun lowerKotlinObjCClass(irClass: IrClass) { checkKotlinObjCClass(irClass) - val interop = context.interopBuiltIns - irClass.declarations.toList().mapNotNull { when { - it is IrSimpleFunction && it.annotations.hasAnnotation(interop.objCAction.fqNameSafe) -> + it is IrSimpleFunction && it.annotations.hasAnnotation(InteropFqNames.objCAction) -> generateActionImp(it) - it is IrProperty && it.annotations.hasAnnotation(interop.objCOutlet.fqNameSafe) -> + it is IrProperty && it.annotations.hasAnnotation(InteropFqNames.objCOutlet) -> generateOutletSetterImp(it) it is IrConstructor && it.isOverrideInit() -> @@ -206,7 +203,7 @@ private class InteropLoweringPart1(val generationState: NativeGenerationState) : } }.let { irClass.addChildren(it) } - if (irClass.annotations.hasAnnotation(interop.exportObjCClass.fqNameSafe)) { + if (irClass.annotations.hasAnnotation(InteropFqNames.exportObjCClass)) { val irBuilder = context.createIrBuilder(currentFile.symbol).at(irClass) eagerTopLevelInitializers.add(irBuilder.getObjCClass(symbols, irClass.symbol)) } @@ -220,7 +217,7 @@ private class InteropLoweringPart1(val generationState: NativeGenerationState) : return false } - return this.annotations.hasAnnotation(context.interopBuiltIns.objCOverrideInit.fqNameSafe) + return this.annotations.hasAnnotation(InteropFqNames.objCOverrideInit) } private fun generateOverrideInit(irClass: IrClass, constructor: IrConstructor): IrSimpleFunction { @@ -787,7 +784,6 @@ private class InteropTransformer( val newTopLevelDeclarations = mutableListOf() - val interop = context.interopBuiltIns val symbols = context.ir.symbols override fun addTopLevel(declaration: IrDeclaration) { @@ -854,8 +850,8 @@ private class InteropTransformer( val callee = expression.symbol.owner val inlinedClass = callee.returnType.getInlinedClassNative() - require(inlinedClass?.descriptor != interop.cPointer) { renderCompilerError(expression) } - require(inlinedClass?.descriptor != interop.nativePointed) { renderCompilerError(expression) } + require(inlinedClass?.symbol != symbols.interopCPointer) { renderCompilerError(expression) } + require(inlinedClass?.symbol != symbols.nativePointed) { renderCompilerError(expression) } val constructedClass = callee.constructedClass if (!constructedClass.isObjCClass()) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt index c5bd06c29e8..8acfeb54bcd 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt @@ -32,8 +32,8 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext.getClassFqNameUnsafe import org.jetbrains.kotlin.utils.fileUtils.descendantRelativeTo import java.io.File @@ -43,16 +43,14 @@ import java.io.File */ internal class SpecialBackendChecksTraversal( private val context: PhaseContext, - private val interop: InteropBuiltIns, private val symbols: KonanSymbols, private val irBuiltIns: IrBuiltIns, ) : FileLoweringPass { - override fun lower(irFile: IrFile) = irFile.acceptChildrenVoid(BackendChecker(context, interop, symbols, irBuiltIns, irFile)) + override fun lower(irFile: IrFile) = irFile.acceptChildrenVoid(BackendChecker(context, symbols, irBuiltIns, irFile)) } private class BackendChecker( private val context: PhaseContext, - val interop: InteropBuiltIns, val symbols: KonanSymbols, val irBuiltIns: IrBuiltIns, private val irFile: IrFile, @@ -109,7 +107,7 @@ private class BackendChecker( } private fun IrConstructor.isOverrideInit() = - this.annotations.hasAnnotation(interop.objCOverrideInit.fqNameSafe) + this.annotations.hasAnnotation(InteropFqNames.objCOverrideInit) private fun checkCanGenerateOverrideInit(irClass: IrClass, constructor: IrConstructor) { val superClass = irClass.getSuperClassNotAny()!! @@ -118,7 +116,7 @@ private class BackendChecker( }.toList() val superConstructor = superConstructors.singleOrNull() ?: run { - val annotation = interop.objCOverrideInit.name + val annotation = InteropFqNames.objCOverrideInit if (superConstructors.isEmpty()) reportError(constructor, """ @@ -136,7 +134,7 @@ private class BackendChecker( // Remove fake overrides of this init method, also check for explicit overriding: irClass.declarations.forEach { if (it is IrSimpleFunction && initMethod.symbol in it.overriddenSymbols && it.isReal) { - val annotation = interop.objCOverrideInit.name + val annotation = InteropFqNames.objCOverrideInit reportError(constructor, "constructor with @$annotation overrides initializer that is already overridden explicitly" ) @@ -152,7 +150,7 @@ private class BackendChecker( } private fun checkCanGenerateActionImp(function: IrSimpleFunction) { - val action = "@${interop.objCAction.name}" + val action = "@${InteropFqNames.objCAction}" function.extensionReceiverParameter?.let { reportError(it, "$action method must not have extension receiver") @@ -176,7 +174,7 @@ private class BackendChecker( private fun checkCanGenerateOutletSetterImp(property: IrProperty) { val descriptor = property.descriptor - val outlet = "@${interop.objCOutlet.name}" + val outlet = "@${InteropFqNames.objCOutlet}" if (!descriptor.isVar) reportError(property, "$outlet property must be var") @@ -209,9 +207,9 @@ private class BackendChecker( private fun checkKotlinObjCClass(irClass: IrClass) { for (declaration in irClass.declarations) { - if (declaration is IrSimpleFunction && declaration.annotations.hasAnnotation(interop.objCAction.fqNameSafe)) + if (declaration is IrSimpleFunction && declaration.annotations.hasAnnotation(InteropFqNames.objCAction)) checkCanGenerateActionImp(declaration) - if (declaration is IrProperty && declaration.annotations.hasAnnotation(interop.objCOutlet.fqNameSafe)) + if (declaration is IrProperty && declaration.annotations.hasAnnotation(InteropFqNames.objCOutlet)) checkCanGenerateOutletSetterImp(declaration) if (declaration is IrConstructor && declaration.isOverrideInit()) checkCanGenerateOverrideInit(irClass, declaration) @@ -379,7 +377,7 @@ private class BackendChecker( } callee.getExternalObjCMethodInfo()?.let { _ -> - val isInteropStubsFile = irFile.annotations.hasAnnotation(FqName("kotlinx.cinterop.InteropStubs")) + val isInteropStubsFile = irFile.annotations.hasAnnotation(InteropFqNames.interopStubs) // Special case: bridge from Objective-C method implementation template to Kotlin method; // handled in CodeGeneratorVisitor.callVirtual. @@ -740,8 +738,8 @@ private fun BackendChecker.checkCanMapCalleeFunctionParameter( ) { val classifier = type.classifierOrNull when { - classifier == symbols.interopCValues || // Note: this should not be accepted, but is required for compatibility - classifier == symbols.interopCValuesRef -> return + classifier?.isClassWithFqName(InteropFqNames.cValues.toUnsafe()) == true || // Note: this should not be accepted, but is required for compatibility + classifier?.isClassWithFqName(InteropFqNames.cValuesRef.toUnsafe()) == true -> return classifier == symbols.string && (variadic || parameter?.isCStringParameter() == true) -> { if (variadic && isObjCMethod) {