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.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
import org.jetbrains.kotlin.types.typeUtil.isUnit
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
/**
|
||||
@@ -147,3 +148,5 @@ internal val FunctionDescriptor.isFunctionInvoke: Boolean
|
||||
return dispatchReceiver.type.isFunctionType &&
|
||||
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 (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]
|
||||
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)
|
||||
val bbCurrent = codegen.currentBlock
|
||||
val bbInit = codegen.basicBlock("label_init")
|
||||
@@ -1421,6 +1429,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
||||
//-------------------------------------------------------------------------//
|
||||
|
||||
private fun objectPtrByName(descriptor: ClassDescriptor): LLVMValueRef? {
|
||||
assert (!descriptor.isUnit())
|
||||
val objName = descriptor.fqNameSafe.asString()
|
||||
var objectPtr = LLVMGetNamedGlobal(context.llvmModule, objName)
|
||||
if (objectPtr == null) {
|
||||
|
||||
+15
@@ -2,6 +2,7 @@ package org.jetbrains.kotlin.backend.konan.llvm
|
||||
|
||||
import llvm.*
|
||||
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.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.ir.expressions.IrConst
|
||||
@@ -115,3 +116,17 @@ internal fun StaticData.createArrayList(elementType: TypeProjection, array: Cons
|
||||
|
||||
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