[K/N] Remove module-wide ObsoleteDescriptorBasedApi opt-in

This commit is contained in:
Pavel Kunyavskiy
2023-06-05 18:58:18 +02:00
committed by Space Team
parent 046b629baa
commit cd3237295b
43 changed files with 166 additions and 139 deletions
@@ -169,11 +169,6 @@ fun IrMemberAccessExpression<*>.addArguments(args: Map<ParameterDescriptor, IrEx
}
}
@ObsoleteDescriptorBasedAPI
@Suppress("unused") // Used in kotlin-native
fun IrMemberAccessExpression<*>.addArguments(args: List<Pair<ParameterDescriptor, IrExpression>>) =
this.addArguments(args.toMap())
fun IrExpression.isNullConst() = this is IrConst<*> && this.kind == IrConstKind.Null
fun IrExpression.isTrueConst() = this is IrConst<*> && this.kind == IrConstKind.Boolean && this.value == true
@@ -36,7 +36,6 @@ compileCompilerKotlin {
kotlinOptions.jvmTarget = "1.8"
kotlinOptions.freeCompilerArgs += [
'-opt-in=kotlin.RequiresOptIn',
'-opt-in=org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI',
"-opt-in=kotlinx.cinterop.BetaInteropApi",
"-opt-in=kotlinx.cinterop.ExperimentalForeignApi",
'-Xskip-prerelease-check']
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.*
import org.jetbrains.kotlin.ir.descriptors.IrAbstractDescriptorBasedFunctionFactory
@@ -34,10 +35,12 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
internal object DECLARATION_ORIGIN_FUNCTION_CLASS : IrDeclarationOriginImpl("DECLARATION_ORIGIN_FUNCTION_CLASS")
@OptIn(ObsoleteDescriptorBasedAPI::class)
val IrPackageFragment.isFunctionInterfaceFile get() = packageFragmentDescriptor is FunctionInterfacePackageFragment
abstract class KonanIrAbstractDescriptorBasedFunctionFactory : IrProvider, IrAbstractDescriptorBasedFunctionFactory()
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class LazyIrFunctionFactory(
private val symbolTable: SymbolTable,
private val stubGenerator: DeclarationStubGenerator,
@@ -90,6 +93,7 @@ internal class LazyIrFunctionFactory(
builtClassesMap.getOrPut(descriptor) { createClass(descriptor, declarator) }
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class BuiltInFictitiousFunctionIrClassFactory(
private val symbolTable: SymbolTable,
private val irBuiltIns: IrBuiltInsOverDescriptors,
@@ -6,11 +6,12 @@
package org.jetbrains.kotlin.backend.konan
import org.jetbrains.kotlin.backend.common.atMostOne
import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary
import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibrary
import org.jetbrains.kotlin.backend.konan.llvm.FunctionOrigin
import org.jetbrains.kotlin.backend.konan.llvm.llvmSymbolOrigin
import org.jetbrains.kotlin.backend.konan.llvm.standardLlvmSymbolsOrigin
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.util.getPackageFragment
import org.jetbrains.kotlin.konan.library.KonanLibrary
@@ -116,13 +117,13 @@ internal class DependenciesTrackerImpl(
return if (packageFragment.isFunctionInterfaceFile)
FileOrigin.StdlibKFunctionImpl
else {
val library = when (val origin = packageFragment.packageFragmentDescriptor.llvmSymbolOrigin) {
val library = when (val origin = packageFragment.llvmSymbolOrigin) {
CurrentKlibModuleOrigin -> config.libraryToCache?.klib?.takeIf { config.producePerFileCache }
else -> (origin as DeserializedKlibModuleOrigin).library
}
when {
library == null -> FileOrigin.CurrentFile
packageFragment.packageFragmentDescriptor.containingDeclaration.isFromInteropLibrary() ->
packageFragment.isFromInteropLibrary() ->
FileOrigin.EntireModule(library)
else -> FileOrigin.CertainFile(library, packageFragment.packageFqName.asString(), filePathGetter())
}
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.backend.konan
import org.jetbrains.kotlin.backend.konan.ir.konanLibrary
import org.jetbrains.kotlin.builtins.FunctionInterfacePackageFragment
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.util.fileOrNull
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.konan.ir.parentDeclarationsWithSelf
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.IrBasedClassConstructorDescriptor
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
@@ -180,7 +181,7 @@ private fun IrSimpleFunction.getObjCMethodInfo(onlyExternal: Boolean): ObjCMetho
}
return overriddenSymbols.firstNotNullOfOrNull {
assert(it.owner != this) { "Function ${it.owner.descriptor.fqNameSafe}() is wrongly contained in its own overriddenSymbols"}
assert(it.owner != this) { "Function ${it.owner.fqNameWhenAvailable}() is wrongly contained in its own overriddenSymbols"}
it.owner.getObjCMethodInfo(onlyExternal)
}
}
@@ -290,6 +291,7 @@ fun IrConstructor.getObjCInitMethod(): IrSimpleFunction? {
}
}
@ObsoleteDescriptorBasedAPI
fun ConstructorDescriptor.getObjCInitMethod(): FunctionDescriptor? {
if (this is IrBasedClassConstructorDescriptor) {
// E.g. in case of K2.
@@ -341,13 +343,13 @@ fun inferObjCSelector(descriptor: FunctionDescriptor): String = if (descriptor.v
}
}
fun ClassDescriptor.getExternalObjCClassBinaryName(): String =
fun IrClass.getExternalObjCClassBinaryName(): String =
this.getExplicitExternalObjCClassBinaryName()
?: this.name.asString()
fun ClassDescriptor.getExternalObjCMetaClassBinaryName(): String =
fun IrClass.getExternalObjCMetaClassBinaryName(): String =
this.getExplicitExternalObjCClassBinaryName()
?: this.name.asString().removeSuffix("Meta")
private fun ClassDescriptor.getExplicitExternalObjCClassBinaryName() =
this.annotations.findAnnotation(externalObjCClassFqName)!!.getStringValueOrNull("binaryName")
private fun IrClass.getExplicitExternalObjCClassBinaryName() =
this.annotations.findAnnotation(externalObjCClassFqName)!!.getAnnotationValueOrNull<String>("binaryName")
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
import org.jetbrains.kotlin.ir.linkage.partial.partialLinkageConfig
@@ -46,6 +47,7 @@ object KonanStubGeneratorExtensions : StubGeneratorExtensions() {
}
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal fun PsiToIrContext.psiToIr(
input: PsiToIrInput,
useLinkerWhenProducingLibrary: Boolean
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys.USE_FIR
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.util.referenceFunction
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
@@ -119,6 +120,7 @@ internal class ExportedElementScope(val kind: ScopeKind, val name: String) {
}
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class ExportedElement(
val kind: ElementKind,
val scope: ExportedElementScope,
@@ -36,7 +36,6 @@ import org.jetbrains.kotlin.konan.target.Family
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext.getClassFqNameUnsafe
import org.jetbrains.kotlin.util.OperatorNameConventions
internal interface KotlinStubs {
@@ -417,8 +416,7 @@ internal fun KotlinStubs.generateObjCCall(
}
internal fun IrBuilderWithScope.getObjCClass(symbols: KonanSymbols, symbol: IrClassSymbol): IrExpression {
val classDescriptor = symbol.descriptor
require(!classDescriptor.isObjCMetaClass())
require(!symbol.owner.isObjCMetaClass())
return irCall(symbols.interopGetObjCClass, symbols.nativePtrType, listOf(symbol.starProjectedType))
}
@@ -553,7 +551,7 @@ internal fun KotlinStubs.generateCFunctionPointer(
)
addKotlin(fakeFunction)
return IrFunctionReferenceImpl.fromSymbolDescriptor(
return IrFunctionReferenceImpl.fromSymbolOwner(
expression.startOffset,
expression.endOffset,
expression.type,
@@ -10,6 +10,7 @@ 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.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization
@@ -32,6 +33,7 @@ internal fun IrType.isCEnumType(): Boolean {
private val cCall = RuntimeNames.cCall
// Make sure external stubs always get proper annotaions.
@OptIn(ObsoleteDescriptorBasedAPI::class)
fun IrDeclaration.hasCCallAnnotation(name: String): Boolean =
this.annotations.hasAnnotation(cCall.child(Name.identifier(name)))
// LazyIr doesn't pass annotations from descriptor to IrValueParameter.
@@ -370,7 +370,7 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context) {
fun vtableIndex(function: IrSimpleFunction): Int {
val bridgeDirections = function.target.bridgeDirectionsTo(function)
val index = vtableEntries.indexOfFirst { it.function == function && it.bridgeDirections == bridgeDirections }
if (index < 0) throw Error(function.render() + " $function " + " (${function.symbol.descriptor}) not in vtable of " + irClass.render())
require(index >= 0) { "${function.render()} is not found in vtable of ${irClass.render()}" }
return index
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.konan.ir
import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.backend.konan.llvm.llvmSymbolOrigin
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.toKotlinType
@@ -15,7 +16,7 @@ import org.jetbrains.kotlin.ir.util.getPackageFragment
// This file contains some IR utilities which actually use descriptors.
// TODO: port this code to IR.
internal val IrDeclaration.llvmSymbolOrigin get() = getPackageFragment().packageFragmentDescriptor.llvmSymbolOrigin
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal fun IrType.isObjCObjectType() = this.toKotlinType().isObjCObjectType()
@@ -9,11 +9,13 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
@ObsoleteDescriptorBasedAPI
class ModuleIndex(val module: IrModuleFragment) {
/**
@@ -8,14 +8,15 @@ package org.jetbrains.kotlin.backend.konan.ir
import org.jetbrains.kotlin.backend.common.atMostOne
import org.jetbrains.kotlin.backend.konan.DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION
import org.jetbrains.kotlin.backend.konan.descriptors.allOverriddenFunctions
import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary
import org.jetbrains.kotlin.backend.konan.llvm.KonanMetadata
import org.jetbrains.kotlin.backend.konan.serialization.KonanFileMetadataSource
import org.jetbrains.kotlin.backend.konan.serialization.KonanIrModuleFragmentImpl
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyDeclarationBase
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
@@ -47,10 +48,6 @@ fun IrClass.isNothing() = this.isClassTypeWithSignature(IdSignatureValues.nothin
fun IrClass.getSuperInterfaces() = this.superClasses.map { it.owner }.filter { it.isInterface }
// Note: psi2ir doesn't set `origin = FAKE_OVERRIDE` for fields and properties yet.
val IrProperty.isReal: Boolean get() = this.descriptor.kind.isReal
val IrField.isReal: Boolean get() = this.descriptor.kind.isReal
fun IrClass.isSpecialClassWithNoSupertypes() = this.isAny() || this.isNothing()
inline fun <reified T> IrDeclaration.getAnnotationArgumentValue(fqName: FqName, argumentName: String): T? {
@@ -105,22 +102,30 @@ private fun IrClass.getOverridingOf(function: IrFunction) = (function as? IrSimp
val ModuleDescriptor.konanLibrary get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library
val IrModuleFragment.konanLibrary
get() = (this as? KonanIrModuleFragmentImpl)?.konanLibrary ?: descriptor.konanLibrary
val IrPackageFragment.konanLibrary
get() = if (this is IrFile)
this.konanLibrary
else
this.packageFragmentDescriptor.containingDeclaration.konanLibrary
val IrFile.konanLibrary
get() = (metadata as? KonanFileMetadataSource)?.module?.konanLibrary ?: packageFragmentDescriptor.containingDeclaration.konanLibrary
@OptIn(ObsoleteDescriptorBasedAPI::class)
val IrPackageFragment.konanLibrary : KotlinLibrary?
get() {
if (this is IrFile) {
(metadata as? KonanFileMetadataSource)?.module?.konanLibrary?.let { return it }
}
return this.packageFragmentDescriptor.containingDeclaration.konanLibrary
}
val IrDeclaration.konanLibrary: KotlinLibrary?
get() {
((this as? IrMetadataSourceOwner)?.metadata as? KonanMetadata)?.let { return it.konanLibrary }
return when (val parent = parent) {
is IrFile -> parent.konanLibrary
is IrPackageFragment -> parent.packageFragmentDescriptor.containingDeclaration.konanLibrary
is IrPackageFragment -> parent.konanLibrary
is IrDeclaration -> parent.konanLibrary
else -> TODO("Unexpected declaration parent: $parent")
}
}
fun IrDeclaration.isFromInteropLibrary() = konanLibrary?.isInteropLibrary() == true
fun IrPackageFragment.isFromInteropLibrary() = konanLibrary?.isInteropLibrary() == true
/**
* This function should be equivalent to [IrDeclaration.isFromInteropLibrary], but in fact it is not for declarations
* from Fir modules. This should be fixed in the future.
*/
@ObsoleteDescriptorBasedAPI
fun IrDeclaration.isFromInteropLibraryByDescriptor() = descriptor.isFromInteropLibrary()
@@ -8,6 +8,7 @@ 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
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.IrBuilder
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
@@ -30,6 +31,7 @@ internal inline fun <reified T: DeclarationDescriptor> ClassDescriptor.findDecla
* Provides a set of functions and properties that helps
* to translate descriptor declarations to corresponding IR.
*/
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal interface DescriptorToIrTranslationMixin {
val symbolTable: SymbolTable
@@ -161,6 +163,7 @@ internal fun ClassDescriptor.inheritsFromCStructVar(): Boolean =
* This function checks that given symbol located in subtree of
* CEnum inheritor.
*/
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal fun IrSymbol.findCEnumDescriptor(): ClassDescriptor? =
descriptor.findCEnumDescriptor()
@@ -172,6 +175,7 @@ internal fun DeclarationDescriptor.findCEnumDescriptor(): ClassDescriptor? =
* This function checks that given symbol located in subtree of
* CStructVar inheritor.
*/
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal fun IrSymbol.findCStructDescriptor(): ClassDescriptor? =
descriptor.findCStructDescriptor()
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.cenum.CEnumVarClassGenerato
import org.jetbrains.kotlin.backend.konan.ir.interop.cstruct.CStructVarClassGenerator
import org.jetbrains.kotlin.backend.konan.ir.interop.cstruct.CStructVarCompanionGenerator
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.util.*
@@ -31,6 +32,7 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
* 2. It is an easier and more obvious approach. Since implementation of metadata-based
* libraries generation already took too much time we take an easier approach here.
*/
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class IrProviderForCEnumAndCStructStubs(
context: GeneratorContext,
symbols: KonanSymbols
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.DescriptorToIrTranslationMi
import org.jetbrains.kotlin.backend.konan.ir.interop.findDeclarationByName
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFunction
@@ -24,6 +25,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
/**
* Generate IR for function that returns appropriate enum entry for the provided integral value.
*/
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class CEnumByValueFunctionGenerator(
context: GeneratorContext,
private val symbols: KonanSymbols
@@ -13,6 +13,7 @@ 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.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrExpression
@@ -40,6 +41,7 @@ private val cEnumEntryValueTypes = setOf(
"UByte", "UShort", "UInt", "ULong"
)
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class CEnumClassGenerator(
val context: GeneratorContext,
private val cEnumCompanionGenerator: CEnumCompanionGenerator,
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.irInstanceInitializer
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.irBlockBody
import org.jetbrains.kotlin.ir.builders.irReturn
import org.jetbrains.kotlin.ir.declarations.*
@@ -24,6 +25,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
private val cEnumEntryAliasAnnonation = FqName("kotlinx.cinterop.internal.CEnumEntryAlias")
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class CEnumCompanionGenerator(
context: GeneratorContext,
private val cEnumByValueFunctionGenerator: CEnumByValueFunctionGenerator
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.irInstanceInitializer
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.irBlockBody
import org.jetbrains.kotlin.ir.builders.irGet
import org.jetbrains.kotlin.ir.builders.irInt
@@ -29,6 +30,7 @@ import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
private val typeSizeAnnotation = FqName("kotlinx.cinterop.internal.CEnumVarTypeSize")
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class CEnumVarClassGenerator(
context: GeneratorContext,
private val symbols: KonanSymbols
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.DescriptorToIrTranslationMi
import org.jetbrains.kotlin.backend.konan.ir.interop.irInstanceInitializer
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
@@ -26,6 +27,7 @@ import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class CStructVarClassGenerator(
context: GeneratorContext,
private val companionGenerator: CStructVarCompanionGenerator,
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.irBlockBody
import org.jetbrains.kotlin.ir.builders.irInt
import org.jetbrains.kotlin.ir.builders.irLong
@@ -27,6 +28,7 @@ import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
private val varTypeAnnotationFqName = FqName("kotlinx.cinterop.internal.CStruct.VarType")
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class CStructVarCompanionGenerator(
context: GeneratorContext,
private val symbols: KonanSymbols
@@ -1294,7 +1294,7 @@ internal abstract class FunctionGenerationContext(
return if (irClass.isExternalObjCClass()) {
generationState.dependenciesTracker.add(irClass)
if (irClass.isObjCMetaClass()) {
val name = irClass.descriptor.getExternalObjCMetaClassBinaryName()
val name = irClass.getExternalObjCMetaClassBinaryName()
val objCClass = getObjCClass(name)
val getClass = llvm.externalNativeRuntimeFunction(
@@ -1304,7 +1304,7 @@ internal abstract class FunctionGenerationContext(
)
call(getClass, listOf(objCClass), exceptionHandler = exceptionHandler)
} else {
getObjCClass(irClass.descriptor.getExternalObjCClassBinaryName())
getObjCClass(irClass.getExternalObjCClassBinaryName())
}
} else {
if (irClass.isObjCMetaClass()) {
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.backend.konan.llvm
import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
import org.jetbrains.kotlin.library.metadata.CompiledKlibModuleOrigin
import org.jetbrains.kotlin.library.metadata.SyntheticModulesOrigin
import org.jetbrains.kotlin.library.metadata.klibModuleOrigin
@@ -26,3 +28,7 @@ internal val DeclarationDescriptor.llvmSymbolOrigin: CompiledKlibModuleOrigin
}
internal val Context.standardLlvmSymbolsOrigin: CompiledKlibModuleOrigin get() = this.stdlibModule.llvmSymbolOrigin
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal val IrPackageFragment.llvmSymbolOrigin
get() = packageFragmentDescriptor.llvmSymbolOrigin
@@ -416,8 +416,7 @@ internal class IntrinsicGenerator(private val environment: IntrinsicGeneratorEnv
}
private fun FunctionGenerationContext.emitCreateUninitializedInstance(callSite: IrCall, resultSlot: LLVMValueRef?): LLVMValueRef {
val typeParameterT = context.ir.symbols.createUninitializedInstance.descriptor.typeParameters[0]
val enumClass = callSite.getTypeArgument(typeParameterT.index)!!
val enumClass = callSite.getTypeArgument(0)!!
val enumIrClass = enumClass.getClass()!!
return allocInstance(enumIrClass, environment.calculateLifetime(callSite), resultSlot)
}
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.backend.konan.llvm.coverage.LLVMCoverageInstrumentat
import org.jetbrains.kotlin.backend.konan.lower.*
import org.jetbrains.kotlin.builtins.UnsignedType
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
@@ -860,7 +859,7 @@ internal class CodeGeneratorVisitor(
}
if (context.shouldVerifyBitCode())
verifyModule(llvm.module, "${declaration.descriptor.containingDeclaration}::${ir2string(declaration)}")
verifyModule(llvm.module, "${ir2string(declaration.parent)}::${ir2string(declaration)}")
}
private fun IrFunction.location(start: Boolean) =
@@ -898,7 +897,7 @@ internal class CodeGeneratorVisitor(
}
private fun needGlobalInit(field: IrField): Boolean {
if (field.descriptor.containingDeclaration !is PackageFragmentDescriptor) return field.isStatic
if (field.parent !is IrPackageFragment) return field.isStatic
// TODO: add some smartness here. Maybe if package of the field is in never accessed
// assume its global init can be actually omitted.
return true
@@ -1181,7 +1180,7 @@ internal class CodeGeneratorVisitor(
}
}
if (catch.catchParameter.descriptor.type == context.builtIns.throwable.defaultType) {
if (catch.catchParameter.type == context.irBuiltIns.throwableType) {
genCatchBlock()
return // Remaining catch clauses are unreachable.
} else {
@@ -1482,7 +1481,7 @@ internal class CodeGeneratorVisitor(
}
private fun IrType.isUnsignedInteger(): Boolean = !isNullable() &&
UnsignedType.values().any { it.classId == this.getClass()?.descriptor?.classId }
UnsignedType.values().any { it.classId == this.getClass()?.classId }
private fun evaluateIntegerCoercion(value: IrTypeOperatorCall): LLVMValueRef {
context.log{"evaluateIntegerCoercion : ${ir2string(value)}"}
@@ -2349,11 +2348,11 @@ internal class CodeGeneratorVisitor(
private fun evaluateFunctionReference(expression: IrFunctionReference): LLVMValueRef {
// TODO: consider creating separate IR element for pointer to function.
assert (expression.type.getClass()?.descriptor?.fqNameUnsafe == InteropFqNames.cPointer) {
"assert: ${expression.type.getClass()?.descriptor?.fqNameUnsafe} == ${InteropFqNames.cPointer}"
assert (expression.type.getClass()?.symbol?.hasEqualFqName(InteropFqNames.cPointer.toSafe()) == true) {
"assert: should be ${InteropFqNames.cPointer}, ${expression.type.render()} found"
}
assert (expression.getArguments().isEmpty())
assert (expression.getArgumentsWithIr().isEmpty())
val function = expression.symbol.owner
assert (function.dispatchReceiverParameter == null)
@@ -2965,7 +2964,6 @@ private val doubleUnderscoreThisName = Name.identifier("__this")
* 2. this is reserved name and compiled in special way.
*/
private fun IrValueDeclaration.debugNameConversion(): Name {
val name = descriptor.name
if (name == thisName) {
return when (origin) {
IrDeclarationOrigin.IR_TEMPORARY_VARIABLE_FOR_INLINED_EXTENSION_RECEIVER -> doubleUnderscoreThisName
@@ -27,7 +27,7 @@ internal class KotlinObjCClassInfoGenerator(override val generationState: Native
val superclassName = irClass.getSuperClassNotAny()!!.let {
llvm.dependenciesTracker.add(it)
it.descriptor.getExternalObjCClassBinaryName()
it.getExternalObjCClassBinaryName()
}
val protocolNames = irClass.getSuperInterfaces().map {
llvm.dependenciesTracker.add(it)
@@ -230,7 +230,7 @@ internal class RTTIGenerator(
val objOffsetsPtr = staticData.placeGlobalConstArray("krefs:$className", llvm.int32Type, objOffsets)
val objOffsetsCount = if (irClass.descriptor == context.builtIns.array) {
val objOffsetsCount = if (irClass.symbol == context.irBuiltIns.arrayClass) {
1 // To mark it as non-leaf.
} else {
objOffsets.size
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.backend.konan.llvm.LlvmCallable
import org.jetbrains.kotlin.backend.konan.reportCompilationError
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
@@ -72,6 +73,7 @@ internal class CoverageManager(val generationState: NativeGenerationState) {
coveredLibs + coveredSources
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
private fun fileCoverageFilter(file: IrFile) =
file.packageFragmentDescriptor.module in coveredModules
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.backend.konan.serialization.resolveFakeOverrideMaybe
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrClassReference
import org.jetbrains.kotlin.ir.expressions.IrVararg
@@ -803,6 +804,7 @@ private fun ObjCExportCodeGenerator.generateUnitContinuationToRetainedCompletion
}
// TODO: find out what to use instead here and in the dependent code
@OptIn(ObsoleteDescriptorBasedAPI::class)
private val ObjCExportBlockCodeGenerator.mappedFunctionNClasses get() =
// failed attempt to migrate to descriptor-less IrBuiltIns
((context.irBuiltIns as IrBuiltInsOverDescriptors).functionFactory as BuiltInFictitiousFunctionIrClassFactory).builtFunctionNClasses
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.computeFunctionName
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.declarations.*
@@ -36,6 +37,9 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature
import org.jetbrains.kotlin.load.java.SpecialGenericSignatures
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal fun IrFunction.getDefaultValueForOverriddenBuiltinFunction() = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor)
internal class BridgesSupport(mapping: NativeMapping, val irBuiltIns: IrBuiltIns, val irFactory: IrFactory) {
private val bridges = mapping.bridges
@@ -207,8 +211,7 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
val body = declaration.body ?: return declaration
val descriptor = declaration.descriptor
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor)
val typeSafeBarrierDescription = declaration.getDefaultValueForOverriddenBuiltinFunction()
if (typeSafeBarrierDescription == null || builtBridges.contains(declaration))
return declaration
@@ -295,7 +298,7 @@ private fun Context.buildBridge(startOffset: Int, endOffset: Int,
val irBuilder = createIrBuilder(bridge.symbol, startOffset, endOffset)
bridge.body = irBuilder.irBlockBody(bridge) {
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(overriddenFunction.overriddenFunction.descriptor)
val typeSafeBarrierDescription = overriddenFunction.overriddenFunction.getDefaultValueForOverriddenBuiltinFunction()
typeSafeBarrierDescription?.let { buildTypeSafeBarrier(bridge, overriddenFunction.function, it) }
val delegatingCall = IrCallImpl.fromSymbolOwner(
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.konan.descriptors.propertyIfAccessor
import org.jetbrains.kotlin.backend.konan.ir.ModuleIndex
import org.jetbrains.kotlin.descriptors.MemberDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
@@ -42,6 +43,7 @@ internal class ExpectDeclarationsRemoving(val context: Context) : FileLoweringPa
}
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class ExpectToActualDefaultValueCopier(private val irModule: IrModuleFragment) {
// Note: local declarations aren't required here; TODO: use more lightweight index.
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
@@ -64,6 +65,7 @@ internal class InteropLowering(generationState: NativeGenerationState) : FileLow
}
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
private abstract class BaseInteropIrTransformer(
private val generationState: NativeGenerationState
) : IrBuildingTransformer(generationState.context) {
@@ -136,6 +138,7 @@ private abstract class BaseInteropIrTransformer(
protected abstract fun addTopLevel(declaration: IrDeclaration)
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
private class InteropLoweringPart1(val generationState: NativeGenerationState) : BaseInteropIrTransformer(generationState), FileLoweringPass {
private val context = generationState.context
@@ -778,6 +781,7 @@ private class InteropLoweringPart2(val generationState: NativeGenerationState) :
}
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
private class InteropTransformer(
val generationState: NativeGenerationState,
override val irFile: IrFile
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.tryGetIntrinsicType
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
@@ -142,9 +143,9 @@ private class BackendChecker(
}
private fun IrConstructor.overridesConstructor(other: IrConstructor) =
this.descriptor.valueParameters.size == other.descriptor.valueParameters.size &&
this.descriptor.valueParameters.all {
val otherParameter = other.descriptor.valueParameters[it.index]
this.valueParameters.size == other.valueParameters.size &&
this.valueParameters.all {
val otherParameter = other.valueParameters[it.index]
it.name == otherParameter.name && it.type == otherParameter.type
}
@@ -156,7 +157,7 @@ private class BackendChecker(
}
function.valueParameters.forEach {
val kotlinType = it.descriptor.type
val kotlinType = it.type
if (!kotlinType.isObjCObjectType())
reportError(it, "Unexpected $action method parameter type: ${it.type.classFqName}\n" +
"Only Objective-C object types are supported here")
@@ -170,19 +171,19 @@ private class BackendChecker(
checkCanGenerateFunctionImp(function)
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
private fun checkCanGenerateOutletSetterImp(property: IrProperty) {
val descriptor = property.descriptor
val outlet = "@${InteropFqNames.objCOutlet}"
if (!descriptor.isVar)
if (!property.isVar)
reportError(property, "$outlet property must be var")
property.getter?.extensionReceiverParameter?.let {
reportError(it, "$outlet must not have extension receiver")
}
val type = descriptor.type
val type = property.descriptor.type
if (!type.isObjCObjectType())
reportError(property, "Unexpected $outlet type: ${property.getter?.returnType?.classFqName}\n" +
"Only Objective-C object types are supported here")
@@ -225,11 +226,11 @@ private class BackendChecker(
}
}
val kind = irClass.descriptor.kind
val kind = irClass.kind
if (kind != ClassKind.CLASS && kind != ClassKind.OBJECT)
reportError(irClass, "Only classes are supported as subtypes of Objective-C types")
if (!irClass.descriptor.isFinalClass)
if (!irClass.isFinalClass)
reportError(irClass, "Non-final Kotlin subclasses of Objective-C classes are not yet supported")
irClass.companionObject()?.let {
@@ -242,12 +243,12 @@ private class BackendChecker(
}
var hasObjCClassSupertype = false
irClass.descriptor.defaultType.constructor.supertypes.forEach {
val descriptor = it.constructor.declarationDescriptor as ClassDescriptor
if (!descriptor.isObjCClass())
irClass.defaultType.superTypes().forEach {
val clazz = it.classOrFail.owner
if (!clazz.isObjCClass())
reportError(irClass, "Mixing Kotlin and Objective-C supertypes is not supported")
if (descriptor.kind == ClassKind.CLASS)
if (clazz.kind == ClassKind.CLASS)
hasObjCClassSupertype = true
}
@@ -269,10 +270,9 @@ private class BackendChecker(
else -> "corresponding Objective-C method"
}
context.report(
reportError(
method,
"can't override '${method.name}', override $correspondingObjCMethod instead",
isError = true
)
}
}
@@ -412,10 +412,10 @@ private class BackendChecker(
val signatureTypes = target.allParameters.map { it.type } + target.returnType
callee.typeParameters.indices.forEach { index ->
val typeArgument = expression.getTypeArgument(index)!!.toKotlinType()
val signatureType = signatureTypes[index].toKotlinType()
if (typeArgument.constructor != signatureType.constructor ||
typeArgument.isMarkedNullable != signatureType.isMarkedNullable
val typeArgument = expression.getTypeArgument(index)!!
val signatureType = signatureTypes[index]
if (typeArgument.classifierOrNull != signatureType.classifierOrNull ||
typeArgument.isMarkedNullable() != signatureType.isMarkedNullable()
) {
reportError(expression, "C function signature element mismatch: " +
"expected '${signatureTypes[index].classFqName}', got '${expression.getTypeArgument(index)!!.classFqName}'")
@@ -541,7 +541,7 @@ private class BackendChecker(
private fun getUnboundReferencedFunction(expression: IrExpression) = when (expression) {
is IrFunctionReference -> {
val arguments = expression.getArguments()
val arguments = expression.getArgumentsWithIr()
val capturedVariables = captures(expression.symbol.owner)
ReferencedFunctionWithCapture(
expression.symbol.owner.takeIf { arguments.isEmpty() && capturedVariables.isEmpty() },
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildField
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
@@ -678,6 +679,7 @@ internal class TestProcessor (val context: Context) {
}
// endregion
@OptIn(ObsoleteDescriptorBasedAPI::class)
private fun shouldProcessFile(irFile: IrFile): Boolean = irFile.packageFragmentDescriptor.module.let {
// Process test annotations in source libraries too.
it in context.sourcesModules
@@ -11,10 +11,12 @@ import org.jetbrains.kotlin.backend.konan.descriptors.isArray
import org.jetbrains.kotlin.backend.konan.descriptors.isInterface
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal fun ObjCExportedInterface.createCodeSpec(symbolTable: SymbolTable): ObjCExportCodeSpec {
fun createObjCMethods(methods: List<FunctionDescriptor>) = methods.map {
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.backend.konan.llvm.*
@@ -187,7 +186,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
"Class constructor has empty body"
}
context.logMultiple {
+"Analysing function ${declaration.descriptor}"
+"Analysing function ${declaration.render()}"
+"IR: ${ir2stringWhole(declaration)}"
}
analyze(declaration, body)
@@ -200,7 +199,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
symbolTable.mapFunction(declaration)
} else {
context.logMultiple {
+"Analysing function ${declaration.descriptor}"
+"Analysing function ${declaration.render()}"
+"IR: ${ir2stringWhole(declaration)}"
}
analyze(declaration, body)
@@ -211,7 +210,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
if (declaration.isStatic)
declaration.initializer?.let {
context.logMultiple {
+"Analysing global field ${declaration.descriptor}"
+"Analysing global field ${declaration.render()}"
+"IR: ${ir2stringWhole(declaration)}"
}
analyze(declaration, IrSetFieldImpl(it.startOffset, it.endOffset, declaration.symbol, null,
@@ -262,7 +261,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
context.logMultiple {
+"SYMBOL TABLE:"
symbolTable.classMap.forEach { (irClass, type) ->
+" DESCRIPTOR: ${irClass.descriptor}"
+" IR CLASS: ${irClass.render()}"
+" TYPE: $type"
if (type !is DataFlowIR.Type.Declared)
return@forEach
@@ -323,7 +322,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
}
if (expression.symbol == executeImplSymbol) {
// Producer and job of executeImpl are called externally, we need to reflect this somehow.
val producerInvocation = IrCallImpl.fromSymbolDescriptor(expression.startOffset, expression.endOffset,
val producerInvocation = IrCallImpl.fromSymbolOwner(expression.startOffset, expression.endOffset,
executeImplProducerInvoke.returnType,
executeImplProducerInvoke.symbol,
executeImplProducerInvoke.symbol.owner.typeParameters.size,
@@ -335,7 +334,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
val jobFunctionReference = expression.getValueArgument(3) as? IrFunctionReference
?: error("A function reference expected")
val jobInvocation = IrCallImpl.fromSymbolDescriptor(expression.startOffset, expression.endOffset,
val jobInvocation = IrCallImpl.fromSymbolOwner(expression.startOffset, expression.endOffset,
jobFunctionReference.symbol.owner.returnType,
jobFunctionReference.symbol as IrSimpleFunctionSymbol,
jobFunctionReference.symbol.owner.typeParameters.size,
@@ -372,7 +371,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
// See ObjC instanceOf code generation for details.
if (expression is IrTypeOperatorCall && expression.operator.callsInstanceOf()
&& expression.typeOperand.isObjCObjectType()) {
val objcObjGetter = IrCallImpl.fromSymbolDescriptor(expression.startOffset, expression.endOffset,
val objcObjGetter = IrCallImpl.fromSymbolOwner(expression.startOffset, expression.endOffset,
objCObjectRawValueGetter.owner.returnType,
objCObjectRawValueGetter,
objCObjectRawValueGetter.owner.typeParameters.size,
@@ -717,7 +716,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
is IrConstructorCall -> {
val callee = value.symbol.owner
val arguments = value.getArguments().map { expressionToEdge(it.second) }
val arguments = value.getArgumentsWithIr().map { expressionToEdge(it.second) }
DataFlowIR.Node.NewObject(
symbolTable.mapFunction(callee),
arguments,
@@ -758,7 +757,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
initInstanceSymbol -> {
val thiz = expressionToEdge(value.getValueArgument(0)!!)
val initializer = value.getValueArgument(1) as IrConstructorCall
val arguments = listOf(thiz) + initializer.getArguments().map { expressionToEdge(it.second) }
val arguments = listOf(thiz) + initializer.getArgumentsWithIr().map { expressionToEdge(it.second) }
val callee = initializer.symbol.owner
DataFlowIR.Node.StaticCall(
symbolTable.mapFunction(callee),
@@ -771,7 +770,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
else -> {
val callee = value.symbol.owner
val arguments = value.getArguments()
val arguments = value.getArgumentsWithIr()
.map { expressionToEdge(it.second) }
if (value.isVirtualCall) {
@@ -784,12 +783,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|| !callee.isReal /* Could be a bridge. */)
symbolTable.mapClassReferenceType(owner)
else {
val actualClassAtCallsite =
(actualReceiverClassifier as IrClassSymbol).descriptor
// assert (DescriptorUtils.isSubclass(actualClassAtCallsite, owner.descriptor)) {
// "Expected an inheritor of ${owner.descriptor}, but was $actualClassAtCallsite"
// }
if (DescriptorUtils.isSubclass(actualClassAtCallsite, owner.descriptor)) {
if ((actualReceiverClassifier as IrClassSymbol).owner.isSubclassOf(owner)) {
symbolTable.mapClassReferenceType(actualReceiverClassifier.owner) // Box if inline class.
} else {
symbolTable.mapClassReferenceType(owner)
@@ -839,7 +833,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
val thisReceiver = (declaration as IrConstructor).constructedClass.thisReceiver!!
val thiz = IrGetValueImpl(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, thisReceiver.type,
thisReceiver.symbol)
val arguments = listOf(thiz) + value.getArguments().map { it.second }
val arguments = listOf(thiz) + value.getArgumentsWithIr().map { it.second }
DataFlowIR.Node.StaticCall(
symbolTable.mapFunction(value.symbol.owner),
arguments.map { expressionToEdge(it) },
@@ -14,9 +14,11 @@ import org.jetbrains.kotlin.backend.konan.llvm.isExported
import org.jetbrains.kotlin.backend.konan.llvm.localHash
import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_BRIDGE_METHOD
import org.jetbrains.kotlin.backend.konan.lower.bridgeTarget
import org.jetbrains.kotlin.backend.konan.lower.getDefaultValueForOverriddenBuiltinFunction
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.types.IrType
@@ -26,7 +28,6 @@ import org.jetbrains.kotlin.ir.types.isUnit
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
@@ -479,6 +480,7 @@ internal object DataFlowIR {
}, data = null)
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
fun mapClassReferenceType(irClass: IrClass): Type {
// Do not try to devirtualize ObjC classes.
if (irClass.module.name == Name.special("<forward declarations>") || irClass.isObjCClass())
@@ -622,7 +624,7 @@ internal object DataFlowIR {
val irClass = it.parent as? IrClass
val bridgeTarget = it.bridgeTarget
val isSpecialBridge = bridgeTarget.let {
it != null && BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(it.descriptor) != null
it != null && it.getDefaultValueForOverriddenBuiltinFunction() != null
}
val bridgeTargetSymbol = if (isSpecialBridge || bridgeTarget == null) null else mapFunction(bridgeTarget)
val placeToFunctionsTable = !isAbstract && it !is IrConstructor && irClass != null
@@ -1325,15 +1325,15 @@ internal object DevirtualizationAnalysis {
if (coercion == null)
value
else irCall(coercion).apply {
addArguments(listOf(coercion.descriptor.explicitParameters.single() to value))
require(coercion.owner.dispatchReceiverParameter == null &&
coercion.owner.extensionReceiverParameter == null &&
coercion.owner.valueParameters.size == 1
) { "Coercion function must be static with one value parameter" }
putValueArgument(0, value)
}
private fun IrBuilderWithScope.irCoerce(value: IrExpression, coercion: DataFlowIR.FunctionSymbol.Declared?) =
if (coercion == null)
value
else irCall(coercion.irFunction!!).apply {
putValueArgument(0, value)
}
irCoerce(value, coercion?.let { it.irFunction?.symbol!! })
sealed class PossiblyCoercedValue(private val coercion: IrFunctionSymbol?) {
abstract fun getValue(irBuilder: IrBuilderWithScope): IrExpression
@@ -1537,17 +1537,17 @@ internal object DevirtualizationAnalysis {
optimize && possibleCallees.size == 1 -> { // Monomorphic callsite.
irBlock(expression) {
val parameters = expression.getArgumentsWithSymbols().map { arg ->
val parameters = expression.getArgumentsWithIr().map { arg ->
// Temporary val is not required here for a parameter, since each one is used for only one devirtualized callsite
irSplitCoercion(caller, arg.second, tempName = null, arg.first.owner.type)
irSplitCoercion(caller, arg.second, tempName = null, arg.first.type)
}
+irDevirtualizedCall(expression, type, possibleCallees[0].first, parameters)
}
}
else -> irBlock(expression) {
val arguments = expression.getArgumentsWithSymbols().mapIndexed { index, arg ->
irSplitCoercion(caller, arg.second, "arg$index", arg.first.owner.type)
val arguments = expression.getArgumentsWithIr().mapIndexed { index, arg ->
irSplitCoercion(caller, arg.second, "arg$index", arg.first.type)
}
val receiver = irTemporary(arguments[0].getFullValue(this@irBlock))
val typeInfo by lazy {
@@ -3,11 +3,11 @@ package org.jetbrains.kotlin.backend.konan.serialization
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
import org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable
import org.jetbrains.kotlin.backend.common.serialization.signature.DescToIrIdSignatureComputer
import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibraryByDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.resolve.descriptorUtil.module
class KonanGlobalDeclarationTable(builtIns: IrBuiltIns) : GlobalDeclarationTable(KonanManglerIr) {
init {
@@ -22,8 +22,9 @@ class KonanDeclarationTable(
private val signatureIdComposer = DescToIrIdSignatureComputer(KonanIdSignaturer(KonanManglerDesc))
// TODO: We should get rid of this extension point in favor of proper support in IR-based mangler.
@OptIn(ObsoleteDescriptorBasedAPI::class)
override fun tryComputeBackendSpecificSignature(declaration: IrDeclaration): IdSignature? =
if (declaration.descriptor.isFromInteropLibrary()) {
if (declaration.isFromInteropLibraryByDescriptor()) {
signatureIdComposer.computeSignature(declaration)
} else null
}
@@ -33,10 +33,13 @@ import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary
import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForCEnumAndCStructStubs
import org.jetbrains.kotlin.backend.konan.ir.konanLibrary
import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibrary
import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibraryByDescriptor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
@@ -428,11 +431,12 @@ object KonanFakeOverrideClassFilter : FakeOverrideClassFilter {
IdSignature.Flags.IS_NATIVE_INTEROP_LIBRARY.test()
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
private fun IrClassSymbol.isInterop(): Boolean {
if (this is IrPublicSymbolBase<*> && this.signature.isInteropSignature()) return true
// K2 doesn't properly put signatures into such symbols yet, workaround:
return this.isBound && this.owner is Fir2IrLazyClass && this.descriptor.isFromInteropLibrary()
return this.isBound && this.owner is Fir2IrLazyClass && this.owner.isFromInteropLibraryByDescriptor()
}
// This is an alternative to .isObjCClass that doesn't need to walk up all the class heirarchy,
@@ -448,6 +452,7 @@ object KonanFakeOverrideClassFilter : FakeOverrideClassFilter {
internal data class DeserializedInlineFunction(val firstAccess: Boolean, val function: InlineFunctionOriginInfo)
@OptIn(ObsoleteDescriptorBasedAPI::class)
internal class KonanIrLinker(
private val currentModule: ModuleDescriptor,
override val translationPluginContext: TranslationPluginContext?,
@@ -580,6 +585,7 @@ internal class KonanIrLinker(
private val InvalidIndex = -1
@OptIn(ObsoleteDescriptorBasedAPI::class)
inner class KonanPartialModuleDeserializer(
moduleDescriptor: ModuleDescriptor,
override val klib: KotlinLibrary,
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrExportCheck
import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrMangleComputer
import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.types.getClass
import org.jetbrains.kotlin.ir.util.hasAnnotation
@@ -147,6 +148,8 @@ abstract class AbstractKonanDescriptorMangler : DescriptorBasedKotlinManglerImpl
return false
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
private class KonanDescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) : DescriptorMangleComputer(builder, mode) {
override fun copy(newMode: MangleMode): DescriptorMangleComputer = KonanDescriptorMangleComputer(builder, newMode)
@@ -15,10 +15,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrFileEntry
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.*
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
@@ -124,22 +121,6 @@ tailrec fun IrDeclaration.getContainingFile(): IrFile? {
}
}
internal fun ErrorReportingContext.report(declaration: IrDeclaration, message: String, isError: Boolean) {
val irFile = declaration.getContainingFile()
this.report(
declaration,
irFile,
if (irFile != null) {
message
} else {
val renderer = org.jetbrains.kotlin.renderer.DescriptorRenderer.COMPACT_WITH_SHORT_TYPES
"$message\n${renderer.render(declaration.descriptor)}"
},
isError
)
if (isError) throw KonanCompilationException()
}
fun IrFunctionAccessExpression.addArguments(args: Map<IrValueParameter, IrExpression>) {
val unhandledParameters = args.keys.toMutableSet()
fun getArg(parameter: IrValueParameter) = args[parameter]?.also { unhandledParameters -= parameter }
@@ -209,7 +190,7 @@ fun IrBuilderWithScope.irCall(irFunction: IrFunction, typeArguments: List<IrType
irCall(irFunction.symbol, typeArguments)
internal fun irCall(startOffset: Int, endOffset: Int, irFunction: IrSimpleFunction, typeArguments: List<IrType>): IrCall =
IrCallImpl.fromSymbolDescriptor(
IrCallImpl.fromSymbolOwner(
startOffset, endOffset, irFunction.substitutedReturnType(typeArguments),
irFunction.symbol, typeArguments.size, irFunction.valueParameters.size
).apply {
@@ -279,17 +260,6 @@ fun IrMemberAccessExpression<*>.getArgumentsWithIr(): List<Pair<IrValueParameter
return res
}
fun ReferenceSymbolTable.translateErased(type: KotlinType): IrSimpleType {
val descriptor = TypeUtils.getClassDescriptor(type)
if (descriptor == null) return translateErased(type.immediateSupertypes().first())
val classSymbol = this.referenceClass(descriptor)
val nullable = type.isMarkedNullable
val arguments = type.arguments.map { IrStarProjectionImpl }
return classSymbol.createType(nullable, arguments)
}
fun CommonBackendContext.createArrayOfExpression(
startOffset: Int, endOffset: Int,
arrayElementType: IrType,
@@ -347,6 +317,7 @@ fun IrValueParameter.copy(newDescriptor: ParameterDescriptor): IrValueParameter
fun IrClass.defaultOrNullableType(hasQuestionMark: Boolean) =
if (hasQuestionMark) this.defaultType.makeNullable() else this.defaultType
@OptIn(ObsoleteDescriptorBasedAPI::class)
fun IrFunction.isRestrictedSuspendFunction(): Boolean =
this.descriptor.extensionReceiverParameter?.type?.isRestrictsSuspensionReceiver() == true