diff options
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 25 |
1 files changed, 22 insertions, 3 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); |