[K2/N] Refactor KonanSymbols before re-enabling special backend checks

^KT-55598
Merge-request: KT-MR-9477
Merged-by: Vladimir Sukharev <Vladimir.Sukharev@jetbrains.com>
This commit is contained in:
Vladimir Sukharev
2023-04-17 10:35:55 +00:00
committed by Space Team
parent 147a3331a4
commit 3cdf4bae07
7 changed files with 279 additions and 215 deletions
@@ -28,10 +28,7 @@ import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.impl.*
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
@@ -623,6 +620,9 @@ class IrBuiltInsOverFir(
override fun findFunctions(name: Name, packageFqName: FqName): Iterable<IrSimpleFunctionSymbol> =
findFunctions(packageFqName, name)
override fun findProperties(name: Name, packageFqName: FqName): Iterable<IrPropertySymbol> =
findProperties(packageFqName, name)
override fun findClass(name: Name, vararg packageNameSegments: String): IrClassSymbol? =
referenceClassByFqname(FqName.fromSegments(packageNameSegments.asList()), name)
@@ -1165,4 +1165,9 @@ class IrBuiltInsOverFir(
components.session.symbolProvider.getTopLevelFunctionSymbols(packageName, name).mapNotNull { firOpSymbol ->
components.declarationStorage.getIrFunctionSymbol(firOpSymbol) as? IrSimpleFunctionSymbol
}
private fun findProperties(packageName: FqName, name: Name): List<IrPropertySymbol> =
components.session.symbolProvider.getTopLevelPropertySymbols(packageName, name).mapNotNull { firOpSymbol ->
components.declarationStorage.getIrPropertySymbol(firOpSymbol) as? IrPropertySymbol
}
}
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.ir.descriptors.*
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
import org.jetbrains.kotlin.ir.types.*
@@ -488,6 +489,11 @@ class IrBuiltInsOverDescriptors(
symbolTable.referenceSimpleFunction(it)
}
override fun findProperties(name: Name, packageFqName: FqName): Iterable<IrPropertySymbol> =
builtIns.builtInsModule.getPackage(packageFqName).memberScope.getContributedVariables(name, NoLookupLocation.FROM_BACKEND).map {
symbolTable.referenceProperty(it)
}
override fun findClass(name: Name, vararg packageNameSegments: String): IrClassSymbol? =
(builtInsPackage(*packageNameSegments).getContributedClassifier(
name,
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.FqName
@@ -159,6 +160,7 @@ abstract class IrBuiltIns {
// TODO: drop variants from segments, add helper from whole fqn
abstract fun findFunctions(name: Name, vararg packageNameSegments: String = arrayOf("kotlin")): Iterable<IrSimpleFunctionSymbol>
abstract fun findFunctions(name: Name, packageFqName: FqName): Iterable<IrSimpleFunctionSymbol>
abstract fun findProperties(name: Name, packageFqName: FqName): Iterable<IrPropertySymbol>
abstract fun findClass(name: Name, vararg packageNameSegments: String = arrayOf("kotlin")): IrClassSymbol?
abstract fun findClass(name: Name, packageFqName: FqName): IrClassSymbol?
@@ -6,27 +6,10 @@
package org.jetbrains.kotlin.backend.konan
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.MemberScope
internal class DescriptorsLookup(val builtIns: KonanBuiltIns) {
private val packageScope by lazy { builtIns.builtInsModule.getPackage(KonanFqNames.internalPackageName).memberScope }
val nativePtr by lazy { packageScope.getContributedClassifier(NATIVE_PTR_NAME) as ClassDescriptor }
val getNativeNullPtr by lazy { packageScope.getContributedFunctions("getNativeNullPtr").single() }
val immutableBlobOf by lazy {
builtIns.builtInsModule.getPackage(KonanFqNames.packageName).memberScope.getContributedFunctions("immutableBlobOf").single()
}
val interopBuiltIns by lazy {
InteropBuiltIns(this.builtIns)
}
private fun MemberScope.getContributedClassifier(name: String) =
this.getContributedClassifier(Name.identifier(name), NoLookupLocation.FROM_BUILTINS)
private fun MemberScope.getContributedFunctions(name: String) =
this.getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BUILTINS)
}
@@ -5,18 +5,12 @@
package org.jetbrains.kotlin.backend.konan
import org.jetbrains.kotlin.backend.konan.InteropFqNames.cValue
import org.jetbrains.kotlin.backend.konan.InteropFqNames.cValueName
import org.jetbrains.kotlin.backend.konan.InteropFqNames.managedTypeName
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
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.scopes.MemberScope
import org.jetbrains.kotlin.types.TypeUtils
object InteropFqNames {
@@ -29,16 +23,52 @@ object InteropFqNames {
const val objCOutletName = "ObjCOutlet"
const val objCMethodImpName = "ObjCMethodImp"
const val exportObjCClassName = "ExportObjCClass"
const val nativeHeapName = "nativeHeap"
const val cValueName = "CValue"
const val cValuesName = "CValues"
const val cValuesRefName = "CValuesRef"
const val cEnumName = "CEnum"
const val cStructVarName = "CStructVar"
const val cEnumVarName = "CEnumVar"
const val cPrimitiveVarName = "CPrimitiveVar"
private const val cPointedName = "CPointed"
const val interopStubsName = "InteropStubs"
const val managedTypeName = "ManagedType"
const val memScopeName = "MemScope"
const val foreignObjCObjectName = "ForeignObjCObject"
const val cOpaqueName = "COpaque"
const val objCObjectName = "ObjCObject"
const val objCObjectBaseMetaName = "ObjCObjectBaseMeta"
const val objCClassName = "ObjCClass"
const val objCClassOfName = "ObjCClassOf"
const val objCProtocolName = "ObjCProtocol"
const val nativeMemUtilsName = "nativeMemUtils"
const val cPlusPlusClassName = "CPlusPlusClass"
const val skiaRefCntName = "SkiaRefCnt"
const val TypeName = "Type"
const val cstrPropertyName = "cstr"
const val wcstrPropertyName = "wcstr"
const val nativePointedRawPtrPropertyName = "rawPtr"
const val cPointerRawValuePropertyName = "rawValue"
const val getObjCClassFunName = "getObjCClass"
const val objCObjectSuperInitCheckFunName = "superInitCheck"
const val allocObjCObjectFunName = "allocObjCObject"
const val typeOfFunName = "typeOf"
const val objCObjectInitByFunName = "initBy"
const val objCObjectRawPtrFunName = "objcPtr"
const val interpretObjCPointerFunName = "interpretObjCPointer"
const val interpretObjCPointerOrNullFunName = "interpretObjCPointerOrNull"
const val interpretNullablePointedFunName = "interpretNullablePointed"
const val interpretCPointerFunName = "interpretCPointer"
const val nativePointedGetRawPointerFunName = "getRawPointer"
const val cPointerGetRawValueFunName = "getRawValue"
const val cValueWriteFunName = "write"
const val cValueReadFunName = "readValue"
const val allocTypeFunName = "alloc"
val packageName = FqName("kotlinx.cinterop")
@@ -69,112 +99,15 @@ internal class InteropBuiltIns(builtIns: KonanBuiltIns) {
private val packageScope = builtIns.builtInsModule.getPackage(InteropFqNames.packageName).memberScope
val nativePointed = packageScope.getContributedClass(InteropFqNames.nativePointedName)
val cValuesRef = this.packageScope.getContributedClass("CValuesRef")
val cValue = this.packageScope.getContributedClass(cValueName)
val cOpaque = this.packageScope.getContributedClass("COpaque")
val cValueWrite = this.packageScope.getContributedFunctions("write")
.single { it.extensionReceiverParameter?.type?.constructor?.declarationDescriptor?.fqNameSafe == InteropFqNames.cValue }
val cValueRead = this.packageScope.getContributedFunctions("readValue")
.single { it.valueParameters.size == 1 }
val cEnumVar = this.packageScope.getContributedClass("CEnumVar")
val cStructVar = this.packageScope.getContributedClass("CStructVar")
val cStructVarType = cStructVar.defaultType.memberScope.getContributedClass("Type")
private val cPrimitiveVar = this.packageScope.getContributedClass("CPrimitiveVar")
val cPrimitiveVarType = cPrimitiveVar.defaultType.memberScope.getContributedClass("Type")
val nativeMemUtils = this.packageScope.getContributedClass("nativeMemUtils")
val allocType = this.packageScope.getContributedFunctions("alloc")
.single { it.extensionReceiverParameter != null
&& it.valueParameters.singleOrNull()?.name?.toString() == "type" }
val cPointer = this.packageScope.getContributedClass(InteropFqNames.cPointerName)
val cPointerRawValue = cPointer.unsubstitutedMemberScope.getContributedVariables("rawValue").single()
val cPointerGetRawValue = packageScope.getContributedFunctions("getRawValue").single {
val extensionReceiverParameter = it.extensionReceiverParameter
extensionReceiverParameter != null &&
TypeUtils.getClassDescriptor(extensionReceiverParameter.type)?.fqNameUnsafe == InteropFqNames.cPointer
}
val cstr = packageScope.getContributedVariables("cstr").single()
val wcstr = packageScope.getContributedVariables("wcstr").single()
val memScope = packageScope.getContributedClass("MemScope")
val nativePointedRawPtrGetter =
nativePointed.unsubstitutedMemberScope.getContributedVariables("rawPtr").single().getter!!
val nativePointedGetRawPointer = packageScope.getContributedFunctions("getRawPointer").single {
val extensionReceiverParameter = it.extensionReceiverParameter
extensionReceiverParameter != null &&
TypeUtils.getClassDescriptor(extensionReceiverParameter.type) == nativePointed
}
val typeOf = packageScope.getContributedFunctions("typeOf").single()
val objCObject = packageScope.getContributedClass("ObjCObject")
val objCObjectBase = packageScope.getContributedClass("ObjCObjectBase")
val objCObjectBaseMeta = packageScope.getContributedClass("ObjCObjectBaseMeta")
val objCClass = packageScope.getContributedClass("ObjCClass")
val objCClassOf = packageScope.getContributedClass("ObjCClassOf")
val objCProtocol = packageScope.getContributedClass("ObjCProtocol")
val allocObjCObject = packageScope.getContributedFunctions("allocObjCObject").single()
val getObjCClass = packageScope.getContributedFunctions("getObjCClass").single()
val objCObjectRawPtr = packageScope.getContributedFunctions("objcPtr").single()
val interpretObjCPointerOrNull = packageScope.getContributedFunctions("interpretObjCPointerOrNull").single()
val interpretObjCPointer = packageScope.getContributedFunctions("interpretObjCPointer").single()
val interpretNullablePointed = packageScope.getContributedFunctions("interpretNullablePointed").single()
val interpretCPointer = packageScope.getContributedFunctions("interpretCPointer").single()
val objCObjectSuperInitCheck = packageScope.getContributedFunctions("superInitCheck").single()
val objCObjectInitBy = packageScope.getContributedFunctions("initBy").single()
val objCMethodImp = packageScope.getContributedClass(InteropFqNames.objCMethodImpName)
val nativeHeap = packageScope.getContributedClass("nativeHeap")
val managedType = packageScope.getContributedClass(managedTypeName) // used in CStructVarClassGenerator.kt
val cPlusPlusClass = packageScope.getContributedClass("CPlusPlusClass")
val skiaRefCnt = packageScope.getContributedClass("SkiaRefCnt")
val interopGetPtr = packageScope.getContributedVariables("ptr").single {
val singleTypeParameter = it.typeParameters.singleOrNull()
val singleTypeParameterUpperBound = singleTypeParameter?.upperBounds?.singleOrNull()
val extensionReceiverParameter = it.extensionReceiverParameter
singleTypeParameterUpperBound != null &&
extensionReceiverParameter != null &&
TypeUtils.getClassDescriptor(singleTypeParameterUpperBound)?.fqNameSafe == InteropFqNames.cPointed &&
extensionReceiverParameter.type == singleTypeParameter.defaultType
}.getter!!
val interopManagedGetPtr = packageScope.getContributedVariables("ptr").single {
val singleTypeParameter = it.typeParameters.singleOrNull()
val singleTypeParameterUpperBound = singleTypeParameter?.upperBounds?.singleOrNull()
val extensionReceiverParameter = it.extensionReceiverParameter
singleTypeParameterUpperBound != null &&
extensionReceiverParameter != null &&
TypeUtils.getClassDescriptor(singleTypeParameterUpperBound)?.fqNameSafe == InteropFqNames.cStructVar &&
TypeUtils.getClassDescriptor(extensionReceiverParameter.type)?.fqNameSafe == InteropFqNames.managedType
}.getter!!
internal fun getContributedVariables(name: String) = packageScope.getContributedVariables(name)
internal fun getContributedFunctions(name: String) = packageScope.getContributedFunctions(name)
internal fun getContributedClass(name: String) = packageScope.getContributedClass(name)
}
private fun MemberScope.getContributedVariables(name: String) =
this.getContributedVariables(Name.identifier(name), NoLookupLocation.FROM_BUILTINS)
private fun MemberScope.getContributedClass(name: String): ClassDescriptor =
internal fun MemberScope.getContributedClass(name: String): ClassDescriptor =
this.getContributedClassifier(Name.identifier(name), NoLookupLocation.FROM_BUILTINS) as ClassDescriptor
private fun MemberScope.getContributedFunctions(name: String) =
@@ -6,12 +6,12 @@
package org.jetbrains.kotlin.backend.konan
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name
internal const val NATIVE_PTR_NAME = "NativePtr"
internal const val NON_NULL_NATIVE_PTR_NAME = "NonNullNativePtr"
internal const val VECTOR128 = "Vector128"
internal const val IMMUTABLE_BLOB_OF = "immutableBlobOf"
object KonanFqNames {
val function = FqName("kotlin.Function")
@@ -14,22 +14,29 @@ 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.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyProperty
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.constructClassLikeType
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.declarations.IrEnumEntry
import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.defaultType
import org.jetbrains.kotlin.ir.types.typeWith
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.ir.util.findDeclaration
import org.jetbrains.kotlin.js.descriptorUtils.getKotlinTypeFqName
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
import org.jetbrains.kotlin.types.TypeUtils
object KonanNameConventions {
val setWithoutBoundCheck = Name.special("<setWithoutBoundCheck>")
@@ -41,13 +48,19 @@ internal class KonanIr(context: Context, override val symbols: KonanSymbols): Ir
internal abstract class KonanSymbols(
context: PhaseContext,
descriptorsLookup: DescriptorsLookup,
val descriptorsLookup: DescriptorsLookup, // Please don't add usages of `descriptorsLookup` and `descriptorsLookup.builtIns` to this class anymore.
irBuiltIns: IrBuiltIns,
internal val symbolTable: SymbolTable,
internal val symbolTable: SymbolTable, // Please don't add usages of `symbolTable` to this class anymore.
lazySymbolTable: ReferenceSymbolTable
): Symbols(irBuiltIns, symbolTable) {
internal abstract fun IrClassSymbol.findMemberSimpleFunction(name: Name): IrSimpleFunctionSymbol?
internal abstract fun IrClassSymbol.findMemberPropertyGetter(name: Name): IrSimpleFunctionSymbol?
protected abstract fun IrClassSymbol.findMemberSimpleFunction(name: Name): IrSimpleFunctionSymbol?
protected abstract fun IrClassSymbol.findMemberProperty(name: Name): IrPropertySymbol?
protected abstract fun IrClassSymbol.findMemberPropertyGetter(name: Name): IrSimpleFunctionSymbol?
protected abstract fun findDefaultConstructor(className: String): IrConstructorSymbol
protected abstract fun findDefaultConstructor(className: String, nestedClassName: String): IrConstructorSymbol
protected abstract fun findTopLevelExtensionPropertyGetter(packageName: FqName, name: Name, extensionParameterClassID: ClassId): IrSimpleFunctionSymbol?
private fun findInteropExtensionPropertyGetter(name: Name, extensionClassID: ClassId): IrSimpleFunctionSymbol? =
findTopLevelExtensionPropertyGetter(InteropFqNames.packageName, name, extensionClassID)
val entryPoint = findMainEntryPoint(context, descriptorsLookup.builtIns)?.let { symbolTable.referenceSimpleFunction(it) }
@@ -56,11 +69,11 @@ internal abstract class KonanSymbols(
val nothing get() = irBuiltIns.nothingClass
val throwable get() = irBuiltIns.throwableClass
val enum get() = irBuiltIns.enumClass
val nativePtr = symbolTable.referenceClass(descriptorsLookup.nativePtr)
val nativePointed = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.nativePointed)
private val nativePtr = internalClass(NATIVE_PTR_NAME)
val nativePointed = interopClass(InteropFqNames.nativePointedName)
val nativePtrType = nativePtr.typeWith(arguments = emptyList())
val immutableBlobOf = symbolTable.referenceSimpleFunction(descriptorsLookup.immutableBlobOf)
val immutableBlobOf = nativeFunction(IMMUTABLE_BLOB_OF)
val signedIntegerClasses = setOf(byte, short, int, long)
val unsignedIntegerClasses = setOf(uByte!!, uShort!!, uInt!!, uLong!!)
@@ -95,41 +108,40 @@ internal abstract class KonanSymbols(
val exportForCppRuntime = topLevelClass(RuntimeNames.exportForCppRuntime)
val typedIntrinsic = topLevelClass(RuntimeNames.typedIntrinsicAnnotation)
val objCMethodImp = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.objCMethodImp)
val objCMethodImp = interopClass(InteropFqNames.objCMethodImpName)
val processUnhandledException = irBuiltIns.findFunctions(Name.identifier("processUnhandledException"), "kotlin", "native").single()
val terminateWithUnhandledException = irBuiltIns.findFunctions(Name.identifier("terminateWithUnhandledException"), "kotlin", "native").single()
val interopNativePointedGetRawPointer =
symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.nativePointedGetRawPointer)
abstract val interopNativePointedGetRawPointer: IrSimpleFunctionSymbol
val interopCPointer = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.cPointer)
val interopCstr = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.cstr.getter!!)
val interopWcstr = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.wcstr.getter!!)
val interopMemScope = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.memScope)
val interopCValue = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.cValue)
val interopCValuesRef = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.cValuesRef)
val interopCValueWrite = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.cValueWrite)
val interopCValueRead = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.cValueRead)
val interopAllocType = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.allocType)
val interopCPointer = interopClass(InteropFqNames.cPointerName)
val interopCstr = findInteropExtensionPropertyGetter(Name.identifier(InteropFqNames.cstrPropertyName), StandardClassIds.String)!!
val interopWcstr = findInteropExtensionPropertyGetter(Name.identifier(InteropFqNames.wcstrPropertyName), StandardClassIds.String)!!
val interopMemScope = interopClass(InteropFqNames.memScopeName)
val interopCValue = interopClass(InteropFqNames.cValueName)
val interopCValuesRef = interopClass(InteropFqNames.cValuesRefName)
abstract val interopCValueWrite: IrSimpleFunctionSymbol
abstract val interopCValueRead: IrSimpleFunctionSymbol
abstract val interopAllocType: IrSimpleFunctionSymbol
val interopTypeOf = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.typeOf)
val interopTypeOf = interopFunction(InteropFqNames.typeOfFunName)
val interopCPointerGetRawValue = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.cPointerGetRawValue)
abstract val interopCPointerGetRawValue: IrSimpleFunctionSymbol
val interopAllocObjCObject = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.allocObjCObject)
val interopAllocObjCObject = interopFunction(InteropFqNames.allocObjCObjectFunName)
val interopForeignObjCObject = interopClass("ForeignObjCObject")
val interopForeignObjCObject = interopClass(InteropFqNames.foreignObjCObjectName)
// These are possible supertypes of forward declarations - we need to reference them explicitly to force their deserialization.
// TODO: Do it lazily.
val interopCOpaque = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.cOpaque)
val interopObjCObject = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.objCObject)
val interopObjCObjectBase = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.objCObjectBase)
val interopObjCObjectBaseMeta = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.objCObjectBaseMeta)
val interopObjCClass = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.objCClass)
val interopObjCClassOf = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.objCClassOf)
val interopObjCProtocol = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.objCProtocol)
val interopCOpaque = interopClass(InteropFqNames.cOpaqueName)
val interopObjCObject = interopClass(InteropFqNames.objCObjectName)
val interopObjCObjectBase = interopClass(InteropFqNames.objCObjectBaseName)
val interopObjCObjectBaseMeta = interopClass(InteropFqNames.objCObjectBaseMetaName)
val interopObjCClass = interopClass(InteropFqNames.objCClassName)
val interopObjCClassOf = interopClass(InteropFqNames.objCClassOfName)
val interopObjCProtocol = interopClass(InteropFqNames.objCProtocolName)
val interopObjCRelease = interopFunction("objc_release")
@@ -147,49 +159,35 @@ internal abstract class KonanSymbols(
val interopGetMessenger = interopFunction("getMessenger")
val interopGetMessengerStret = interopFunction("getMessengerStret")
val interopGetObjCClass = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.getObjCClass)
val interopGetObjCClass = interopFunction(InteropFqNames.getObjCClassFunName)
val interopObjCObjectSuperInitCheck = interopFunction(InteropFqNames.objCObjectSuperInitCheckFunName)
val interopObjCObjectInitBy = interopFunction(InteropFqNames.objCObjectInitByFunName)
val interopObjCObjectRawValueGetter = interopFunction(InteropFqNames.objCObjectRawPtrFunName)
val interopObjCObjectSuperInitCheck =
symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.objCObjectSuperInitCheck)
val interopNativePointedRawPtrGetter = interopClass(InteropFqNames.nativePointedName)
.findMemberPropertyGetter(Name.identifier(InteropFqNames.nativePointedRawPtrPropertyName))!!
val interopObjCObjectInitBy = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.objCObjectInitBy)
val interopCPointerRawValue: IrPropertySymbol = interopClass(InteropFqNames.cPointerName)
.findMemberProperty(Name.identifier(InteropFqNames.cPointerRawValuePropertyName))!!
val interopObjCObjectRawValueGetter =
symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.objCObjectRawPtr)
val interopNativePointedRawPtrGetter =
symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.nativePointedRawPtrGetter)
val interopCPointerRawValue =
symbolTable.referenceProperty(descriptorsLookup.interopBuiltIns.cPointerRawValue)
val interopInterpretObjCPointer =
symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.interpretObjCPointer)
val interopInterpretObjCPointerOrNull =
symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.interpretObjCPointerOrNull)
val interopInterpretNullablePointed =
symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.interpretNullablePointed)
val interopInterpretCPointer =
symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.interpretCPointer)
val interopInterpretObjCPointer = interopFunction(InteropFqNames.interpretObjCPointerFunName)
val interopInterpretObjCPointerOrNull = interopFunction(InteropFqNames.interpretObjCPointerOrNullFunName)
val interopInterpretNullablePointed = interopFunction(InteropFqNames.interpretNullablePointedFunName)
val interopInterpretCPointer = interopFunction(InteropFqNames.interpretCPointerFunName)
val createForeignException = interopFunction("CreateForeignException")
val interopCEnumVar = interopClass("CEnumVar")
val nativeMemUtils = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.nativeMemUtils)
val nativeMemUtils = interopClass(InteropFqNames.nativeMemUtilsName)
val nativeHeap = interopClass(InteropFqNames.nativeHeapName)
val nativeHeap = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.nativeHeap)
abstract val interopGetPtr: IrSimpleFunctionSymbol
abstract val interopManagedGetPtr: IrSimpleFunctionSymbol
val interopGetPtr = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.interopGetPtr)
val interopManagedGetPtr = symbolTable.referenceSimpleFunction(descriptorsLookup.interopBuiltIns.interopManagedGetPtr)
val interopManagedType = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.managedType)
val interopCPlusPlusClass = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.cPlusPlusClass)
val interopSkiaRefCnt = symbolTable.referenceClass(descriptorsLookup.interopBuiltIns.skiaRefCnt)
val interopManagedType = interopClass(InteropFqNames.managedTypeName)
val interopCPlusPlusClass = interopClass(InteropFqNames.cPlusPlusClassName)
val interopSkiaRefCnt = interopClass(InteropFqNames.skiaRefCntName)
val readBits = interopFunction("readBits")
val writeBits = interopFunction("writeBits")
@@ -200,7 +198,7 @@ internal abstract class KonanSymbols(
val objCExportGetCoroutineSuspended = internalFunction("getCoroutineSuspended")
val objCExportInterceptedContinuation = internalFunction("interceptedContinuation")
val getNativeNullPtr = symbolTable.referenceSimpleFunction(descriptorsLookup.getNativeNullPtr)
val getNativeNullPtr = internalFunction("getNativeNullPtr")
val boxCachePredicates = BoxCache.values().associateWith {
internalFunction("in${it.name.lowercase().replaceFirstChar(Char::uppercaseChar)}BoxCache")
@@ -395,26 +393,19 @@ internal abstract class KonanSymbols(
val sharedImmutable = topLevelClass(KonanFqNames.sharedImmutable)
val volatile = topLevelClass(KonanFqNames.volatile)
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!!)
val cStructVarConstructorSymbol = findDefaultConstructor(InteropFqNames.cStructVarName)
val managedTypeConstructor = findDefaultConstructor(InteropFqNames.managedTypeName)
val enumVarConstructorSymbol = findDefaultConstructor(InteropFqNames.cEnumVarName)
val primitiveVarPrimaryConstructor = findDefaultConstructor(InteropFqNames.cPrimitiveVarName, InteropFqNames.TypeName)
val structVarPrimaryConstructor = findDefaultConstructor(InteropFqNames.cStructVarName, InteropFqNames.TypeName)
private fun topLevelClass(fqName: FqName): IrClassSymbol = irBuiltIns.findClass(fqName.shortName(), fqName.parent())!!
private fun nativeFunction(name: String) =
irBuiltIns.findFunctions(Name.identifier(name), KonanFqNames.packageName).single()
private fun internalFunction(name: String) =
irBuiltIns.findFunctions(Name.identifier(name), RuntimeNames.kotlinNativeInternalPackageName).single()
@@ -433,7 +424,7 @@ internal abstract class KonanSymbols(
private fun interopFunction(name: String) =
irBuiltIns.findFunctions(Name.identifier(name), InteropFqNames.packageName).single()
private fun interopClass(name: String) =
protected fun interopClass(name: String) =
irBuiltIns.findClass(Name.identifier(name), InteropFqNames.packageName)!!
fun kFunctionN(n: Int) = irBuiltIns.kFunctionN(n).symbol
@@ -466,6 +457,8 @@ internal abstract class KonanSymbols(
fun getTestFunctionKind(kind: TestProcessor.FunctionKind) = testFunctionKindCache[kind]!!
}
// WARNING: override protected functions are called from base class(`KonanSymbols`) constructor,
// so its functionality must be independent of the derived object(`KonanSymbolsOverDescriptors`)'s state, which is uninitialized at the invocation moment
internal class KonanSymbolsOverDescriptors(
context: PhaseContext,
descriptorsLookup: DescriptorsLookup,
@@ -479,13 +472,88 @@ internal class KonanSymbolsOverDescriptors(
.singleOrNull()
?.let { symbolTable.referenceSimpleFunction(it) }
override fun IrClassSymbol.findMemberProperty(name: Name): IrPropertySymbol? =
descriptor.unsubstitutedMemberScope.getContributedVariables(name, NoLookupLocation.FROM_BACKEND)
.singleOrNull()
?.let { symbolTable.referenceProperty(it) }
override fun IrClassSymbol.findMemberPropertyGetter(name: Name): IrSimpleFunctionSymbol? =
descriptor.unsubstitutedMemberScope.getContributedVariables(name, NoLookupLocation.FROM_BACKEND)
.singleOrNull()
?.getter
?.let { symbolTable.referenceSimpleFunction(it) }
override fun findTopLevelExtensionPropertyGetter(packageName: FqName, name: Name, extensionParameterClassID: ClassId): IrSimpleFunctionSymbol? {
val extensionParameterFqNameString = extensionParameterClassID.asFqNameString()
return descriptorsLookup.builtIns.builtInsModule.getPackage(InteropFqNames.packageName).memberScope
.getContributedVariables(name, NoLookupLocation.FROM_BACKEND)
.singleOrNull {
it.extensionReceiverParameter?.type?.getKotlinTypeFqName(true) == extensionParameterFqNameString
}?.getter
?.let { symbolTable.referenceSimpleFunction(it) }
}
override val interopNativePointedGetRawPointer = symbolTable.referenceSimpleFunction(
descriptorsLookup.interopBuiltIns.getContributedFunctions(InteropFqNames.nativePointedGetRawPointerFunName).single {
val extensionReceiverParameter = it.extensionReceiverParameter
extensionReceiverParameter != null &&
TypeUtils.getClassDescriptor(extensionReceiverParameter.type)?.fqNameUnsafe == InteropFqNames.nativePointed
})
override val interopCValueWrite = symbolTable.referenceSimpleFunction(
descriptorsLookup.interopBuiltIns.getContributedFunctions(InteropFqNames.cValueWriteFunName).single {
it.extensionReceiverParameter?.type?.constructor?.declarationDescriptor?.fqNameSafe == InteropFqNames.cValue
})
override val interopCValueRead = symbolTable.referenceSimpleFunction(
descriptorsLookup.interopBuiltIns.getContributedFunctions(InteropFqNames.cValueReadFunName).single {
it.valueParameters.size == 1
})
override val interopAllocType = symbolTable.referenceSimpleFunction(
descriptorsLookup.interopBuiltIns.getContributedFunctions(InteropFqNames.allocTypeFunName).single {
it.extensionReceiverParameter != null && it.valueParameters.singleOrNull()?.name?.toString() == "type"
})
override val interopCPointerGetRawValue = symbolTable.referenceSimpleFunction(
descriptorsLookup.interopBuiltIns.getContributedFunctions(InteropFqNames.cPointerGetRawValueFunName).single {
val extensionReceiverParameter = it.extensionReceiverParameter
extensionReceiverParameter != null &&
TypeUtils.getClassDescriptor(extensionReceiverParameter.type)?.fqNameUnsafe == InteropFqNames.cPointer
})
override fun findDefaultConstructor(className: String): IrConstructorSymbol = symbolTable.referenceConstructor(
descriptorsLookup.interopBuiltIns.getContributedClass(className)
.unsubstitutedPrimaryConstructor!!
)
override fun findDefaultConstructor(className: String, nestedClassName: String): IrConstructorSymbol = symbolTable.referenceConstructor(
descriptorsLookup.interopBuiltIns.getContributedClass(className)
.defaultType.memberScope.getContributedClass(nestedClassName)
.unsubstitutedPrimaryConstructor!!
)
override val interopGetPtr = descriptorsLookup.interopBuiltIns.getContributedVariables("ptr").single {
val singleTypeParameter = it.typeParameters.singleOrNull()
val singleTypeParameterUpperBound = singleTypeParameter?.upperBounds?.singleOrNull()
val extensionReceiverParameter = it.extensionReceiverParameter
singleTypeParameterUpperBound != null &&
extensionReceiverParameter != null &&
TypeUtils.getClassDescriptor(singleTypeParameterUpperBound)?.fqNameSafe == InteropFqNames.cPointed &&
extensionReceiverParameter.type == singleTypeParameter.defaultType
}.getter!!.let { symbolTable.referenceSimpleFunction(it) }
override val interopManagedGetPtr = descriptorsLookup.interopBuiltIns.getContributedVariables("ptr").single {
val singleTypeParameter = it.typeParameters.singleOrNull()
val singleTypeParameterUpperBound = singleTypeParameter?.upperBounds?.singleOrNull()
val extensionReceiverParameter = it.extensionReceiverParameter
singleTypeParameterUpperBound != null &&
extensionReceiverParameter != null &&
TypeUtils.getClassDescriptor(singleTypeParameterUpperBound)?.fqNameSafe == InteropFqNames.cStructVar &&
TypeUtils.getClassDescriptor(extensionReceiverParameter.type)?.fqNameSafe == InteropFqNames.managedType
}.getter!!.let { symbolTable.referenceSimpleFunction(it) }
}
// WARNING: override protected functions are called from base class(`KonanSymbols`) constructor,
// so its functionality must be independent of the derived object(`KonanSymbolsOverFir`)'s state, which is uninitialized at the invocation moment
internal class KonanSymbolsOverFir(
context: PhaseContext,
descriptorsLookup: DescriptorsLookup,
@@ -496,6 +564,73 @@ internal class KonanSymbolsOverFir(
override fun IrClassSymbol.findMemberSimpleFunction(name: Name): IrSimpleFunctionSymbol? =
owner.findDeclaration<IrSimpleFunction> { it.name == name }?.symbol
override fun IrClassSymbol.findMemberProperty(name: Name): IrPropertySymbol? =
owner.findDeclaration<IrProperty> { it.name == name }?.symbol
override fun IrClassSymbol.findMemberPropertyGetter(name: Name): IrSimpleFunctionSymbol? =
owner.findDeclaration<IrProperty> { it.name == name }?.getter?.symbol
override fun findTopLevelExtensionPropertyGetter(packageName: FqName, name: Name, extensionParameterClassID: ClassId): IrSimpleFunctionSymbol? {
val extensionParameterConeKotlinType = extensionParameterClassID.constructClassLikeType(arrayOf(), false).type
return irBuiltIns.findProperties(name, packageName).singleOrNull {
((it.owner as Fir2IrLazyProperty).fir.receiverParameter?.typeRef as FirResolvedTypeRef).type == extensionParameterConeKotlinType
}?.owner?.getter?.symbol
}
override val interopNativePointedGetRawPointer = findSingleInteropFunction(InteropFqNames.nativePointedGetRawPointerFunName) {
val extensionReceiverParameter = it.owner.extensionReceiverParameter
extensionReceiverParameter != null &&
extensionReceiverParameter.type.classFqName?.toUnsafe() == InteropFqNames.nativePointed
}
override val interopCValueWrite = findSingleInteropFunction(InteropFqNames.cValueWriteFunName) {
it.owner.extensionReceiverParameter?.type?.classFqName == InteropFqNames.cValue
}
override val interopCValueRead = findSingleInteropFunction(InteropFqNames.cValueReadFunName) {
it.owner.valueParameters.size == 1
}
override val interopAllocType = findSingleInteropFunction(InteropFqNames.allocTypeFunName) {
it.owner.extensionReceiverParameter != null && it.owner.valueParameters.singleOrNull()?.name?.toString() == "type"
}
override val interopCPointerGetRawValue = findSingleInteropFunction(InteropFqNames.cPointerGetRawValueFunName) {
it.owner.extensionReceiverParameter?.type?.classFqName?.toUnsafe() == InteropFqNames.cPointer
}
override val interopGetPtr = irBuiltIns.findProperties(Name.identifier("ptr"), InteropFqNames.packageName).single {
val singleTypeParameter = it.owner.getter?.typeParameters?.singleOrNull()
val singleTypeParameterUpperBound = singleTypeParameter?.symbol?.superTypes()?.singleOrNull()
val extensionReceiverParameter = it.owner.getter?.extensionReceiverParameter
singleTypeParameterUpperBound != null &&
extensionReceiverParameter != null &&
singleTypeParameterUpperBound.classFqName == InteropFqNames.cPointed &&
extensionReceiverParameter.type.classFqName == singleTypeParameter.defaultType.classFqName
}.owner.getter!!.symbol
override val interopManagedGetPtr = irBuiltIns.findProperties(Name.identifier("ptr"), InteropFqNames.packageName).single {
val singleTypeParameter = it.owner.getter?.typeParameters?.singleOrNull()
val singleTypeParameterUpperBound = singleTypeParameter?.symbol?.superTypes()?.singleOrNull()
val extensionReceiverParameter = it.owner.getter?.extensionReceiverParameter
singleTypeParameterUpperBound != null &&
extensionReceiverParameter != null &&
singleTypeParameterUpperBound.classFqName == InteropFqNames.cStructVar &&
extensionReceiverParameter.type.classFqName == InteropFqNames.managedType
}.owner.getter!!.symbol
private fun findSingleInteropFunction(name: String, predicate: (IrSimpleFunctionSymbol) -> Boolean) =
irBuiltIns.findFunctions(Name.identifier(name), InteropFqNames.packageName).single(predicate)
override fun findDefaultConstructor(className: String): IrConstructorSymbol =
interopClass(className).owner.declarations.single {
it is IrConstructor && it.isPrimary
}.symbol as IrConstructorSymbol
override fun findDefaultConstructor(className: String, nestedClassName: String): IrConstructorSymbol {
val nested = interopClass(className).owner.declarations.single {
it is IrClass && it.name == Name.identifier(nestedClassName)
}.symbol as IrClassSymbol
return nested.owner.declarations.single {
it is IrConstructor && it.isPrimary
}.symbol as IrConstructorSymbol
}
}