Inlined ir-as-descriptors typedefs.
This commit is contained in:
committed by
alexander-gorshenev
parent
f54f570fbf
commit
9565420c7a
+5
-7
@@ -9,10 +9,7 @@ import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.*
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrField
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.IrValueDeclaration
|
||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.symbols.*
|
||||
@@ -48,7 +45,7 @@ internal abstract class AbstractValueUsageTransformer(
|
||||
|
||||
protected open fun IrExpression.useAsValue(value: IrValueDeclaration): IrExpression = this.useAs(value.type)
|
||||
|
||||
protected open fun IrExpression.useAsArgument(parameter: ParameterDescriptor): IrExpression =
|
||||
protected open fun IrExpression.useAsArgument(parameter: IrValueParameter): IrExpression =
|
||||
this.useAsValue(parameter)
|
||||
|
||||
protected open fun IrExpression.useAsDispatchReceiver(expression: IrFunctionAccessExpression): IrExpression =
|
||||
@@ -58,10 +55,11 @@ internal abstract class AbstractValueUsageTransformer(
|
||||
this.useAsArgument(expression.symbol.owner.extensionReceiverParameter!!)
|
||||
|
||||
protected open fun IrExpression.useAsValueArgument(expression: IrFunctionAccessExpression,
|
||||
parameter: ValueParameterDescriptor): IrExpression =
|
||||
parameter: IrValueParameter
|
||||
): IrExpression =
|
||||
this.useAsArgument(parameter)
|
||||
|
||||
private fun IrExpression.useForVariable(variable: VariableDescriptor): IrExpression =
|
||||
private fun IrExpression.useForVariable(variable: IrVariable): IrExpression =
|
||||
this.useAsValue(variable)
|
||||
|
||||
private fun IrExpression.useForField(field: IrField): IrExpression =
|
||||
|
||||
+4
-3
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.localHash
|
||||
import org.jetbrains.kotlin.backend.konan.lower.bridgeTarget
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||
import org.jetbrains.kotlin.ir.util.simpleFunctions
|
||||
|
||||
@@ -77,7 +78,7 @@ internal class OverriddenFunctionDescriptor(
|
||||
}
|
||||
}
|
||||
|
||||
internal class ClassVtablesBuilder(val classDescriptor: ClassDescriptor, val context: Context) {
|
||||
internal class ClassVtablesBuilder(val classDescriptor: IrClass, val context: Context) {
|
||||
private val DEBUG = 0
|
||||
|
||||
private inline fun DEBUG_OUTPUT(severity: Int, block: () -> Unit) {
|
||||
@@ -178,7 +179,7 @@ internal class ClassVtablesBuilder(val classDescriptor: ClassDescriptor, val con
|
||||
&& it.bridgeTarget == null }
|
||||
.sortedBy { it.uniqueId }
|
||||
|
||||
private val functionIds = mutableMapOf<FunctionDescriptor, Long>()
|
||||
private val functionIds = mutableMapOf<IrFunction, Long>()
|
||||
|
||||
private val FunctionDescriptor.uniqueId get() = functionIds.getOrPut(this) { functionName.localHash.value }
|
||||
private val IrFunction.uniqueId get() = functionIds.getOrPut(this) { functionName.localHash.value }
|
||||
}
|
||||
+19
-26
@@ -7,24 +7,16 @@ package org.jetbrains.kotlin.backend.konan.descriptors
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.ir.ir2stringWhole
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.*
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.PackageFragmentDescriptor
|
||||
import org.jetbrains.kotlin.backend.konan.isInlined
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||
import org.jetbrains.kotlin.ir.declarations.IrField
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.types.isUnit
|
||||
import org.jetbrains.kotlin.types.SimpleType
|
||||
|
||||
/**
|
||||
* List of all implemented interfaces (including those which implemented by a super class)
|
||||
*/
|
||||
internal val ClassDescriptor.implementedInterfaces: List<ClassDescriptor>
|
||||
internal val IrClass.implementedInterfaces: List<IrClass>
|
||||
get() {
|
||||
val superClassImplementedInterfaces = this.getSuperClassNotAny()?.implementedInterfaces ?: emptyList()
|
||||
val superInterfaces = this.getSuperInterfaces()
|
||||
@@ -79,10 +71,10 @@ internal fun IrSimpleFunction.resolveFakeOverride(allowAbstract: Boolean = false
|
||||
}
|
||||
|
||||
// TODO: don't forget to remove descriptor access here.
|
||||
internal val FunctionDescriptor.isTypedIntrinsic: Boolean
|
||||
internal val IrFunction.isTypedIntrinsic: Boolean
|
||||
get() = this.descriptor.isTypedIntrinsic
|
||||
|
||||
internal val DeclarationDescriptor.isFrozen: Boolean
|
||||
internal val IrDeclaration.isFrozen: Boolean
|
||||
get() = this.descriptor.isFrozen
|
||||
|
||||
internal val arrayTypes = setOf(
|
||||
@@ -100,17 +92,17 @@ internal val arrayTypes = setOf(
|
||||
)
|
||||
|
||||
|
||||
internal val ClassDescriptor.isArray: Boolean
|
||||
internal val IrClass.isArray: Boolean
|
||||
get() = this.fqNameSafe.asString() in arrayTypes
|
||||
|
||||
|
||||
internal val ClassDescriptor.isInterface: Boolean
|
||||
internal val IrClass.isInterface: Boolean
|
||||
get() = (this.kind == ClassKind.INTERFACE)
|
||||
|
||||
fun ClassDescriptor.isAbstract() = this.modality == Modality.SEALED || this.modality == Modality.ABSTRACT
|
||||
fun IrClass.isAbstract() = this.modality == Modality.SEALED || this.modality == Modality.ABSTRACT
|
||||
|| this.kind == ClassKind.ENUM_CLASS
|
||||
|
||||
internal fun FunctionDescriptor.hasValueTypeAt(index: Int): Boolean {
|
||||
internal fun IrFunction.hasValueTypeAt(index: Int): Boolean {
|
||||
when (index) {
|
||||
0 -> return !isSuspend && returnType.let { (it.isInlined() || it.isUnit()) }
|
||||
1 -> return dispatchReceiverParameter.let { it != null && it.type.isInlined() }
|
||||
@@ -119,7 +111,7 @@ internal fun FunctionDescriptor.hasValueTypeAt(index: Int): Boolean {
|
||||
}
|
||||
}
|
||||
|
||||
internal fun FunctionDescriptor.hasReferenceAt(index: Int): Boolean {
|
||||
internal fun IrFunction.hasReferenceAt(index: Int): Boolean {
|
||||
when (index) {
|
||||
0 -> return isSuspend || returnType.let { !it.isInlined() && !it.isUnit() }
|
||||
1 -> return dispatchReceiverParameter.let { it != null && !it.type.isInlined() }
|
||||
@@ -128,18 +120,19 @@ internal fun FunctionDescriptor.hasReferenceAt(index: Int): Boolean {
|
||||
}
|
||||
}
|
||||
|
||||
private fun FunctionDescriptor.needBridgeToAt(target: FunctionDescriptor, index: Int)
|
||||
private fun IrFunction.needBridgeToAt(target: IrFunction, index: Int)
|
||||
= hasValueTypeAt(index) xor target.hasValueTypeAt(index)
|
||||
|
||||
internal fun FunctionDescriptor.needBridgeTo(target: FunctionDescriptor)
|
||||
internal fun IrFunction.needBridgeTo(target: IrFunction)
|
||||
= (0..this.valueParameters.size + 2).any { needBridgeToAt(target, it) }
|
||||
|
||||
internal val IrSimpleFunction.target: IrSimpleFunction
|
||||
get() = (if (modality == Modality.ABSTRACT) this else resolveFakeOverride()).original
|
||||
|
||||
internal val FunctionDescriptor.target: FunctionDescriptor get() = when (this) {
|
||||
internal val IrFunction.target: IrFunction
|
||||
get() = when (this) {
|
||||
is IrSimpleFunction -> this.target
|
||||
is ConstructorDescriptor -> this
|
||||
is IrConstructor -> this
|
||||
else -> error(this)
|
||||
}
|
||||
|
||||
@@ -149,7 +142,7 @@ internal enum class BridgeDirection {
|
||||
TO_VALUE_TYPE
|
||||
}
|
||||
|
||||
private fun FunctionDescriptor.bridgeDirectionToAt(target: FunctionDescriptor, index: Int)
|
||||
private fun IrFunction.bridgeDirectionToAt(target: IrFunction, index: Int)
|
||||
= when {
|
||||
hasValueTypeAt(index) && target.hasReferenceAt(index) -> BridgeDirection.FROM_VALUE_TYPE
|
||||
hasReferenceAt(index) && target.hasValueTypeAt(index) -> BridgeDirection.TO_VALUE_TYPE
|
||||
@@ -221,13 +214,13 @@ internal fun IrSimpleFunction.bridgeDirectionsTo(
|
||||
return ourDirections
|
||||
}
|
||||
|
||||
tailrec internal fun DeclarationDescriptor.findPackage(): PackageFragmentDescriptor {
|
||||
tailrec internal fun IrDeclaration.findPackage(): IrPackageFragment {
|
||||
val parent = this.parent
|
||||
return parent as? PackageFragmentDescriptor
|
||||
?: (parent as DeclarationDescriptor).findPackage()
|
||||
return parent as? IrPackageFragment
|
||||
?: (parent as IrDeclaration).findPackage()
|
||||
}
|
||||
|
||||
fun FunctionDescriptor.isComparisonDescriptor(map: Map<SimpleType, IrSimpleFunction>): Boolean =
|
||||
fun IrFunction.isComparisonDescriptor(map: Map<SimpleType, IrSimpleFunction>): Boolean =
|
||||
this in map.values
|
||||
|
||||
val IrDeclaration.isPropertyAccessor get() =
|
||||
|
||||
-1
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.backend.konan.*
|
||||
import org.jetbrains.kotlin.backend.konan.llvm.llvmSymbolOrigin
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.classifierOrFail
|
||||
import org.jetbrains.kotlin.ir.types.toKotlinType
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.backend.konan.irasdescriptors
|
||||
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
|
||||
|
||||
internal typealias DeclarationDescriptor = IrDeclaration
|
||||
internal typealias FunctionDescriptor = IrFunction
|
||||
internal typealias ClassDescriptor = IrClass
|
||||
internal typealias ConstructorDescriptor = IrConstructor
|
||||
internal typealias ClassConstructorDescriptor = IrConstructor
|
||||
internal typealias PackageFragmentDescriptor = IrPackageFragment
|
||||
internal typealias VariableDescriptor = IrVariable
|
||||
internal typealias ValueDescriptor = IrValueDeclaration
|
||||
internal typealias ParameterDescriptor = IrValueParameter
|
||||
internal typealias ValueParameterDescriptor = IrValueParameter
|
||||
internal typealias TypeParameterDescriptor = IrTypeParameter
|
||||
-2
@@ -7,13 +7,11 @@ package org.jetbrains.kotlin.backend.konan.irasdescriptors
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.atMostOne
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.getArgumentValueOrNull
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.getStringValue
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.konanBackingField
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.isInterface
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
|
||||
|
||||
+2
-2
@@ -112,7 +112,7 @@ private val exportForCompilerAnnotation = FqName("kotlin.native.internal.ExportF
|
||||
|
||||
private val publishedApiAnnotation = FqName("kotlin.PublishedApi")
|
||||
|
||||
private fun acyclicTypeMangler(visited: MutableSet<TypeParameterDescriptor>, type: IrType): String {
|
||||
private fun acyclicTypeMangler(visited: MutableSet<IrTypeParameter>, type: IrType): String {
|
||||
val descriptor = (type.classifierOrNull as? IrTypeParameterSymbol)?.owner
|
||||
if (descriptor != null) {
|
||||
val upperBounds = if (visited.contains(descriptor)) "" else {
|
||||
@@ -148,7 +148,7 @@ private fun acyclicTypeMangler(visited: MutableSet<TypeParameterDescriptor>, typ
|
||||
}
|
||||
|
||||
private fun typeToHashString(type: IrType)
|
||||
= acyclicTypeMangler(mutableSetOf<TypeParameterDescriptor>(), type)
|
||||
= acyclicTypeMangler(mutableSetOf<IrTypeParameter>(), type)
|
||||
|
||||
internal val IrValueParameter.extensionReceiverNamePart: String
|
||||
get() = "@${typeToHashString(this.type)}."
|
||||
|
||||
+21
-24
@@ -12,9 +12,6 @@ import org.jetbrains.kotlin.backend.common.ir.ir2string
|
||||
import org.jetbrains.kotlin.backend.konan.*
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.isInterface
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.*
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.ClassConstructorDescriptor
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.backend.konan.llvm.objc.*
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
@@ -24,7 +21,7 @@ import org.jetbrains.kotlin.backend.konan.descriptors.resolveFakeOverride
|
||||
|
||||
internal class CodeGenerator(override val context: Context) : ContextUtils {
|
||||
|
||||
fun llvmFunction(function: FunctionDescriptor): LLVMValueRef = function.llvmFunction
|
||||
fun llvmFunction(function: IrFunction): LLVMValueRef = function.llvmFunction
|
||||
val intPtrType = LLVMIntPtrType(llvmTargetData)!!
|
||||
internal val immOneIntPtrType = LLVMConstInt(intPtrType, 1, 1)!!
|
||||
// Keep in sync with OBJECT_TAG_MASK in C++.
|
||||
@@ -33,19 +30,19 @@ internal class CodeGenerator(override val context: Context) : ContextUtils {
|
||||
//-------------------------------------------------------------------------//
|
||||
|
||||
/* to class descriptor */
|
||||
fun typeInfoValue(descriptor: ClassDescriptor): LLVMValueRef = descriptor.llvmTypeInfoPtr
|
||||
fun typeInfoValue(descriptor: IrClass): LLVMValueRef = descriptor.llvmTypeInfoPtr
|
||||
|
||||
fun param(fn: FunctionDescriptor, i: Int): LLVMValueRef {
|
||||
fun param(fn: IrFunction, i: Int): LLVMValueRef {
|
||||
assert(i >= 0 && i < countParams(fn))
|
||||
return LLVMGetParam(fn.llvmFunction, i)!!
|
||||
}
|
||||
|
||||
private fun countParams(fn: FunctionDescriptor) = LLVMCountParams(fn.llvmFunction)
|
||||
private fun countParams(fn: IrFunction) = LLVMCountParams(fn.llvmFunction)
|
||||
|
||||
fun functionEntryPointAddress(descriptor: FunctionDescriptor) = descriptor.entryPointAddress.llvm
|
||||
fun functionHash(descriptor: FunctionDescriptor): LLVMValueRef = descriptor.functionName.localHash.llvm
|
||||
fun functionEntryPointAddress(descriptor: IrFunction) = descriptor.entryPointAddress.llvm
|
||||
fun functionHash(descriptor: IrFunction): LLVMValueRef = descriptor.functionName.localHash.llvm
|
||||
|
||||
fun getObjectInstanceStorage(descriptor: ClassDescriptor, shared: Boolean): LLVMValueRef {
|
||||
fun getObjectInstanceStorage(descriptor: IrClass, shared: Boolean): LLVMValueRef {
|
||||
assert (!descriptor.isUnit())
|
||||
val llvmGlobal = if (!isExternal(descriptor)) {
|
||||
context.llvmDeclarations.forSingleton(descriptor).instanceFieldRef
|
||||
@@ -65,7 +62,7 @@ internal class CodeGenerator(override val context: Context) : ContextUtils {
|
||||
return llvmGlobal
|
||||
}
|
||||
|
||||
fun getObjectInstanceShadowStorage(descriptor: ClassDescriptor): LLVMValueRef {
|
||||
fun getObjectInstanceShadowStorage(descriptor: IrClass): LLVMValueRef {
|
||||
assert (!descriptor.isUnit())
|
||||
assert (descriptor.objectIsShared)
|
||||
val llvmGlobal = if (!isExternal(descriptor)) {
|
||||
@@ -83,7 +80,7 @@ internal class CodeGenerator(override val context: Context) : ContextUtils {
|
||||
return llvmGlobal
|
||||
}
|
||||
|
||||
fun typeInfoForAllocation(constructedClass: ClassDescriptor): LLVMValueRef {
|
||||
fun typeInfoForAllocation(constructedClass: IrClass): LLVMValueRef {
|
||||
assert(!constructedClass.isObjCClass())
|
||||
return typeInfoValue(constructedClass)
|
||||
}
|
||||
@@ -115,7 +112,7 @@ val LLVMValueRef.isConst:Boolean
|
||||
|
||||
|
||||
internal inline fun<R> generateFunction(codegen: CodeGenerator,
|
||||
descriptor: FunctionDescriptor,
|
||||
descriptor: IrFunction,
|
||||
startLocation: LocationInfo? = null,
|
||||
endLocation: LocationInfo? = null,
|
||||
code:FunctionGenerationContext.(FunctionGenerationContext) -> R) {
|
||||
@@ -161,7 +158,7 @@ internal class FunctionGenerationContext(val function: LLVMValueRef,
|
||||
val codegen: CodeGenerator,
|
||||
startLocation: LocationInfo?,
|
||||
endLocation: LocationInfo?,
|
||||
internal val functionDescriptor: FunctionDescriptor? = null): ContextUtils {
|
||||
internal val functionDescriptor: IrFunction? = null): ContextUtils {
|
||||
|
||||
override val context = codegen.context
|
||||
val vars = VariableManager(this)
|
||||
@@ -175,8 +172,8 @@ internal class FunctionGenerationContext(val function: LLVMValueRef,
|
||||
var returnType: LLVMTypeRef? = LLVMGetReturnType(getFunctionType(function))
|
||||
private val returns: MutableMap<LLVMBasicBlockRef, LLVMValueRef> = mutableMapOf()
|
||||
// TODO: remove, to make CodeGenerator descriptor-agnostic.
|
||||
val constructedClass: ClassDescriptor?
|
||||
get() = (functionDescriptor as? ClassConstructorDescriptor)?.constructedClass
|
||||
val constructedClass: IrClass?
|
||||
get() = (functionDescriptor as? IrConstructor)?.constructedClass
|
||||
private var returnSlot: LLVMValueRef? = null
|
||||
private var slotsPhi: LLVMValueRef? = null
|
||||
private val frameOverlaySlotCount =
|
||||
@@ -412,7 +409,7 @@ internal class FunctionGenerationContext(val function: LLVMValueRef,
|
||||
return call(context.llvm.allocInstanceFunction, listOf(typeInfo), lifetime)
|
||||
}
|
||||
|
||||
fun allocInstance(descriptor: ClassDescriptor, lifetime: Lifetime): LLVMValueRef =
|
||||
fun allocInstance(descriptor: IrClass, lifetime: Lifetime): LLVMValueRef =
|
||||
allocInstance(codegen.typeInfoForAllocation(descriptor), lifetime)
|
||||
|
||||
fun allocArray(
|
||||
@@ -631,7 +628,7 @@ internal class FunctionGenerationContext(val function: LLVMValueRef,
|
||||
return switch
|
||||
}
|
||||
|
||||
fun lookupVirtualImpl(receiver: LLVMValueRef, descriptor: FunctionDescriptor): LLVMValueRef {
|
||||
fun lookupVirtualImpl(receiver: LLVMValueRef, descriptor: IrFunction): LLVMValueRef {
|
||||
assert(LLVMTypeOf(receiver) == codegen.kObjHeaderPtr)
|
||||
|
||||
val typeInfoPtr: LLVMValueRef = if (descriptor.getObjCMethodInfo() != null) {
|
||||
@@ -655,7 +652,7 @@ internal class FunctionGenerationContext(val function: LLVMValueRef,
|
||||
* owner as Any and dispatch it via vtable.
|
||||
*/
|
||||
val anyMethod = (descriptor as IrSimpleFunction).findOverriddenMethodOfAny()
|
||||
val owner = (anyMethod ?: descriptor).containingDeclaration as ClassDescriptor
|
||||
val owner = (anyMethod ?: descriptor).containingDeclaration as IrClass
|
||||
|
||||
val llvmMethod = if (!owner.isInterface) {
|
||||
// If this is a virtual method of the class - we can call via vtable.
|
||||
@@ -680,7 +677,7 @@ internal class FunctionGenerationContext(val function: LLVMValueRef,
|
||||
private fun IrSimpleFunction.findOverriddenMethodOfAny(): IrSimpleFunction? {
|
||||
if (modality == Modality.ABSTRACT) return null
|
||||
val resolved = resolveFakeOverride()
|
||||
if ((resolved.parent as ClassDescriptor).isAny()) {
|
||||
if ((resolved.parent as IrClass).isAny()) {
|
||||
return resolved
|
||||
}
|
||||
|
||||
@@ -688,9 +685,9 @@ internal class FunctionGenerationContext(val function: LLVMValueRef,
|
||||
}
|
||||
|
||||
fun getObjectValue(
|
||||
descriptor: ClassDescriptor,
|
||||
exceptionHandler: ExceptionHandler,
|
||||
locationInfo: LocationInfo?
|
||||
descriptor: IrClass,
|
||||
exceptionHandler: ExceptionHandler,
|
||||
locationInfo: LocationInfo?
|
||||
): LLVMValueRef {
|
||||
if (descriptor.isUnit()) {
|
||||
return codegen.theUnitInstanceRef.llvm
|
||||
@@ -745,7 +742,7 @@ internal class FunctionGenerationContext(val function: LLVMValueRef,
|
||||
* Note: the same code is generated as IR in [org.jetbrains.kotlin.backend.konan.lower.EnumUsageLowering].
|
||||
*/
|
||||
fun getEnumEntry(descriptor: IrEnumEntry, exceptionHandler: ExceptionHandler): LLVMValueRef {
|
||||
val enumClassDescriptor = descriptor.containingDeclaration as ClassDescriptor
|
||||
val enumClassDescriptor = descriptor.containingDeclaration as IrClass
|
||||
val loweredEnum = context.specialDeclarationsFactory.getLoweredEnum(enumClassDescriptor)
|
||||
|
||||
val ordinal = loweredEnum.entriesMap[descriptor.name]!!
|
||||
|
||||
+6
-8
@@ -14,9 +14,7 @@ import org.jetbrains.kotlin.backend.konan.irasdescriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.konan.CompiledKonanModuleOrigin
|
||||
import org.jetbrains.kotlin.descriptors.konan.CurrentKonanModuleOrigin
|
||||
import org.jetbrains.kotlin.descriptors.konan.DeserializedKonanModuleOrigin
|
||||
import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment
|
||||
import org.jetbrains.kotlin.ir.declarations.IrField
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
||||
import org.jetbrains.kotlin.konan.library.resolver.TopologicalLibraryOrder
|
||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||
@@ -143,7 +141,7 @@ internal interface ContextUtils : RuntimeAware {
|
||||
val staticData: StaticData
|
||||
get() = context.llvm.staticData
|
||||
|
||||
fun isExternal(descriptor: DeclarationDescriptor): Boolean {
|
||||
fun isExternal(descriptor: IrDeclaration): Boolean {
|
||||
val pkg = descriptor.findPackage()
|
||||
return when (pkg) {
|
||||
is IrFile -> pkg.packageFragmentDescriptor.containingDeclaration != context.moduleDescriptor
|
||||
@@ -156,7 +154,7 @@ internal interface ContextUtils : RuntimeAware {
|
||||
* LLVM function generated from the Kotlin function.
|
||||
* It may be declared as external function prototype.
|
||||
*/
|
||||
val FunctionDescriptor.llvmFunction: LLVMValueRef
|
||||
val IrFunction.llvmFunction: LLVMValueRef
|
||||
get() {
|
||||
assert(this.isReal)
|
||||
|
||||
@@ -171,13 +169,13 @@ internal interface ContextUtils : RuntimeAware {
|
||||
/**
|
||||
* Address of entry point of [llvmFunction].
|
||||
*/
|
||||
val FunctionDescriptor.entryPointAddress: ConstPointer
|
||||
val IrFunction.entryPointAddress: ConstPointer
|
||||
get() {
|
||||
val result = LLVMConstBitCast(this.llvmFunction, int8TypePtr)!!
|
||||
return constPointer(result)
|
||||
}
|
||||
|
||||
val ClassDescriptor.typeInfoPtr: ConstPointer
|
||||
val IrClass.typeInfoPtr: ConstPointer
|
||||
get() {
|
||||
return if (isExternal(this)) {
|
||||
constPointer(importGlobal(this.typeInfoSymbolName, runtime.typeInfoType,
|
||||
@@ -191,7 +189,7 @@ internal interface ContextUtils : RuntimeAware {
|
||||
* Pointer to type info for given class.
|
||||
* It may be declared as pointer to external variable.
|
||||
*/
|
||||
val ClassDescriptor.llvmTypeInfoPtr: LLVMValueRef
|
||||
val IrClass.llvmTypeInfoPtr: LLVMValueRef
|
||||
get() = typeInfoPtr.llvm
|
||||
|
||||
/**
|
||||
|
||||
+3
-3
@@ -12,10 +12,10 @@ import org.jetbrains.kotlin.backend.konan.SYNTHETIC_OFFSET
|
||||
import org.jetbrains.kotlin.backend.konan.Context
|
||||
import org.jetbrains.kotlin.backend.konan.KonanConfig
|
||||
import org.jetbrains.kotlin.backend.konan.KonanConfigKeys
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.ir.SourceManager.FileEntry
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
||||
import org.jetbrains.kotlin.konan.KonanVersion
|
||||
import org.jetbrains.kotlin.konan.file.File
|
||||
@@ -200,7 +200,7 @@ private fun debugInfoBaseType(context:Context, targetData:LLVMTargetDataRef, typ
|
||||
LLVMSizeOfTypeInBits(targetData, type),
|
||||
LLVMPreferredAlignmentOfType(targetData, type).toLong(), encoding) as DITypeOpaqueRef
|
||||
|
||||
internal val FunctionDescriptor.types:List<KotlinType>
|
||||
internal val IrFunction.types:List<KotlinType>
|
||||
get() {
|
||||
val parameters = descriptor.valueParameters.map{it.type}
|
||||
return listOf(descriptor.returnType!!, *parameters.toTypedArray())
|
||||
@@ -223,7 +223,7 @@ internal fun KotlinType.encoding(context: Context): DwarfTypeKind = when {
|
||||
|
||||
internal fun alignTo(value:Long, align:Long):Long = (value + align - 1) / align * align
|
||||
|
||||
internal fun FunctionDescriptor.subroutineType(context: Context, llvmTargetData: LLVMTargetDataRef): DISubroutineTypeRef {
|
||||
internal fun IrFunction.subroutineType(context: Context, llvmTargetData: LLVMTargetDataRef): DISubroutineTypeRef {
|
||||
val types = this@subroutineType.types
|
||||
return subroutineType(context, llvmTargetData, types)
|
||||
}
|
||||
|
||||
+26
-26
@@ -232,19 +232,19 @@ internal interface CodeContext {
|
||||
* Declares the variable.
|
||||
* @return index of declared variable.
|
||||
*/
|
||||
fun genDeclareVariable(descriptor: VariableDescriptor, value: LLVMValueRef?, variableLocation: VariableDebugLocation?): Int
|
||||
fun genDeclareVariable(descriptor: IrVariable, value: LLVMValueRef?, variableLocation: VariableDebugLocation?): Int
|
||||
|
||||
/**
|
||||
* @return index of variable declared before, or -1 if no such variable has been declared yet.
|
||||
*/
|
||||
fun getDeclaredVariable(descriptor: VariableDescriptor): Int
|
||||
fun getDeclaredVariable(descriptor: IrVariable): Int
|
||||
|
||||
/**
|
||||
* Generates the code to obtain a value available in this context.
|
||||
*
|
||||
* @return the requested value
|
||||
*/
|
||||
fun genGetValue(descriptor: ValueDescriptor): LLVMValueRef
|
||||
fun genGetValue(descriptor: IrValueDeclaration): LLVMValueRef
|
||||
|
||||
/**
|
||||
* Returns owning function scope.
|
||||
@@ -342,11 +342,11 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
|
||||
override fun genThrow(exception: LLVMValueRef) = unsupported()
|
||||
|
||||
override fun genDeclareVariable(descriptor: VariableDescriptor, value: LLVMValueRef?, variableLocation: VariableDebugLocation?) = unsupported(descriptor)
|
||||
override fun genDeclareVariable(descriptor: IrVariable, value: LLVMValueRef?, variableLocation: VariableDebugLocation?) = unsupported(descriptor)
|
||||
|
||||
override fun getDeclaredVariable(descriptor: VariableDescriptor) = -1
|
||||
override fun getDeclaredVariable(descriptor: IrVariable) = -1
|
||||
|
||||
override fun genGetValue(descriptor: ValueDescriptor) = unsupported(descriptor)
|
||||
override fun genGetValue(descriptor: IrValueDeclaration) = unsupported(descriptor)
|
||||
|
||||
override fun functionScope(): CodeContext? = null
|
||||
|
||||
@@ -622,16 +622,16 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
*/
|
||||
private inner class VariableScope : InnerScopeImpl() {
|
||||
|
||||
override fun genDeclareVariable(descriptor: VariableDescriptor, value: LLVMValueRef?, variableLocation: VariableDebugLocation?): Int {
|
||||
override fun genDeclareVariable(descriptor: IrVariable, value: LLVMValueRef?, variableLocation: VariableDebugLocation?): Int {
|
||||
return functionGenerationContext.vars.createVariable(descriptor, value, variableLocation)
|
||||
}
|
||||
|
||||
override fun getDeclaredVariable(descriptor: VariableDescriptor): Int {
|
||||
override fun getDeclaredVariable(descriptor: IrVariable): Int {
|
||||
val index = functionGenerationContext.vars.indexOf(descriptor)
|
||||
return if (index < 0) super.getDeclaredVariable(descriptor) else return index
|
||||
}
|
||||
|
||||
override fun genGetValue(descriptor: ValueDescriptor): LLVMValueRef {
|
||||
override fun genGetValue(descriptor: IrValueDeclaration): LLVMValueRef {
|
||||
val index = functionGenerationContext.vars.indexOf(descriptor)
|
||||
if (index < 0) {
|
||||
return super.genGetValue(descriptor)
|
||||
@@ -664,7 +664,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
}
|
||||
}
|
||||
|
||||
override fun genGetValue(descriptor: ValueDescriptor): LLVMValueRef {
|
||||
override fun genGetValue(descriptor: IrValueDeclaration): LLVMValueRef {
|
||||
val index = functionGenerationContext.vars.indexOf(descriptor)
|
||||
if (index < 0) {
|
||||
return super.genGetValue(descriptor)
|
||||
@@ -735,7 +735,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
/**
|
||||
* Binds LLVM function parameters to IR parameter descriptors.
|
||||
*/
|
||||
private fun bindParameters(descriptor: FunctionDescriptor?): Map<ParameterDescriptor, LLVMValueRef> {
|
||||
private fun bindParameters(descriptor: IrFunction?): Map<IrValueParameter, LLVMValueRef> {
|
||||
if (descriptor == null) return emptyMap()
|
||||
val parameterDescriptors = descriptor.allParameters
|
||||
return parameterDescriptors.mapIndexed { i, parameterDescriptor ->
|
||||
@@ -1600,7 +1600,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
private fun fieldPtrOfClass(thisPtr: LLVMValueRef, value: IrField): LLVMValueRef {
|
||||
val fieldInfo = context.llvmDeclarations.forField(value)
|
||||
|
||||
val classDescriptor = value.containingDeclaration as ClassDescriptor
|
||||
val classDescriptor = value.containingDeclaration as IrClass
|
||||
val typePtr = pointerType(fieldInfo.classBodyType)
|
||||
|
||||
val bodyPtr = getObjectBodyPtr(classDescriptor, thisPtr)
|
||||
@@ -1610,7 +1610,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
return fieldPtr!!
|
||||
}
|
||||
|
||||
private fun getObjectBodyPtr(classDescriptor: ClassDescriptor, objectPtr: LLVMValueRef): LLVMValueRef {
|
||||
private fun getObjectBodyPtr(classDescriptor: IrClass, objectPtr: LLVMValueRef): LLVMValueRef {
|
||||
return if (classDescriptor.isObjCClass()) {
|
||||
assert(classDescriptor.isKotlinObjCClass())
|
||||
|
||||
@@ -1920,7 +1920,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
this.scope(startLine()) else null
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
private fun FunctionDescriptor.scope(startLine:Int): DIScopeOpaqueRef? {
|
||||
private fun IrFunction.scope(startLine:Int): DIScopeOpaqueRef? {
|
||||
if (codegen.isExternal(this) || !context.shouldContainDebugInfo())
|
||||
return null
|
||||
return context.debugInfo.subprograms.getOrPut(codegen.llvmFunction(this)) {
|
||||
@@ -1973,7 +1973,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
}
|
||||
}
|
||||
|
||||
private fun FunctionDescriptor.returnsUnit() = returnType.isUnit() && !isSuspend
|
||||
private fun IrFunction.returnsUnit() = returnType.isUnit() && !isSuspend
|
||||
|
||||
/**
|
||||
* Evaluates all arguments of [expression] that are explicitly represented in the IR.
|
||||
@@ -2047,10 +2047,10 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
}
|
||||
}
|
||||
|
||||
private inner class SuspensionPointScope(val suspensionPointId: VariableDescriptor,
|
||||
private inner class SuspensionPointScope(val suspensionPointId: IrVariable,
|
||||
val bbResume: LLVMBasicBlockRef,
|
||||
val bbResumeId: Int): InnerScopeImpl() {
|
||||
override fun genGetValue(descriptor: ValueDescriptor): LLVMValueRef {
|
||||
override fun genGetValue(descriptor: IrValueDeclaration): LLVMValueRef {
|
||||
if (descriptor == suspensionPointId) {
|
||||
return if (context.config.indirectBranchesAreAllowed)
|
||||
functionGenerationContext.blockAddress(bbResume)
|
||||
@@ -2092,7 +2092,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
return when {
|
||||
function.isTypedIntrinsic -> intrinsicGenerator.evaluateCall(callee, args)
|
||||
function.origin == IrDeclarationOrigin.IR_BUILTINS_STUB -> evaluateOperatorCall(callee, argsWithContinuationIfNeeded)
|
||||
function is ConstructorDescriptor -> evaluateConstructorCall(callee, argsWithContinuationIfNeeded)
|
||||
function is IrConstructor -> evaluateConstructorCall(callee, argsWithContinuationIfNeeded)
|
||||
else -> evaluateSimpleFunctionCall(function, argsWithContinuationIfNeeded, resultLifetime, callee.superQualifierSymbol?.owner)
|
||||
}
|
||||
}
|
||||
@@ -2141,8 +2141,8 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
//-------------------------------------------------------------------------//
|
||||
|
||||
private fun evaluateSimpleFunctionCall(
|
||||
descriptor: FunctionDescriptor, args: List<LLVMValueRef>,
|
||||
resultLifetime: Lifetime, superClass: ClassDescriptor? = null): LLVMValueRef {
|
||||
descriptor: IrFunction, args: List<LLVMValueRef>,
|
||||
resultLifetime: Lifetime, superClass: IrClass? = null): LLVMValueRef {
|
||||
//context.log{"evaluateSimpleFunctionCall : $tmpVariableName = ${ir2string(value)}"}
|
||||
if (superClass == null && descriptor is IrSimpleFunction && descriptor.isOverridable)
|
||||
return callVirtual(descriptor, args, resultLifetime)
|
||||
@@ -2190,7 +2190,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
}
|
||||
}
|
||||
|
||||
private fun genGetObjCClass(classDescriptor: ClassDescriptor): LLVMValueRef {
|
||||
private fun genGetObjCClass(classDescriptor: IrClass): LLVMValueRef {
|
||||
return functionGenerationContext.getObjCClass(classDescriptor, currentCodeContext.exceptionHandler)
|
||||
}
|
||||
|
||||
@@ -2251,7 +2251,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
|
||||
//-------------------------------------------------------------------------//
|
||||
|
||||
fun callDirect(descriptor: FunctionDescriptor, args: List<LLVMValueRef>,
|
||||
fun callDirect(descriptor: IrFunction, args: List<LLVMValueRef>,
|
||||
resultLifetime: Lifetime): LLVMValueRef {
|
||||
val realDescriptor = descriptor.target
|
||||
val llvmFunction = codegen.llvmFunction(realDescriptor)
|
||||
@@ -2260,7 +2260,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
|
||||
//-------------------------------------------------------------------------//
|
||||
|
||||
fun callVirtual(descriptor: FunctionDescriptor, args: List<LLVMValueRef>,
|
||||
fun callVirtual(descriptor: IrFunction, args: List<LLVMValueRef>,
|
||||
resultLifetime: Lifetime): LLVMValueRef {
|
||||
|
||||
val function = functionGenerationContext.lookupVirtualImpl(args.first(), descriptor)
|
||||
@@ -2274,7 +2274,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
// instead of a plain list.
|
||||
// In such case it would be possible to check that all args are available and in the correct order.
|
||||
// However, it currently requires some refactoring to be performed.
|
||||
private fun call(descriptor: FunctionDescriptor, function: LLVMValueRef, args: List<LLVMValueRef>,
|
||||
private fun call(descriptor: IrFunction, function: LLVMValueRef, args: List<LLVMValueRef>,
|
||||
resultLifetime: Lifetime): LLVMValueRef {
|
||||
val result = call(function, args, resultLifetime)
|
||||
if (descriptor.returnType.isNothing()) {
|
||||
@@ -2315,7 +2315,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
//-------------------------------------------------------------------------//
|
||||
|
||||
private fun delegatingConstructorCall(
|
||||
descriptor: ClassConstructorDescriptor, args: List<LLVMValueRef>): LLVMValueRef {
|
||||
descriptor: IrConstructor, args: List<LLVMValueRef>): LLVMValueRef {
|
||||
|
||||
val constructedClass = functionGenerationContext.constructedClass!!
|
||||
val thisPtr = currentCodeContext.genGetValue(constructedClass.thisReceiver!!)
|
||||
@@ -2385,7 +2385,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
|
||||
//-------------------------------------------------------------------------//
|
||||
|
||||
private fun appendEntryPointSelector(descriptor: FunctionDescriptor?) {
|
||||
private fun appendEntryPointSelector(descriptor: IrFunction?) {
|
||||
if (descriptor == null) return
|
||||
|
||||
val entryPoint = codegen.llvmFunction(descriptor)
|
||||
|
||||
+22
-22
@@ -36,15 +36,15 @@ enum class UniqueKind(val llvmName: String) {
|
||||
}
|
||||
|
||||
internal class LlvmDeclarations(
|
||||
private val functions: Map<FunctionDescriptor, FunctionLlvmDeclarations>,
|
||||
private val classes: Map<ClassDescriptor, ClassLlvmDeclarations>,
|
||||
private val fields: Map<IrField, FieldLlvmDeclarations>,
|
||||
private val staticFields: Map<IrField, StaticFieldLlvmDeclarations>,
|
||||
private val unique: Map<UniqueKind, UniqueLlvmDeclarations>) {
|
||||
fun forFunction(descriptor: FunctionDescriptor) = functions[descriptor] ?:
|
||||
private val functions: Map<IrFunction, FunctionLlvmDeclarations>,
|
||||
private val classes: Map<IrClass, ClassLlvmDeclarations>,
|
||||
private val fields: Map<IrField, FieldLlvmDeclarations>,
|
||||
private val staticFields: Map<IrField, StaticFieldLlvmDeclarations>,
|
||||
private val unique: Map<UniqueKind, UniqueLlvmDeclarations>) {
|
||||
fun forFunction(descriptor: IrFunction) = functions[descriptor] ?:
|
||||
error("${descriptor.toString()} ${descriptor.name} in ${(descriptor.parent as IrDeclaration).name}")
|
||||
|
||||
fun forClass(descriptor: ClassDescriptor) = classes[descriptor] ?:
|
||||
fun forClass(descriptor: IrClass) = classes[descriptor] ?:
|
||||
error("$descriptor ${descriptor.name}")
|
||||
|
||||
fun forField(descriptor: IrField) = fields[descriptor] ?:
|
||||
@@ -53,7 +53,7 @@ internal class LlvmDeclarations(
|
||||
fun forStaticField(descriptor: IrField) = staticFields[descriptor] ?:
|
||||
error(descriptor.toString())
|
||||
|
||||
fun forSingleton(descriptor: ClassDescriptor) = forClass(descriptor).singletonDeclarations ?:
|
||||
fun forSingleton(descriptor: IrClass) = forClass(descriptor).singletonDeclarations ?:
|
||||
error(descriptor.toString())
|
||||
|
||||
fun forUnique(kind: UniqueKind) = unique[kind] ?: error("No unique $kind")
|
||||
@@ -91,9 +91,9 @@ internal class UniqueLlvmDeclarations(val pointer: ConstPointer)
|
||||
* All fields of the class instance.
|
||||
* The order respects the class hierarchy, i.e. a class [fields] contains superclass [fields] as a prefix.
|
||||
*/
|
||||
internal fun ContextUtils.getFields(classDescriptor: ClassDescriptor) = context.getFields(classDescriptor)
|
||||
internal fun ContextUtils.getFields(classDescriptor: IrClass) = context.getFields(classDescriptor)
|
||||
|
||||
internal fun Context.getFields(classDescriptor: ClassDescriptor): List<IrField> {
|
||||
internal fun Context.getFields(classDescriptor: IrClass): List<IrField> {
|
||||
val superClass = classDescriptor.getSuperClassNotAny() // TODO: what if Any has fields?
|
||||
val superFields = if (superClass != null) getFields(superClass) else emptyList()
|
||||
|
||||
@@ -103,7 +103,7 @@ internal fun Context.getFields(classDescriptor: ClassDescriptor): List<IrField>
|
||||
/**
|
||||
* Fields declared in the class.
|
||||
*/
|
||||
private fun Context.getDeclaredFields(classDescriptor: ClassDescriptor): List<IrField> {
|
||||
private fun Context.getDeclaredFields(classDescriptor: IrClass): List<IrField> {
|
||||
// TODO: Here's what is going on here:
|
||||
// The existence of a backing field for a property is only described in the IR,
|
||||
// but not in the PropertyDescriptor.
|
||||
@@ -147,17 +147,17 @@ private fun ContextUtils.createClassBodyType(name: String, fields: List<IrField>
|
||||
private class DeclarationsGeneratorVisitor(override val context: Context) :
|
||||
IrElementVisitorVoid, ContextUtils {
|
||||
|
||||
val functions = mutableMapOf<FunctionDescriptor, FunctionLlvmDeclarations>()
|
||||
val classes = mutableMapOf<ClassDescriptor, ClassLlvmDeclarations>()
|
||||
val functions = mutableMapOf<IrFunction, FunctionLlvmDeclarations>()
|
||||
val classes = mutableMapOf<IrClass, ClassLlvmDeclarations>()
|
||||
val fields = mutableMapOf<IrField, FieldLlvmDeclarations>()
|
||||
val staticFields = mutableMapOf<IrField, StaticFieldLlvmDeclarations>()
|
||||
val uniques = mutableMapOf<UniqueKind, UniqueLlvmDeclarations>()
|
||||
|
||||
private class Namer(val prefix: String) {
|
||||
private val names = mutableMapOf<DeclarationDescriptor, Name>()
|
||||
private val names = mutableMapOf<IrDeclaration, Name>()
|
||||
private val counts = mutableMapOf<FqName, Int>()
|
||||
|
||||
fun getName(parent: FqName, descriptor: DeclarationDescriptor): Name {
|
||||
fun getName(parent: FqName, descriptor: IrDeclaration): Name {
|
||||
return names.getOrPut(descriptor) {
|
||||
val count = counts.getOrDefault(parent, 0) + 1
|
||||
counts[parent] = count
|
||||
@@ -168,7 +168,7 @@ private class DeclarationsGeneratorVisitor(override val context: Context) :
|
||||
|
||||
val objectNamer = Namer("object-")
|
||||
|
||||
private fun getLocalName(parent: FqName, descriptor: DeclarationDescriptor): Name {
|
||||
private fun getLocalName(parent: FqName, descriptor: IrDeclaration): Name {
|
||||
if (descriptor.isAnonymousObject) {
|
||||
return objectNamer.getName(parent, descriptor)
|
||||
}
|
||||
@@ -176,7 +176,7 @@ private class DeclarationsGeneratorVisitor(override val context: Context) :
|
||||
return descriptor.name
|
||||
}
|
||||
|
||||
private fun getFqName(descriptor: DeclarationDescriptor): FqName {
|
||||
private fun getFqName(descriptor: IrDeclaration): FqName {
|
||||
val parent = descriptor.parent
|
||||
val parentFqName = when (parent) {
|
||||
is IrPackageFragment -> parent.fqName
|
||||
@@ -194,7 +194,7 @@ private class DeclarationsGeneratorVisitor(override val context: Context) :
|
||||
* Note: since these declarations are going to be private, the name is only required not to clash with any
|
||||
* exported declarations.
|
||||
*/
|
||||
private fun qualifyInternalName(descriptor: DeclarationDescriptor): String {
|
||||
private fun qualifyInternalName(descriptor: IrDeclaration): String {
|
||||
return getFqName(descriptor).asString() + "#internal"
|
||||
}
|
||||
|
||||
@@ -295,7 +295,7 @@ private class DeclarationsGeneratorVisitor(override val context: Context) :
|
||||
}
|
||||
|
||||
private fun createUniqueDeclarations(
|
||||
descriptor: ClassDescriptor, typeInfoPtr: ConstPointer, bodyType: LLVMTypeRef) {
|
||||
descriptor: IrClass, typeInfoPtr: ConstPointer, bodyType: LLVMTypeRef) {
|
||||
when {
|
||||
descriptor.isUnit() -> {
|
||||
uniques[UniqueKind.UNIT] =
|
||||
@@ -309,7 +309,7 @@ private class DeclarationsGeneratorVisitor(override val context: Context) :
|
||||
}
|
||||
}
|
||||
|
||||
private fun createSingletonDeclarations(descriptor: ClassDescriptor): SingletonLlvmDeclarations? {
|
||||
private fun createSingletonDeclarations(descriptor: IrClass): SingletonLlvmDeclarations? {
|
||||
|
||||
if (descriptor.isUnit()) {
|
||||
return null
|
||||
@@ -343,7 +343,7 @@ private class DeclarationsGeneratorVisitor(override val context: Context) :
|
||||
return SingletonLlvmDeclarations(instanceFieldRef, instanceShadowFieldRef)
|
||||
}
|
||||
|
||||
private fun createKotlinObjCClassDeclarations(descriptor: ClassDescriptor): KotlinObjCClassLlvmDeclarations {
|
||||
private fun createKotlinObjCClassDeclarations(descriptor: IrClass): KotlinObjCClassLlvmDeclarations {
|
||||
val internalName = qualifyInternalName(descriptor)
|
||||
|
||||
val classPointerGlobal = staticData.createGlobal(int8TypePtr, "kobjcclassptr:$internalName")
|
||||
@@ -393,7 +393,7 @@ private class DeclarationsGeneratorVisitor(override val context: Context) :
|
||||
val descriptor = declaration
|
||||
val llvmFunctionType = getLlvmFunctionType(descriptor)
|
||||
|
||||
if ((descriptor is ConstructorDescriptor && descriptor.isObjCConstructor)) {
|
||||
if ((descriptor is IrConstructor && descriptor.isObjCConstructor)) {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
+14
-12
@@ -12,7 +12,9 @@ import org.jetbrains.kotlin.backend.konan.computePrimitiveBinaryTypeOrNull
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.*
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.*
|
||||
import org.jetbrains.kotlin.backend.konan.isExternalObjCClassMethod
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrField
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.IrProperty
|
||||
import org.jetbrains.kotlin.ir.types.*
|
||||
import org.jetbrains.kotlin.ir.util.isAnnotationClass
|
||||
@@ -44,14 +46,14 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkAcyclicClass(classDescriptor: ClassDescriptor): Boolean = when {
|
||||
private fun checkAcyclicClass(classDescriptor: IrClass): Boolean = when {
|
||||
classDescriptor.symbol == context.ir.symbols.array -> false
|
||||
classDescriptor.isArray -> true
|
||||
context.llvmDeclarations.forClass(classDescriptor).fields.all { checkAcyclicFieldType(it.type) } -> true
|
||||
else -> false
|
||||
}
|
||||
|
||||
private fun flagsFromClass(classDescriptor: ClassDescriptor): Int {
|
||||
private fun flagsFromClass(classDescriptor: IrClass): Int {
|
||||
var result = 0
|
||||
if (classDescriptor.isFrozen)
|
||||
result = result or TF_IMMUTABLE
|
||||
@@ -123,7 +125,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
|
||||
private val EXPORT_TYPE_INFO_FQ_NAME = FqName.fromSegments(listOf("kotlin", "native", "internal", "ExportTypeInfo"))
|
||||
|
||||
private fun exportTypeInfoIfRequired(classDesc: ClassDescriptor, typeInfoGlobal: LLVMValueRef?) {
|
||||
private fun exportTypeInfoIfRequired(classDesc: IrClass, typeInfoGlobal: LLVMValueRef?) {
|
||||
val annot = classDesc.descriptor.annotations.findAnnotation(EXPORT_TYPE_INFO_FQ_NAME)
|
||||
if (annot != null) {
|
||||
val name = getAnnotationValue(annot)!!
|
||||
@@ -168,7 +170,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
return LLVMStoreSizeOfType(llvmTargetData, classType).toInt()
|
||||
}
|
||||
|
||||
fun generate(classDesc: ClassDescriptor) {
|
||||
fun generate(classDesc: IrClass) {
|
||||
|
||||
val className = classDesc.fqNameSafe
|
||||
|
||||
@@ -241,7 +243,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
exportTypeInfoIfRequired(classDesc, classDesc.llvmTypeInfoPtr)
|
||||
}
|
||||
|
||||
fun vtable(classDesc: ClassDescriptor): ConstArray {
|
||||
fun vtable(classDesc: IrClass): ConstArray {
|
||||
// TODO: compile-time resolution limits binary compatibility
|
||||
val vtableEntries = context.getVtableBuilder(classDesc).vtableEntries.map {
|
||||
val implementation = it.implementation
|
||||
@@ -254,7 +256,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
return ConstArray(int8TypePtr, vtableEntries)
|
||||
}
|
||||
|
||||
fun methodTableRecords(classDesc: ClassDescriptor): List<MethodTableRecord> {
|
||||
fun methodTableRecords(classDesc: IrClass): List<MethodTableRecord> {
|
||||
val functionNames = mutableMapOf<Long, OverriddenFunctionDescriptor>()
|
||||
return context.getVtableBuilder(classDesc).methodTableEntries.map {
|
||||
val functionName = it.overriddenDescriptor.functionName
|
||||
@@ -273,7 +275,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
private fun mapRuntimeType(type: LLVMTypeRef): Int =
|
||||
runtimeTypeMap[type] ?: throw Error("Unmapped type: ${llvmtype2string(type)}")
|
||||
|
||||
private fun makeExtendedInfo(descriptor: ClassDescriptor): ConstPointer {
|
||||
private fun makeExtendedInfo(descriptor: IrClass): ConstPointer {
|
||||
// TODO: shall we actually do that?
|
||||
if (context.shouldOptimize())
|
||||
return NullPointer(runtime.extendedTypeInfoType)
|
||||
@@ -311,9 +313,9 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
|
||||
// TODO: extract more code common with generate().
|
||||
fun generateSyntheticInterfaceImpl(
|
||||
descriptor: ClassDescriptor,
|
||||
methodImpls: Map<FunctionDescriptor, ConstPointer>,
|
||||
immutable: Boolean = false
|
||||
descriptor: IrClass,
|
||||
methodImpls: Map<IrFunction, ConstPointer>,
|
||||
immutable: Boolean = false
|
||||
): ConstPointer {
|
||||
assert(descriptor.isInterface)
|
||||
|
||||
@@ -377,7 +379,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
|
||||
data class ReflectionInfo(val packageName: String?, val relativeName: String?)
|
||||
|
||||
private fun getReflectionInfo(descriptor: ClassDescriptor): ReflectionInfo {
|
||||
private fun getReflectionInfo(descriptor: IrClass): ReflectionInfo {
|
||||
return if (descriptor.isAnonymousObject) {
|
||||
ReflectionInfo(packageName = null, relativeName = null)
|
||||
} else if (descriptor.isLocal) {
|
||||
@@ -385,7 +387,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
} else {
|
||||
ReflectionInfo(
|
||||
packageName = descriptor.findPackage().fqName.asString(),
|
||||
relativeName = generateSequence(descriptor, { it.parent as? ClassDescriptor })
|
||||
relativeName = generateSequence(descriptor, { it.parent as? IrClass })
|
||||
.toList().reversed()
|
||||
.joinToString(".") { it.name.asString() }
|
||||
)
|
||||
|
||||
+9
-8
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.common.ir.ir2string
|
||||
import org.jetbrains.kotlin.backend.konan.Context
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.*
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrValueDeclaration
|
||||
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
|
||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -45,7 +46,7 @@ internal class VariableManager(val functionGenerationContext: FunctionGeneration
|
||||
}
|
||||
|
||||
val variables: ArrayList<Record> = arrayListOf()
|
||||
val contextVariablesToIndex: HashMap<ValueDescriptor, Int> = hashMapOf()
|
||||
val contextVariablesToIndex: HashMap<IrValueDeclaration, Int> = hashMapOf()
|
||||
|
||||
// Clears inner state of variable manager.
|
||||
fun clear() {
|
||||
@@ -53,8 +54,8 @@ internal class VariableManager(val functionGenerationContext: FunctionGeneration
|
||||
contextVariablesToIndex.clear()
|
||||
}
|
||||
|
||||
fun createVariable(descriptor: ValueDescriptor, value: LLVMValueRef? = null, variableLocation: VariableDebugLocation?) : Int {
|
||||
val isVar = descriptor is VariableDescriptor && descriptor.isVar
|
||||
fun createVariable(descriptor: IrValueDeclaration, value: LLVMValueRef? = null, variableLocation: VariableDebugLocation?) : Int {
|
||||
val isVar = descriptor is IrVariable && descriptor.isVar
|
||||
// Note that we always create slot for object references for memory management.
|
||||
if (!functionGenerationContext.context.shouldContainDebugInfo() && !isVar && value != null)
|
||||
return createImmutable(descriptor, value)
|
||||
@@ -66,8 +67,8 @@ internal class VariableManager(val functionGenerationContext: FunctionGeneration
|
||||
return createMutable(descriptor, isVar, value, variableLocation)
|
||||
}
|
||||
|
||||
internal fun createMutable(descriptor: ValueDescriptor,
|
||||
isVar: Boolean, value: LLVMValueRef? = null, variableLocation: VariableDebugLocation?) : Int {
|
||||
internal fun createMutable(descriptor: IrValueDeclaration,
|
||||
isVar: Boolean, value: LLVMValueRef? = null, variableLocation: VariableDebugLocation?) : Int {
|
||||
assert(!contextVariablesToIndex.contains(descriptor))
|
||||
val index = variables.size
|
||||
val type = functionGenerationContext.getLLVMType(descriptor.type)
|
||||
@@ -80,7 +81,7 @@ internal class VariableManager(val functionGenerationContext: FunctionGeneration
|
||||
}
|
||||
|
||||
internal var skip = 0
|
||||
internal fun createParameter(descriptor: ValueDescriptor, variableLocation: VariableDebugLocation?) : Int {
|
||||
internal fun createParameter(descriptor: IrValueDeclaration, variableLocation: VariableDebugLocation?) : Int {
|
||||
assert(!contextVariablesToIndex.contains(descriptor))
|
||||
val index = variables.size
|
||||
val type = functionGenerationContext.getLLVMType(descriptor.type)
|
||||
@@ -109,7 +110,7 @@ internal class VariableManager(val functionGenerationContext: FunctionGeneration
|
||||
return index
|
||||
}
|
||||
|
||||
internal fun createImmutable(descriptor: ValueDescriptor, value: LLVMValueRef) : Int {
|
||||
internal fun createImmutable(descriptor: IrValueDeclaration, value: LLVMValueRef) : Int {
|
||||
if (contextVariablesToIndex.containsKey(descriptor))
|
||||
throw Error("${ir2string(descriptor)} is already defined")
|
||||
val index = variables.size
|
||||
@@ -118,7 +119,7 @@ internal class VariableManager(val functionGenerationContext: FunctionGeneration
|
||||
return index
|
||||
}
|
||||
|
||||
fun indexOf(descriptor: ValueDescriptor) : Int {
|
||||
fun indexOf(descriptor: IrValueDeclaration) : Int {
|
||||
return contextVariablesToIndex.getOrElse(descriptor) { -1 }
|
||||
}
|
||||
|
||||
|
||||
+19
-19
@@ -33,7 +33,7 @@ import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
private fun IrClass.getOverridingOf(function: FunctionDescriptor) = (function as? IrSimpleFunction)?.let {
|
||||
private fun IrClass.getOverridingOf(function: IrFunction) = (function as? IrSimpleFunction)?.let {
|
||||
it.allOverriddenDescriptors.atMostOne { it.parent == this }
|
||||
}
|
||||
|
||||
@@ -42,18 +42,18 @@ private fun IrTypeOperator.isCast() =
|
||||
|
||||
|
||||
private class VariableValues {
|
||||
val elementData = HashMap<VariableDescriptor, MutableSet<IrExpression>>()
|
||||
val elementData = HashMap<IrVariable, MutableSet<IrExpression>>()
|
||||
|
||||
fun addEmpty(variable: VariableDescriptor) =
|
||||
fun addEmpty(variable: IrVariable) =
|
||||
elementData.getOrPut(variable, { mutableSetOf() })
|
||||
|
||||
fun add(variable: VariableDescriptor, element: IrExpression) =
|
||||
fun add(variable: IrVariable, element: IrExpression) =
|
||||
elementData[variable]?.add(element)
|
||||
|
||||
fun add(variable: VariableDescriptor, elements: Set<IrExpression>) =
|
||||
fun add(variable: IrVariable, elements: Set<IrExpression>) =
|
||||
elementData[variable]?.addAll(elements)
|
||||
|
||||
fun get(variable: VariableDescriptor): Set<IrExpression>? =
|
||||
fun get(variable: IrVariable): Set<IrExpression>? =
|
||||
elementData[variable]
|
||||
|
||||
fun computeClosure() {
|
||||
@@ -63,14 +63,14 @@ private class VariableValues {
|
||||
}
|
||||
|
||||
// Computes closure of all possible values for given variable.
|
||||
private fun computeValueClosure(value: VariableDescriptor): Set<IrExpression> {
|
||||
private fun computeValueClosure(value: IrVariable): Set<IrExpression> {
|
||||
val result = mutableSetOf<IrExpression>()
|
||||
val seen = mutableSetOf<VariableDescriptor>()
|
||||
val seen = mutableSetOf<IrVariable>()
|
||||
dfs(value, seen, result)
|
||||
return result
|
||||
}
|
||||
|
||||
private fun dfs(value: VariableDescriptor, seen: MutableSet<VariableDescriptor>, result: MutableSet<IrExpression>) {
|
||||
private fun dfs(value: IrVariable, seen: MutableSet<IrVariable>, result: MutableSet<IrExpression>) {
|
||||
seen += value
|
||||
val elements = elementData[value]
|
||||
?: return
|
||||
@@ -79,7 +79,7 @@ private class VariableValues {
|
||||
result += element
|
||||
else {
|
||||
val descriptor = element.symbol.owner
|
||||
if (descriptor is VariableDescriptor && !seen.contains(descriptor))
|
||||
if (descriptor is IrVariable && !seen.contains(descriptor))
|
||||
dfs(descriptor, seen, result)
|
||||
}
|
||||
}
|
||||
@@ -230,7 +230,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
}
|
||||
}
|
||||
|
||||
private fun analyze(descriptor: DeclarationDescriptor, body: IrElement?) {
|
||||
private fun analyze(descriptor: IrDeclaration, body: IrElement?) {
|
||||
// Find all interesting expressions, variables and functions.
|
||||
val visitor = ElementFinderVisitor()
|
||||
body?.acceptVoid(visitor)
|
||||
@@ -297,7 +297,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
val variableValues = VariableValues()
|
||||
val returnValues = mutableListOf<IrExpression>()
|
||||
val thrownValues = mutableListOf<IrExpression>()
|
||||
val catchParameters = mutableSetOf<VariableDescriptor>()
|
||||
val catchParameters = mutableSetOf<IrVariable>()
|
||||
|
||||
private val suspendableExpressionStack = mutableListOf<IrSuspendableExpression>()
|
||||
|
||||
@@ -305,7 +305,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
element.acceptChildrenVoid(this)
|
||||
}
|
||||
|
||||
private fun assignVariable(variable: VariableDescriptor, value: IrExpression) {
|
||||
private fun assignVariable(variable: IrVariable, value: IrExpression) {
|
||||
expressionValuesExtractor.forEachValue(value) {
|
||||
variableValues.add(variable, it)
|
||||
}
|
||||
@@ -410,13 +410,13 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
|
||||
private inner class FunctionDFGBuilder(val expressionValuesExtractor: ExpressionValuesExtractor,
|
||||
val variableValues: VariableValues,
|
||||
val descriptor: DeclarationDescriptor,
|
||||
val descriptor: IrDeclaration,
|
||||
val expressions: List<IrExpression>,
|
||||
val returnValues: List<IrExpression>,
|
||||
val thrownValues: List<IrExpression>,
|
||||
val catchParameters: Set<VariableDescriptor>) {
|
||||
val catchParameters: Set<IrVariable>) {
|
||||
|
||||
private val allParameters = (descriptor as? FunctionDescriptor)?.allParameters ?: emptyList()
|
||||
private val allParameters = (descriptor as? IrFunction)?.allParameters ?: emptyList()
|
||||
private val templateParameters = allParameters.withIndex().associateBy({ it.value }, { DataFlowIR.Node.Parameter(it.index) })
|
||||
|
||||
private val continuationParameter = when {
|
||||
@@ -570,7 +570,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
else
|
||||
it
|
||||
}
|
||||
if (callee is ConstructorDescriptor) {
|
||||
if (callee is IrConstructor) {
|
||||
DataFlowIR.Node.NewObject(
|
||||
symbolTable.mapFunction(callee),
|
||||
arguments,
|
||||
@@ -580,7 +580,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
} else {
|
||||
callee as IrSimpleFunction
|
||||
if (callee.isOverridable && value.superQualifier == null) {
|
||||
val owner = callee.containingDeclaration as ClassDescriptor
|
||||
val owner = callee.containingDeclaration as IrClass
|
||||
val actualReceiverType = value.dispatchReceiver!!.type
|
||||
val actualReceiverClassifier = actualReceiverType.classifierOrFail
|
||||
|
||||
@@ -634,7 +634,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
}
|
||||
|
||||
is IrDelegatingConstructorCall -> {
|
||||
val thisReceiver = (descriptor as ConstructorDescriptor).constructedClass.thisReceiver!!
|
||||
val thisReceiver = (descriptor as IrConstructor).constructedClass.thisReceiver!!
|
||||
val thiz = IrGetValueImpl(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, thisReceiver.type,
|
||||
thisReceiver.symbol)
|
||||
val arguments = listOf(thiz) + value.getArguments().map { it.second }
|
||||
|
||||
+16
-16
@@ -441,9 +441,9 @@ internal object DataFlowIR {
|
||||
|
||||
private inline fun takeName(block: () -> String) = if (TAKE_NAMES) block() else null
|
||||
|
||||
val classMap = mutableMapOf<ClassDescriptor, Type>()
|
||||
val classMap = mutableMapOf<IrClass, Type>()
|
||||
val primitiveMap = mutableMapOf<PrimitiveBinaryType, Type>()
|
||||
val functionMap = mutableMapOf<DeclarationDescriptor, FunctionSymbol>()
|
||||
val functionMap = mutableMapOf<IrDeclaration, FunctionSymbol>()
|
||||
|
||||
private val NAME_ESCAPES = Name.identifier("Escapes")
|
||||
private val NAME_POINTS_TO = Name.identifier("PointsTo")
|
||||
@@ -488,9 +488,9 @@ internal object DataFlowIR {
|
||||
}, data = null)
|
||||
}
|
||||
|
||||
private fun ClassDescriptor.isFinal() = modality == Modality.FINAL && kind != ClassKind.ENUM_CLASS
|
||||
private fun IrClass.isFinal() = modality == Modality.FINAL && kind != ClassKind.ENUM_CLASS
|
||||
|
||||
fun mapClassReferenceType(descriptor: ClassDescriptor, eraseLocalObjects: Boolean = true): Type {
|
||||
fun mapClassReferenceType(descriptor: IrClass, eraseLocalObjects: Boolean = true): Type {
|
||||
// Do not try to devirtualize ObjC classes.
|
||||
if (descriptor.module.name == Name.special("<forward declarations>") || descriptor.isObjCClass())
|
||||
return Type.Virtual
|
||||
@@ -530,7 +530,7 @@ internal object DataFlowIR {
|
||||
return type
|
||||
}
|
||||
|
||||
private fun choosePrimary(erasure: List<ClassDescriptor>): ClassDescriptor {
|
||||
private fun choosePrimary(erasure: List<IrClass>): IrClass {
|
||||
if (erasure.size == 1) return erasure[0]
|
||||
// A parameter with constraints - choose class if exists.
|
||||
return erasure.singleOrNull { !it.isInterface } ?: context.ir.symbols.any.owner
|
||||
@@ -564,22 +564,22 @@ internal object DataFlowIR {
|
||||
}
|
||||
|
||||
// TODO: use from LlvmDeclarations.
|
||||
private fun getFqName(descriptor: DeclarationDescriptor): FqName =
|
||||
private fun getFqName(descriptor: IrDeclaration): FqName =
|
||||
descriptor.parent.fqNameSafe.child(descriptor.name)
|
||||
|
||||
private val FunctionDescriptor.internalName get() = getFqName(this).asString() + "#internal"
|
||||
private val IrFunction.internalName get() = getFqName(this).asString() + "#internal"
|
||||
|
||||
fun mapFunction(descriptor: DeclarationDescriptor): FunctionSymbol = when (descriptor) {
|
||||
is FunctionDescriptor -> mapFunction(descriptor)
|
||||
fun mapFunction(descriptor: IrDeclaration): FunctionSymbol = when (descriptor) {
|
||||
is IrFunction -> mapFunction(descriptor)
|
||||
is IrField -> mapPropertyInitializer(descriptor)
|
||||
else -> error("Unknown descriptor: $descriptor")
|
||||
}
|
||||
|
||||
private fun mapFunction(descriptor: FunctionDescriptor): FunctionSymbol = descriptor.target.let {
|
||||
private fun mapFunction(descriptor: IrFunction): FunctionSymbol = descriptor.target.let {
|
||||
functionMap[it]?.let { return it }
|
||||
|
||||
val name = if (it.isExported()) it.symbolName else it.internalName
|
||||
val returnsUnit = it is ConstructorDescriptor || (!it.isSuspend && it.returnType.isUnit())
|
||||
val returnsUnit = it is IrConstructor || (!it.isSuspend && it.returnType.isUnit())
|
||||
val returnsNothing = !it.isSuspend && it.returnType.isNothing()
|
||||
var attributes = 0
|
||||
if (returnsUnit)
|
||||
@@ -602,13 +602,13 @@ internal object DataFlowIR {
|
||||
|
||||
else -> {
|
||||
val isAbstract = it is IrSimpleFunction && it.modality == Modality.ABSTRACT
|
||||
val classDescriptor = it.containingDeclaration as? ClassDescriptor
|
||||
val classDescriptor = it.containingDeclaration as? IrClass
|
||||
val bridgeTarget = it.bridgeTarget
|
||||
val isSpecialBridge = bridgeTarget.let {
|
||||
it != null && BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(it.descriptor) != null
|
||||
}
|
||||
val bridgeTargetSymbol = if (isSpecialBridge || bridgeTarget == null) null else mapFunction(bridgeTarget)
|
||||
val placeToFunctionsTable = !isAbstract && it !is ConstructorDescriptor && classDescriptor != null
|
||||
val placeToFunctionsTable = !isAbstract && it !is IrConstructor && classDescriptor != null
|
||||
&& !classDescriptor.isNonGeneratedAnnotation()
|
||||
&& (it.isOverridableOrOverrides || bridgeTarget != null || descriptor.isSpecial || !classDescriptor.isFinal())
|
||||
val symbolTableIndex = if (placeToFunctionsTable) module.numberOfFunctions++ else -1
|
||||
@@ -632,7 +632,7 @@ internal object DataFlowIR {
|
||||
return symbol
|
||||
}
|
||||
|
||||
private val FunctionDescriptor.isSpecial get() =
|
||||
private val IrFunction.isSpecial get() =
|
||||
name.asString().let { it.startsWith("<bridge-") || it == "<box>" || it == "<unbox>" }
|
||||
|
||||
private fun mapPropertyInitializer(descriptor: IrField): FunctionSymbol = descriptor.original.let {
|
||||
@@ -652,7 +652,7 @@ internal object DataFlowIR {
|
||||
fun getPrivateFunctionsTableForExport() =
|
||||
functionMap
|
||||
.asSequence()
|
||||
.filter { it.key is FunctionDescriptor }
|
||||
.filter { it.key is IrFunction }
|
||||
.filter { it.value.let { it is DataFlowIR.FunctionSymbol.Declared && it.symbolTableIndex >= 0 } }
|
||||
.sortedBy { (it.value as DataFlowIR.FunctionSymbol.Declared).symbolTableIndex }
|
||||
.apply {
|
||||
@@ -660,7 +660,7 @@ internal object DataFlowIR {
|
||||
assert((entry.value as DataFlowIR.FunctionSymbol.Declared).symbolTableIndex == index) { "Inconsistent function table" }
|
||||
}
|
||||
}
|
||||
.map { (it.key as FunctionDescriptor) to (it.value as DataFlowIR.FunctionSymbol.Declared) }
|
||||
.map { (it.key as IrFunction) to (it.value as DataFlowIR.FunctionSymbol.Declared) }
|
||||
.toList()
|
||||
|
||||
fun getPrivateClassesTableForExport() =
|
||||
|
||||
Reference in New Issue
Block a user