Fixed bug with globals deinitialization

This commit is contained in:
Igor Chevdar
2017-08-28 11:05:17 +03:00
parent 9fdf30fc66
commit 1d434899cb
@@ -360,13 +360,15 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
} }
appendingTo(bbInit) { appendingTo(bbInit) {
context.llvm.fileInitializers.forEach { context.llvm.fileInitializers
val irField = it as IrField .map { it as IrField }
val descriptor = irField.descriptor .filterNot { it.initializer is IrConst<*> }
val initialization = evaluateExpression(irField.initializer!!.expression) .forEach {
val globalPtr = context.llvmDeclarations.forStaticField(descriptor).storage val descriptor = it.descriptor
storeAnyGlobal(initialization, globalPtr) val initialization = evaluateExpression(it.initializer!!.expression)
} val globalPtr = context.llvmDeclarations.forStaticField(descriptor).storage
storeAnyGlobal(initialization, globalPtr)
}
ret(null) ret(null)
} }
} }
@@ -668,8 +670,8 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
LLVMSetInitializer(globalProperty, evaluateExpression(declaration.initializer!!.expression)) LLVMSetInitializer(globalProperty, evaluateExpression(declaration.initializer!!.expression))
} else { } else {
LLVMSetInitializer(globalProperty, LLVMConstNull(type)) LLVMSetInitializer(globalProperty, LLVMConstNull(type))
context.llvm.fileInitializers.add(declaration)
} }
context.llvm.fileInitializers.add(declaration)
LLVMSetLinkage(globalProperty, LLVMLinkage.LLVMInternalLinkage) LLVMSetLinkage(globalProperty, LLVMLinkage.LLVMInternalLinkage)
// (Cannot do this before the global is initialized). // (Cannot do this before the global is initialized).