backend: statically instantiate kotlin.Unit

and optimize IrGetObjectValue(Unit)
This commit is contained in:
Svyatoslav Scherbina
2016-12-26 17:13:13 +07:00
committed by SvyatoslavScherbina
parent 462d2b5123
commit 9a3bcd4c19
3 changed files with 30 additions and 3 deletions
@@ -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()
@@ -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) {
@@ -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))