Native: port native to the new IrBuiltIns
This commit is contained in:
committed by
TeamCityServer
parent
48a3c64901
commit
cb4999f23c
+4
-4
@@ -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 ->
|
||||
|
||||
+7
-5
@@ -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!!)
|
||||
|
||||
+1
-2
@@ -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
|
||||
|
||||
+7
-5
@@ -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,
|
||||
|
||||
-2
@@ -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
|
||||
|
||||
+63
-120
@@ -14,15 +14,15 @@ import org.jetbrains.kotlin.backend.konan.descriptors.kotlinNativeInternal
|
||||
import org.jetbrains.kotlin.backend.konan.llvm.findMainEntryPoint
|
||||
import org.jetbrains.kotlin.backend.konan.lower.TestProcessor
|
||||
import org.jetbrains.kotlin.builtins.StandardNames
|
||||
import org.jetbrains.kotlin.builtins.UnsignedType
|
||||
import org.jetbrains.kotlin.config.coroutinesIntrinsicsPackageFqName
|
||||
import org.jetbrains.kotlin.config.coroutinesPackageFqName
|
||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
|
||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||
@@ -37,7 +37,6 @@ import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.calls.components.isVararg
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
import kotlin.properties.Delegates
|
||||
@@ -56,17 +55,16 @@ internal class KonanSymbols(
|
||||
context: Context,
|
||||
irBuiltIns: IrBuiltIns,
|
||||
private val symbolTable: SymbolTable,
|
||||
lazySymbolTable: ReferenceSymbolTable,
|
||||
val functionIrClassFactory: BuiltInFictitiousFunctionIrClassFactory
|
||||
lazySymbolTable: ReferenceSymbolTable
|
||||
): Symbols<Context>(context, irBuiltIns, symbolTable) {
|
||||
|
||||
val entryPoint = findMainEntryPoint(context)?.let { symbolTable.referenceSimpleFunction(it) }
|
||||
|
||||
override val externalSymbolTable = lazySymbolTable
|
||||
|
||||
val nothing = symbolTable.referenceClass(builtIns.nothing)
|
||||
val throwable = symbolTable.referenceClass(builtIns.throwable)
|
||||
val enum = symbolTable.referenceClass(builtIns.enum)
|
||||
val nothing get() = irBuiltIns.nothingClass
|
||||
val throwable get() = irBuiltIns.throwableClass
|
||||
val enum get() = irBuiltIns.enumClass
|
||||
val nativePtr = symbolTable.referenceClass(context.nativePtr)
|
||||
val nativePointed = symbolTable.referenceClass(context.interopBuiltIns.nativePointed)
|
||||
val nativePtrType = nativePtr.typeWith(arguments = emptyList())
|
||||
@@ -75,15 +73,8 @@ internal class KonanSymbols(
|
||||
|
||||
val immutableBlobOf = symbolTable.referenceSimpleFunction(context.immutableBlobOf)
|
||||
|
||||
private fun unsignedClass(unsignedType: UnsignedType): IrClassSymbol = classById(unsignedType.classId)
|
||||
|
||||
override val uByte = unsignedClass(UnsignedType.UBYTE)
|
||||
override val uShort = unsignedClass(UnsignedType.USHORT)
|
||||
override val uInt = unsignedClass(UnsignedType.UINT)
|
||||
override val uLong = unsignedClass(UnsignedType.ULONG)
|
||||
|
||||
val signedIntegerClasses = setOf(byte, short, int, long)
|
||||
val unsignedIntegerClasses = setOf(uByte, uShort, uInt, uLong)
|
||||
val unsignedIntegerClasses = setOf(uByte!!, uShort!!, uInt!!, uLong!!)
|
||||
|
||||
val allIntegerClasses = signedIntegerClasses + unsignedIntegerClasses
|
||||
|
||||
@@ -93,29 +84,26 @@ internal class KonanSymbols(
|
||||
uShort -> short
|
||||
uInt -> int
|
||||
uLong -> long
|
||||
else -> error(it.descriptor)
|
||||
else -> error(it.toString())
|
||||
}
|
||||
}
|
||||
|
||||
val integerConversions = allIntegerClasses.flatMap { fromClass ->
|
||||
allIntegerClasses.map { toClass ->
|
||||
val name = Name.identifier("to${toClass.descriptor.name.asString().replaceFirstChar(Char::uppercaseChar)}")
|
||||
val descriptor = if (fromClass in signedIntegerClasses && toClass in unsignedIntegerClasses) {
|
||||
builtInsPackage("kotlin")
|
||||
.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND)
|
||||
val symbol = if (fromClass in signedIntegerClasses && toClass in unsignedIntegerClasses) {
|
||||
irBuiltIns.findFunctions(name, "kotlin")
|
||||
.single {
|
||||
it.dispatchReceiverParameter == null &&
|
||||
it.extensionReceiverParameter?.type == fromClass.descriptor.defaultType &&
|
||||
it.valueParameters.isEmpty()
|
||||
it.descriptor.dispatchReceiverParameter == null &&
|
||||
it.descriptor.extensionReceiverParameter?.type == fromClass.descriptor.defaultType &&
|
||||
it.descriptor.valueParameters.isEmpty()
|
||||
}
|
||||
} else {
|
||||
fromClass.descriptor.unsubstitutedMemberScope
|
||||
.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND)
|
||||
irBuiltIns.findBuiltInClassMemberFunctions(fromClass, name)
|
||||
.single {
|
||||
it.extensionReceiverParameter == null && it.valueParameters.isEmpty()
|
||||
it.descriptor.extensionReceiverParameter == null && it.descriptor.valueParameters.isEmpty()
|
||||
}
|
||||
}
|
||||
val symbol = symbolTable.referenceSimpleFunction(descriptor)
|
||||
|
||||
(fromClass to toClass) to symbol
|
||||
}
|
||||
@@ -242,23 +230,13 @@ internal class KonanSymbols(
|
||||
it to internalFunction("getCached${it.name.lowercase().replaceFirstChar(Char::uppercaseChar)}Box")
|
||||
}
|
||||
|
||||
val immutableBlob = symbolTable.referenceClass(
|
||||
builtInsPackage("kotlin", "native").getContributedClassifier(
|
||||
Name.identifier("ImmutableBlob"), NoLookupLocation.FROM_BACKEND
|
||||
) as ClassDescriptor
|
||||
)
|
||||
val immutableBlob = irBuiltIns.findClass(Name.identifier("ImmutableBlob"), "kotlin", "native")!!
|
||||
|
||||
val executeImpl = symbolTable.referenceSimpleFunction(
|
||||
builtIns.builtInsModule.getPackage(FqName("kotlin.native.concurrent")).memberScope
|
||||
.getContributedFunctions(Name.identifier("executeImpl"), NoLookupLocation.FROM_BACKEND)
|
||||
.single()
|
||||
)
|
||||
val executeImpl =
|
||||
irBuiltIns.findFunctions(Name.identifier("executeImpl"),"kotlin", "native", "concurrent").single()
|
||||
|
||||
val createCleaner = symbolTable.referenceSimpleFunction(
|
||||
builtIns.builtInsModule.getPackage(FqName("kotlin.native.internal")).memberScope
|
||||
.getContributedFunctions(Name.identifier("createCleaner"), NoLookupLocation.FROM_BACKEND)
|
||||
.single()
|
||||
)
|
||||
val createCleaner =
|
||||
irBuiltIns.findFunctions(Name.identifier("createCleaner"),"kotlin", "native", "internal").single()
|
||||
|
||||
val areEqualByValue = context.getKonanInternalFunctions("areEqualByValue").map {
|
||||
symbolTable.referenceSimpleFunction(it)
|
||||
@@ -297,11 +275,7 @@ internal class KonanSymbols(
|
||||
|
||||
override val throwUninitializedPropertyAccessException = internalFunction("ThrowUninitializedPropertyAccessException")
|
||||
|
||||
override val stringBuilder = symbolTable.referenceClass(
|
||||
builtInsPackage("kotlin", "text").getContributedClassifier(
|
||||
Name.identifier("StringBuilder"), NoLookupLocation.FROM_BACKEND
|
||||
) as ClassDescriptor
|
||||
)
|
||||
override val stringBuilder = irBuiltIns.findClass(Name.identifier("StringBuilder"),"kotlin", "text")!!
|
||||
|
||||
override val defaultConstructorMarker = symbolTable.referenceClass(
|
||||
context.getKonanInternalClass("DefaultConstructorMarker")
|
||||
@@ -312,29 +286,21 @@ internal class KonanSymbols(
|
||||
val getProgressionLast = context.getKonanInternalFunctions("getProgressionLast")
|
||||
.map { Pair(it.returnType, symbolTable.referenceSimpleFunction(it)) }.toMap()
|
||||
|
||||
val arrayContentToString = arrays.associateBy(
|
||||
{ it },
|
||||
{ findArrayExtension(it.descriptor, "contentToString") }
|
||||
)
|
||||
val arrayContentHashCode = arrays.associateBy(
|
||||
{ it },
|
||||
{ findArrayExtension(it.descriptor, "contentHashCode") }
|
||||
)
|
||||
val arrayContentToString = arrays.associateBy({ it }, { findArrayExtension(it, "contentToString") })
|
||||
|
||||
private val kotlinCollectionsPackageScope: MemberScope
|
||||
get() = builtInsPackage("kotlin", "collections")
|
||||
val arrayContentHashCode = arrays.associateBy({ it }, { findArrayExtension(it, "contentHashCode") })
|
||||
|
||||
private fun findArrayExtension(classSymbol: IrClassSymbol, name: String): IrSimpleFunctionSymbol =
|
||||
irBuiltIns.findFunctions(Name.identifier(name), "kotlin", "collections")
|
||||
.singleOrNull {
|
||||
it.descriptor.let {
|
||||
it.valueParameters.isEmpty()
|
||||
&& it.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == classSymbol.descriptor
|
||||
&& it.extensionReceiverParameter?.type?.isMarkedNullable == false
|
||||
&& !it.isExpect
|
||||
}
|
||||
} ?: error(classSymbol.toString())
|
||||
|
||||
private fun findArrayExtension(descriptor: ClassDescriptor, name: String): IrSimpleFunctionSymbol {
|
||||
val functionDescriptor = kotlinCollectionsPackageScope
|
||||
.getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND)
|
||||
.singleOrNull {
|
||||
it.valueParameters.isEmpty()
|
||||
&& it.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == descriptor
|
||||
&& it.extensionReceiverParameter?.type?.isMarkedNullable == false
|
||||
&& !it.isExpect
|
||||
} ?: error(descriptor.toString())
|
||||
return symbolTable.referenceSimpleFunction(functionDescriptor)
|
||||
}
|
||||
|
||||
fun getNoParamFunction(name: Name, receiverType: KotlinType): IrFunctionSymbol {
|
||||
val descriptor = receiverType.memberScope.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND)
|
||||
@@ -343,14 +309,12 @@ internal class KonanSymbols(
|
||||
}
|
||||
|
||||
val copyInto = arrays.map { symbol ->
|
||||
val packageViewDescriptor = builtIns.builtInsModule.getPackage(StandardNames.COLLECTIONS_PACKAGE_FQ_NAME)
|
||||
val functionDescriptor = packageViewDescriptor.memberScope
|
||||
.getContributedFunctions(Name.identifier("copyInto"), NoLookupLocation.FROM_BACKEND)
|
||||
val funSymbol = irBuiltIns.findFunctions(Name.identifier("copyInto"), StandardNames.COLLECTIONS_PACKAGE_FQ_NAME)
|
||||
.single {
|
||||
!it.isExpect &&
|
||||
it.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == symbol.descriptor
|
||||
!it.descriptor.isExpect &&
|
||||
it.descriptor.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == symbol.descriptor
|
||||
}
|
||||
symbol.descriptor to symbolTable.referenceSimpleFunction(functionDescriptor)
|
||||
symbol to funSymbol
|
||||
}.toMap()
|
||||
|
||||
val arrayGet = arrays.associateWith { it.descriptor.unsubstitutedMemberScope
|
||||
@@ -375,19 +339,13 @@ internal class KonanSymbols(
|
||||
|
||||
val initInstance = internalFunction("initInstance")
|
||||
|
||||
val freeze = symbolTable.referenceSimpleFunction(
|
||||
builtInsPackage("kotlin", "native", "concurrent").getContributedFunctions(
|
||||
Name.identifier("freeze"), NoLookupLocation.FROM_BACKEND).single())
|
||||
val freeze = irBuiltIns.findFunctions(Name.identifier("freeze"), "kotlin", "native", "concurrent").single()
|
||||
|
||||
val println = symbolTable.referenceSimpleFunction(
|
||||
builtInsPackage("kotlin", "io").getContributedFunctions(
|
||||
Name.identifier("println"), NoLookupLocation.FROM_BACKEND)
|
||||
.single { it.valueParameters.singleOrNull()?.type == builtIns.stringType })
|
||||
val println = irBuiltIns.findFunctions(Name.identifier("println"), "kotlin", "io")
|
||||
.single { it.descriptor.valueParameters.singleOrNull()?.type == (irBuiltIns as IrBuiltInsOverDescriptors).builtIns.stringType }
|
||||
|
||||
val anyNToString = symbolTable.referenceSimpleFunction(
|
||||
builtInsPackage("kotlin").getContributedFunctions(
|
||||
Name.identifier("toString"), NoLookupLocation.FROM_BACKEND)
|
||||
.single { it.extensionReceiverParameter?.type == builtIns.nullableAnyType})
|
||||
val anyNToString = irBuiltIns.findFunctions(Name.identifier("toString"))
|
||||
.single { it.descriptor.extensionReceiverParameter?.type == (irBuiltIns as IrBuiltInsOverDescriptors).builtIns.nullableAnyType }
|
||||
|
||||
override val getContinuation = internalFunction("getContinuation")
|
||||
|
||||
@@ -413,11 +371,13 @@ internal class KonanSymbols(
|
||||
|
||||
override val coroutineImpl get() = TODO()
|
||||
|
||||
val baseContinuationImpl = topLevelClass("kotlin.coroutines.native.internal.BaseContinuationImpl")
|
||||
val baseContinuationImpl =
|
||||
irBuiltIns.findClass(Name.identifier("BaseContinuationImpl"), "kotlin", "coroutines", "native", "internal")!!
|
||||
|
||||
val restrictedContinuationImpl = topLevelClass("kotlin.coroutines.native.internal.RestrictedContinuationImpl")
|
||||
val restrictedContinuationImpl =
|
||||
irBuiltIns.findClass(Name.identifier("RestrictedContinuationImpl"), "kotlin", "coroutines", "native", "internal")!!
|
||||
|
||||
val continuationImpl = topLevelClass("kotlin.coroutines.native.internal.ContinuationImpl")
|
||||
val continuationImpl = irBuiltIns.findClass(Name.identifier("ContinuationImpl"), "kotlin", "coroutines", "native", "internal")!!
|
||||
|
||||
val invokeSuspendFunction =
|
||||
symbolTable.referenceSimpleFunction(
|
||||
@@ -434,15 +394,12 @@ internal class KonanSymbols(
|
||||
|
||||
val cancellationException = topLevelClass(KonanFqNames.cancellationException)
|
||||
|
||||
val kotlinResult = topLevelClass("kotlin.Result")
|
||||
val kotlinResult = irBuiltIns.findClass(Name.identifier("Result"))!!
|
||||
|
||||
val kotlinResultGetOrThrow = symbolTable.referenceSimpleFunction(
|
||||
builtInsPackage("kotlin")
|
||||
.getContributedFunctions(Name.identifier("getOrThrow"), NoLookupLocation.FROM_BACKEND)
|
||||
.single {
|
||||
it.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == kotlinResult.descriptor
|
||||
}
|
||||
)
|
||||
val kotlinResultGetOrThrow = irBuiltIns.findFunctions(Name.identifier("getOrThrow"))
|
||||
.single {
|
||||
it.descriptor.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == kotlinResult.descriptor
|
||||
}
|
||||
|
||||
override val functionAdapter = symbolTable.referenceClass(context.getKonanInternalClass("FunctionAdapter"))
|
||||
|
||||
@@ -512,17 +469,12 @@ internal class KonanSymbols(
|
||||
)
|
||||
}
|
||||
|
||||
val emptyList = symbolTable.referenceSimpleFunction(
|
||||
kotlinCollectionsPackageScope
|
||||
.getContributedFunctions(Name.identifier("emptyList"), NoLookupLocation.FROM_BACKEND)
|
||||
.single { it.valueParameters.isEmpty() }
|
||||
)
|
||||
val emptyList = irBuiltIns.findFunctions(Name.identifier("emptyList"), "kotlin", "collections")
|
||||
.single { it.descriptor.valueParameters.isEmpty() }
|
||||
|
||||
val listOf = irBuiltIns.findFunctions(Name.identifier("listOf"), "kotlin", "collections")
|
||||
.single { it.descriptor.valueParameters.size == 1 && it.descriptor.valueParameters[0].isVararg }
|
||||
|
||||
val listOf = symbolTable.referenceSimpleFunction(
|
||||
kotlinCollectionsPackageScope
|
||||
.getContributedFunctions(Name.identifier("listOf"), NoLookupLocation.FROM_BACKEND)
|
||||
.single { it.valueParameters.size == 1 && it.valueParameters[0].isVararg }
|
||||
)
|
||||
val listOfInternal = internalFunction("listOfInternal")
|
||||
|
||||
val threadLocal = symbolTable.referenceClass(
|
||||
@@ -533,10 +485,7 @@ internal class KonanSymbols(
|
||||
context.builtIns.builtInsModule.findClassAcrossModuleDependencies(
|
||||
ClassId.topLevel(KonanFqNames.sharedImmutable))!!)
|
||||
|
||||
private fun topLevelClass(fqName: String): IrClassSymbol = topLevelClass(FqName(fqName))
|
||||
private fun topLevelClass(fqName: FqName): IrClassSymbol = classById(ClassId.topLevel(fqName))
|
||||
private fun classById(classId: ClassId): IrClassSymbol =
|
||||
symbolTable.referenceClass(builtIns.builtInsModule.findClassAcrossModuleDependencies(classId)!!)
|
||||
private fun topLevelClass(fqName: FqName): IrClassSymbol = irBuiltIns.findClass(fqName.shortName(), fqName.parent())!!
|
||||
|
||||
private fun internalFunction(name: String): IrSimpleFunctionSymbol =
|
||||
symbolTable.referenceSimpleFunction(context.getKonanInternalFunctions(name).single())
|
||||
@@ -544,10 +493,8 @@ internal class KonanSymbols(
|
||||
private fun internalClass(name: String): IrClassSymbol =
|
||||
symbolTable.referenceClass(context.getKonanInternalClass(name))
|
||||
|
||||
private fun getKonanTestClass(className: String) = symbolTable.referenceClass(
|
||||
builtInsPackage("kotlin", "native", "internal", "test").getContributedClassifier(
|
||||
Name.identifier(className), NoLookupLocation.FROM_BACKEND
|
||||
) as ClassDescriptor)
|
||||
private fun getKonanTestClass(className: String) =
|
||||
irBuiltIns.findClass(Name.identifier(className), "kotlin", "native", "internal", "test")!!
|
||||
|
||||
private fun interopFunction(name: String) = symbolTable.referenceSimpleFunction(
|
||||
context.interopBuiltIns.packageScope
|
||||
@@ -560,13 +507,9 @@ internal class KonanSymbols(
|
||||
.getContributedClassifier(Name.identifier(name), NoLookupLocation.FROM_BACKEND) as ClassDescriptor
|
||||
)
|
||||
|
||||
override fun functionN(n: Int) = functionIrClassFactory.functionN(n).symbol
|
||||
fun kFunctionN(n: Int) = irBuiltIns.kFunctionN(n).symbol
|
||||
|
||||
override fun suspendFunctionN(n: Int) = functionIrClassFactory.suspendFunctionN(n).symbol
|
||||
|
||||
fun kFunctionN(n: Int) = functionIrClassFactory.kFunctionN(n).symbol
|
||||
|
||||
fun kSuspendFunctionN(n: Int) = functionIrClassFactory.kSuspendFunctionN(n).symbol
|
||||
fun kSuspendFunctionN(n: Int) = irBuiltIns.kSuspendFunctionN(n).symbol
|
||||
|
||||
fun getKFunctionType(returnType: IrType, parameterTypes: List<IrType>) =
|
||||
kFunctionN(parameterTypes.size).typeWith(parameterTypes + returnType)
|
||||
|
||||
+3
-2
@@ -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()
|
||||
|
||||
+2
-2
@@ -30,8 +30,8 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
context.irBuiltIns.byteClass, context.irBuiltIns.shortClass, context.irBuiltIns.intClass,
|
||||
context.irBuiltIns.longClass,
|
||||
context.irBuiltIns.floatClass,context.irBuiltIns.doubleClass) +
|
||||
context.ir.symbols.primitiveArrays +
|
||||
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) {
|
||||
|
||||
+17
-8
@@ -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() {
|
||||
|
||||
+5
-2
@@ -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)
|
||||
|
||||
+9
-4
@@ -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 {
|
||||
|
||||
+1
-3
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user