aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-09-14 17:50:31 +0100
committergingerBill <bill@gingerbill.org>2022-09-14 17:50:31 +0100
commit190c3ab0cdc031e45d450e64715452fb2e576d1e (patch)
tree3876d0c34923eb4947e10cd6e7780ca105478bbe /src
parent53c7cf895c01c4799879cfa024224f365824463b (diff)
Just get the value directly and store it in another global variable
// global x := &Foo{}
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend.cpp25
-rw-r--r--src/llvm_backend.hpp1
-rw-r--r--src/llvm_backend_general.cpp15
3 files changed, 33 insertions, 8 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 4eb343fa7..d7f391690 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -758,9 +758,29 @@ lbProcedure *lb_create_startup_runtime(lbModule *main_module, lbProcedure *start
GB_ASSERT(e->kind == Entity_Variable);
e->code_gen_module = entity_module;
- Ast *init_expr = var->decl->init_expr;
+ Ast *init_expr = unparen_expr(var->decl->init_expr);
if (init_expr != nullptr) {
- lbValue init = lb_build_expr(p, init_expr);
+ lbValue init = {};
+
+ if (!(is_type_any(e->type) || is_type_union(e->type))) {
+ if (init_expr->kind == Ast_UnaryExpr && init_expr->UnaryExpr.op.kind == Token_And) {
+ // NOTE(bill): Just get the value directly and store it in another global variable
+ Ast *expr = unparen_expr(init_expr->UnaryExpr.expr);
+ if (expr->tav.value.kind != ExactValue_Invalid) {
+ init = lb_build_expr(p, expr);
+ GB_ASSERT(init.value != nullptr);
+ GB_ASSERT(LLVMIsConstant(init.value));
+
+ lbAddr addr = lb_add_global_generated(p->module, init.type, init, nullptr);
+ LLVMValueRef global_val = lb_make_global_truly_private(addr);
+ LLVMSetInitializer(var->var.value, global_val);
+ var->is_initialized = true;
+ continue;
+ }
+ }
+ }
+
+ init = lb_build_expr(p, init_expr);
if (init.value == nullptr) {
LLVMTypeRef global_type = llvm_addr_type(p->module, var->var);
if (is_type_untyped_undef(init.type)) {
@@ -1588,7 +1608,6 @@ void lb_generate_code(lbGenerator *gen) {
bool is_foreign = e->Variable.is_foreign;
bool is_export = e->Variable.is_export;
-
lbModule *m = &gen->default_module;
String name = lb_get_entity_name(m, e);
diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp
index 79f0f37e7..70f528251 100644
--- a/src/llvm_backend.hpp
+++ b/src/llvm_backend.hpp
@@ -395,6 +395,7 @@ lbContextData *lb_push_context_onto_stack_from_implicit_parameter(lbProcedure *p
lbAddr lb_add_global_generated(lbModule *m, Type *type, lbValue value={}, Entity **entity_=nullptr);
lbAddr lb_add_local(lbProcedure *p, Type *type, Entity *e=nullptr, bool zero_init=true, i32 param_index=0, bool force_no_init=false);
+LLVMValueRef lb_make_global_truly_private(lbAddr const &addr);
void lb_add_foreign_library_path(lbModule *m, Entity *e);
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp
index 1f8fccdcb..94429e410 100644
--- a/src/llvm_backend_general.cpp
+++ b/src/llvm_backend_general.cpp
@@ -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);