backend: statically instantiate kotlin.Unit
and optimize IrGetObjectValue(Unit)
This commit is contained in:
committed by
SvyatoslavScherbina
parent
462d2b5123
commit
9a3bcd4c19
+3
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.*
|
|||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.TypeUtils
|
import org.jetbrains.kotlin.types.TypeUtils
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isUnit
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -147,3 +148,5 @@ internal val FunctionDescriptor.isFunctionInvoke: Boolean
|
|||||||
return dispatchReceiver.type.isFunctionType &&
|
return dispatchReceiver.type.isFunctionType &&
|
||||||
this.isOperator && this.name == OperatorNameConventions.INVOKE
|
this.isOperator && this.name == OperatorNameConventions.INVOKE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun ClassDescriptor.isUnit() = this.defaultType.isUnit()
|
||||||
|
|||||||
+12
-3
@@ -395,9 +395,13 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
|
|
||||||
if (constructorDescriptor.isPrimary) {
|
if (constructorDescriptor.isPrimary) {
|
||||||
if (DescriptorUtils.isObject(classDescriptor)) {
|
if (DescriptorUtils.isObject(classDescriptor)) {
|
||||||
val objectPtr = objectPtrByName(classDescriptor)
|
if (classDescriptor.isUnit()) {
|
||||||
|
context.llvm.staticData.createUnitInstance(classDescriptor)
|
||||||
|
} else {
|
||||||
|
val objectPtr = objectPtrByName(classDescriptor)
|
||||||
|
|
||||||
LLVMSetInitializer(objectPtr, codegen.kNullObjHeaderPtr)
|
LLVMSetInitializer(objectPtr, codegen.kNullObjHeaderPtr)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
val irOfCurrentClass = context.ir.moduleIndex.classes[classDescriptor.classId]
|
val irOfCurrentClass = context.ir.moduleIndex.classes[classDescriptor.classId]
|
||||||
irOfCurrentClass!!.acceptChildrenVoid(object : IrElementVisitorVoid {
|
irOfCurrentClass!!.acceptChildrenVoid(object : IrElementVisitorVoid {
|
||||||
@@ -732,7 +736,11 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
|
|
||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
private fun evaluateGetObjectValue(value: IrGetObjectValue): LLVMValueRef? {
|
private fun evaluateGetObjectValue(value: IrGetObjectValue): LLVMValueRef {
|
||||||
|
if (value.descriptor.isUnit()) {
|
||||||
|
return codegen.theUnitInstanceRef.llvm
|
||||||
|
}
|
||||||
|
|
||||||
var objectPtr = objectPtrByName(value.descriptor)
|
var objectPtr = objectPtrByName(value.descriptor)
|
||||||
val bbCurrent = codegen.currentBlock
|
val bbCurrent = codegen.currentBlock
|
||||||
val bbInit = codegen.basicBlock("label_init")
|
val bbInit = codegen.basicBlock("label_init")
|
||||||
@@ -1421,6 +1429,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
private fun objectPtrByName(descriptor: ClassDescriptor): LLVMValueRef? {
|
private fun objectPtrByName(descriptor: ClassDescriptor): LLVMValueRef? {
|
||||||
|
assert (!descriptor.isUnit())
|
||||||
val objName = descriptor.fqNameSafe.asString()
|
val objName = descriptor.fqNameSafe.asString()
|
||||||
var objectPtr = LLVMGetNamedGlobal(context.llvmModule, objName)
|
var objectPtr = LLVMGetNamedGlobal(context.llvmModule, objName)
|
||||||
if (objectPtr == null) {
|
if (objectPtr == null) {
|
||||||
|
|||||||
+15
@@ -2,6 +2,7 @@ package org.jetbrains.kotlin.backend.konan.llvm
|
|||||||
|
|
||||||
import llvm.*
|
import llvm.*
|
||||||
import org.jetbrains.kotlin.backend.konan.KonanPlatform
|
import org.jetbrains.kotlin.backend.konan.KonanPlatform
|
||||||
|
import org.jetbrains.kotlin.backend.konan.descriptors.isUnit
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrConst
|
import org.jetbrains.kotlin.ir.expressions.IrConst
|
||||||
@@ -115,3 +116,17 @@ internal fun StaticData.createArrayList(elementType: TypeProjection, array: Cons
|
|||||||
|
|
||||||
return createKotlinObject(type, body)
|
return createKotlinObject(type, body)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val theUnitInstanceName = "kobj:kotlin.Unit"
|
||||||
|
|
||||||
|
internal fun StaticData.createUnitInstance(descriptor: ClassDescriptor): ConstPointer {
|
||||||
|
assert (descriptor.isUnit())
|
||||||
|
assert (descriptor.fields.isEmpty())
|
||||||
|
val typeInfo = descriptor.defaultType.typeInfoPtr!!
|
||||||
|
val objHeader = objHeader(typeInfo)
|
||||||
|
val global = this.placeGlobal(theUnitInstanceName, objHeader)
|
||||||
|
return global.pointer
|
||||||
|
}
|
||||||
|
|
||||||
|
internal val ContextUtils.theUnitInstanceRef: ConstPointer
|
||||||
|
get() = constPointer(externalGlobal(theUnitInstanceName, context.llvm.runtime.objHeaderType))
|
||||||
Reference in New Issue
Block a user