CODEGEN: add initializer in place and reference to GET_OBJECT
This commit is contained in:
committed by
vvlevchenko
parent
240a87d0ac
commit
3646ab7825
+21
-9
@@ -283,6 +283,11 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
constructorDeclaration.acceptChildrenVoid(this)
|
constructorDeclaration.acceptChildrenVoid(this)
|
||||||
|
|
||||||
if (constructorDescriptor.isPrimary) {
|
if (constructorDescriptor.isPrimary) {
|
||||||
|
if (DescriptorUtils.isObject(classDescriptor)) {
|
||||||
|
val objectPtr = objectPtrByName(classDescriptor)
|
||||||
|
|
||||||
|
LLVMSetInitializer(objectPtr, codegen.kNullObjHeaderPtr)
|
||||||
|
}
|
||||||
val irOfCurrentClass = context.moduleIndex.classes[classDescriptor.classId]
|
val irOfCurrentClass = context.moduleIndex.classes[classDescriptor.classId]
|
||||||
irOfCurrentClass!!.acceptChildrenVoid(object : IrElementVisitorVoid {
|
irOfCurrentClass!!.acceptChildrenVoid(object : IrElementVisitorVoid {
|
||||||
override fun visitElement(element: IrElement) {
|
override fun visitElement(element: IrElement) {
|
||||||
@@ -616,15 +621,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
private fun evaluateGetObjectValue(tmpVariableName: String, value: IrGetObjectValue): LLVMValueRef? {
|
private fun evaluateGetObjectValue(tmpVariableName: String, value: IrGetObjectValue): LLVMValueRef? {
|
||||||
val objName = value.descriptor.fqNameSafe.asString()
|
var objectPtr = objectPtrByName(value.descriptor)
|
||||||
var objectPtr = LLVMGetNamedGlobal(context.llvmModule, objName)
|
|
||||||
if (objectPtr == null) {
|
|
||||||
objectPtr = LLVMAddGlobal(context.llvmModule, codegen.getLLVMType(value.type), objName)
|
|
||||||
LLVMSetInitializer(objectPtr, codegen.kNullObjHeaderPtr)
|
|
||||||
// Backing storage for this global is common between all modules.
|
|
||||||
LLVMSetLinkage(objectPtr, LLVMLinkage.LLVMCommonLinkage)
|
|
||||||
}
|
|
||||||
|
|
||||||
val bbCurrent = codegen.currentBlock
|
val bbCurrent = codegen.currentBlock
|
||||||
val bbInit = codegen.basicBlock("label_init")
|
val bbInit = codegen.basicBlock("label_init")
|
||||||
val bbExit = codegen.basicBlock("label_continue")
|
val bbExit = codegen.basicBlock("label_continue")
|
||||||
@@ -651,6 +648,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
return valuePhi
|
return valuePhi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
private fun evaluateExpressionAndJump(expression: IrExpression, destination: ContinuationBlock) {
|
private fun evaluateExpressionAndJump(expression: IrExpression, destination: ContinuationBlock) {
|
||||||
@@ -1318,6 +1316,20 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
private fun objectPtrByName(descriptor: ClassDescriptor): LLVMValueRef? {
|
||||||
|
val objName = descriptor.fqNameSafe.asString()
|
||||||
|
var objectPtr = LLVMGetNamedGlobal(context.llvmModule, objName)
|
||||||
|
if (objectPtr == null) {
|
||||||
|
val llvmType = codegen.getLLVMType(descriptor.defaultType)
|
||||||
|
objectPtr = LLVMAddGlobal(context.llvmModule, llvmType, objName)
|
||||||
|
}
|
||||||
|
return objectPtr
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
private fun instanceFieldAccessReceiver(expression: IrFieldAccessExpression): LLVMValueRef {
|
private fun instanceFieldAccessReceiver(expression: IrFieldAccessExpression): LLVMValueRef {
|
||||||
val receiverExpression = expression.receiver
|
val receiverExpression = expression.receiver
|
||||||
if (receiverExpression != null) {
|
if (receiverExpression != null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user