From 68731b2b50799509afa1fa4ceea2c34d41d2ff4b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 24 Feb 2025 14:36:19 +0000 Subject: [PATCH] Canonicalize global source code locations --- src/llvm_backend_const.cpp | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 754bbfca285..cee960bf3bb 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -330,31 +330,57 @@ gb_internal lbValue lb_emit_source_code_location_const(lbProcedure *p, Ast *node return lb_emit_source_code_location_const(p, proc_name, pos); } +gb_internal String lb_source_code_location_gen_name(String const &procedure, TokenPos const &pos) { + gbString s = gb_string_make(permanent_allocator(), "scl$["); + + s = gb_string_append_length(s, procedure.text, procedure.len); + if (pos.offset != 0) { + s = gb_string_append_fmt(s, "%d", pos.offset); + } else { + s = gb_string_append_fmt(s, "%d_%d", pos.line, pos.column); + } + s = gb_string_appendc(s, "]"); + + return make_string(cast(u8 const *)s, gb_string_length(s)); +} + +gb_internal String lb_source_code_location_gen_name(lbProcedure *p, Ast *node) { + String proc_name = {}; + if (p->entity) { + proc_name = p->entity->token.string; + } + TokenPos pos = {}; + if (node) { + pos = ast_token(node).pos; + } + return lb_source_code_location_gen_name(proc_name, pos); +} + + gb_internal lbValue lb_emit_source_code_location_as_global_ptr(lbProcedure *p, String const &procedure, TokenPos const &pos) { lbValue loc = lb_emit_source_code_location_const(p, procedure, pos); - lbAddr addr = lb_add_global_generated(p->module, loc.type, loc, nullptr); + lbAddr addr = lb_add_global_generated_with_name(p->module, loc.type, loc, lb_source_code_location_gen_name(procedure, pos)); lb_make_global_private_const(addr); return addr.addr; } gb_internal lbValue lb_const_source_code_location_as_global_ptr(lbModule *m, String const &procedure, TokenPos const &pos) { lbValue loc = lb_const_source_code_location_const(m, procedure, pos); - lbAddr addr = lb_add_global_generated(m, loc.type, loc, nullptr); + lbAddr addr = lb_add_global_generated_with_name(m, loc.type, loc, lb_source_code_location_gen_name(procedure, pos)); lb_make_global_private_const(addr); return addr.addr; } - - - gb_internal lbValue lb_emit_source_code_location_as_global_ptr(lbProcedure *p, Ast *node) { lbValue loc = lb_emit_source_code_location_const(p, node); - lbAddr addr = lb_add_global_generated(p->module, loc.type, loc, nullptr); + lbAddr addr = lb_add_global_generated_with_name(p->module, loc.type, loc, lb_source_code_location_gen_name(p, node)); lb_make_global_private_const(addr); return addr.addr; } + + gb_internal lbValue lb_emit_source_code_location_as_global(lbProcedure *p, String const &procedure, TokenPos const &pos) { return lb_emit_load(p, lb_emit_source_code_location_as_global_ptr(p, procedure, pos)); }