From 9a4522d2dd50b201856cc14325b035006f1e4011 Mon Sep 17 00:00:00 2001 From: Matthias Huerbe Date: Wed, 7 Oct 2026 07:54:29 +0000 Subject: [PATCH] Make @(static) locals visible in the PDB --- src/llvm_backend_debug.cpp | 17 +++++++++++++++++ src/llvm_backend_stmt.cpp | 9 +++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index af9f1323e..5ca2401bf 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -1385,6 +1385,23 @@ gb_internal void lb_add_debug_context_variable(lbProcedure *p, lbAddr const &ctx lb_add_debug_local_variable(p, ptr, t_context, token); } +gb_internal void lb_add_debug_info_static_variable(lbProcedure *p, Entity *e, LLVMValueRef global) { + if (p->debug_info == nullptr) { + return; + } + LLVMMetadataRef global_variable_metadata = LLVMDIBuilderCreateGlobalVariableExpression( + p->module->debug_builder, p->debug_info, + cast(char const *)e->token.string.text, cast(size_t)e->token.string.len, + "", 0, // linkage + lb_get_file_metadata(p->module, e->file), cast(unsigned)e->token.pos.line, + lb_debug_type(p->module, e->type), + true, // local to unit + LLVMDIBuilderCreateExpression(p->module->debug_builder, nullptr, 0), + nullptr, + cast(u32)(8*type_align_of(e->type)) + ); + LLVMGlobalSetMetadata(global, 0, global_variable_metadata); +} gb_internal String lb_debug_info_mangle_constant_name(Entity *e, gbAllocator const &allocator, bool *did_allocate_) { String name = e->token.string; diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index e0325fdf2..557f37f47 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -2445,7 +2445,6 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss lb_close_scope(p, lbDeferExit_Default, done, ss->body); } - gb_internal void lb_build_static_variables(lbProcedure *p, AstValueDecl *vd) { for_array(i, vd->names) { lbValue value = {}; @@ -2490,7 +2489,7 @@ gb_internal void lb_build_static_variables(lbProcedure *p, AstValueDecl *vd) { } if (!lb_apply_thread_local_model(global, e->Variable.thread_local_model)) { - LLVMSetLinkage(global, LLVMInternalLinkage); + LLVM_SET_INTERNAL_WEAK_LINKAGE(global); } if (value.value != nullptr) { @@ -2508,7 +2507,7 @@ gb_internal void lb_build_static_variables(lbProcedure *p, AstValueDecl *vd) { } if (!lb_apply_thread_local_model(var_global_ref, e->Variable.thread_local_model)) { - LLVMSetLinkage(var_global_ref, LLVMInternalLinkage); + LLVM_SET_INTERNAL_WEAK_LINKAGE(var_global_ref); } auto vals = array_make(temporary_allocator(), 0, 3); @@ -2534,18 +2533,20 @@ gb_internal void lb_build_static_variables(lbProcedure *p, AstValueDecl *vd) { LLVMSetGlobalConstant(global, true); } if (!lb_apply_thread_local_model(global, e->Variable.thread_local_model)) { - LLVMSetLinkage(global, LLVMInternalLinkage); + LLVM_SET_INTERNAL_WEAK_LINKAGE(global); } } LLVMSetInitializer(global, value.value); } } + lb_add_debug_info_static_variable(p, e, global); lbValue global_val = {global, alloc_type_pointer(e->type)}; lb_add_entity(p->module, e, global_val); lb_add_member(p->module, mangled_name, global_val); } } + gb_internal isize lb_append_tuple_values(lbProcedure *p, Array *dst_values, lbValue src_value) { isize init_count = dst_values->count; Type *t = src_value.type;