Just get the value directly and store it in another global variable

// global
x := &Foo{}
This commit is contained in:
gingerBill
2022-09-14 17:50:31 +01:00
parent 53c7cf895c
commit 190c3ab0cd
3 changed files with 33 additions and 8 deletions
+10 -5
View File
@@ -926,11 +926,7 @@ void lb_emit_store(lbProcedure *p, lbValue ptr, lbValue value) {
return;
} else if (LLVMIsConstant(value.value)) {
lbAddr addr = lb_add_global_generated(p->module, value.type, value, nullptr);
LLVMValueRef global_data = addr.addr.value;
// make it truly private data
LLVMSetLinkage(global_data, LLVMPrivateLinkage);
LLVMSetUnnamedAddress(global_data, LLVMGlobalUnnamedAddr);
LLVMSetGlobalConstant(global_data, true);
LLVMValueRef global_data = lb_make_global_truly_private(addr);
LLVMValueRef dst_ptr = ptr.value;
LLVMValueRef src_ptr = global_data;
@@ -2669,6 +2665,15 @@ lbValue lb_find_procedure_value_from_entity(lbModule *m, Entity *e) {
return {};
}
LLVMValueRef lb_make_global_truly_private(lbAddr const &addr) {
LLVMValueRef global_data = addr.addr.value;
// make it truly private data
LLVMSetLinkage(global_data, LLVMPrivateLinkage);
LLVMSetUnnamedAddress(global_data, LLVMGlobalUnnamedAddr);
LLVMSetGlobalConstant(global_data, true);
return global_data;
}
lbAddr lb_add_global_generated(lbModule *m, Type *type, lbValue value, Entity **entity_) {
GB_ASSERT(type != nullptr);
type = default_type(type);