authorgravatar for jonathan.haehne@hotmail.comTau <jonathan.haehne@hotmail.com> 2024-06-28 16:58:25+02:00
committergravatar for jonathan.haehne@hotmail.comTau <jonathan.haehne@hotmail.com> 2024-07-19 17:51:38+02:00
log52e4cdb45e2bbf6b8a220475190a76c9a392fa6a
tree6acfe78453811aef41ed5f28d4a021147f020239
parent3bfa63aa6151c339e02f36819f23ea547c41eb8f

Try linking static members' definitions to their declarations.

This does not help anything though: gdb would follow the DW_AT_specification link only in the opposite direction, which LLVM cannot emit.

1 files changed, 56 insertions(+), 46 deletions(-)

src/codegen/llvm.zig+56-46
......@@ -2465,18 +2465,52 @@ pub const Object = struct {
24652465 try o.builder.metadataString(decl_name),
24662466 try o.getDebugFile(namespace.fileScope(zcu)),
24672467 fwd_ref,
2468 0,
2468 0, // Line
24692469 try o.lowerDebugType(nested_type, false),
24702470 0, // Align
24712471 ));
24722472 } else if (decl.val.getVariable(zcu)) |v| {
2473 fields.appendAssumeCapacity(try o.builder.debugStaticMemberType(
2474 try o.builder.metadataString(decl_name),
2475 try o.getDebugFile(namespace.fileScope(zcu)),
2473 // Imitate a C++ static member variable since neither
2474 // GDB or LLDB can really cope with regular variables
2475 // directly inside a struct type.
2476
2477 const vglobal = (o.decl_map.get(decl_id) orelse continue).ptr(&o.builder);
2478
2479 const linkage_name = try o.builder.metadataStringFromStrtabString(vglobal.kind.variable.name(&o.builder));
2480 const var_name = try o.builder.metadataString(decl.name.toSlice(ip));
2481 const var_type = try o.lowerDebugType(Type.fromInterned(v.ty), false);
2482 const debug_file = try o.getDebugFile(namespace.fileScope(zcu));
2483 const debug_line = decl.navSrcLine(zcu) + 1;
2484
2485 const static_member = try o.builder.debugStaticMemberType(
2486 var_name,
2487 debug_file,
24762488 fwd_ref,
2477 0,
2478 try o.lowerDebugType(Type.fromInterned(v.ty), false),
2479 ));
2489 debug_line,
2490 var_type,
2491 );
2492 fields.appendAssumeCapacity(static_member);
2493
2494 const debug_global_var = try o.builder.debugGlobalVar(
2495 var_name,
2496 linkage_name,
2497 debug_file,
2498 debug_file,
2499 debug_line,
2500 var_type,
2501 vglobal.kind.variable,
2502 static_member,
2503 .internal,
2504 );
2505
2506 const debug_expression = try o.builder.debugExpression(&.{});
2507
2508 const resolved_var = try o.builder.debugGlobalVarExpression(
2509 debug_global_var,
2510 debug_expression,
2511 );
2512 vglobal.dbg = resolved_var;
2513 try o.debug_globals.append(o.gpa, resolved_var);
24802514 }
24812515 }
24822516 }
......@@ -4742,58 +4776,34 @@ pub const DeclGen = struct {
47424776
47434777 if (!owner_mod.strip) {
47444778 const debug_file = try o.getDebugFile(file_scope);
4745 const debug_scope = try o.namespaceToDebugScope(decl.src_namespace);
47464779
47474780 const linkage_name = try o.builder.metadataStringFromStrtabString(variable_index.name(&o.builder));
47484781
4749 const debug_global_var = if (!decl.isExtern(zcu)) blk: {
4750 // Imitate a C++ static member variable since neither
4751 // GDB or LLDB can really cope with regular variables
4752 // directly inside a struct type.
4753 const ty = try o.lowerDebugType(decl.typeOf(zcu), true);
4754 const name = try o.builder.metadataString(decl.name.toSlice(ip));
4755
4756 const variable = try o.builder.debugGlobalVar(
4757 name,
4782 if (!decl.isExtern(zcu)) {
4783 // Make it a static member variable, which is resolved later in genNamespaces.
4784 _ = try o.namespaceToDebugScope(decl.src_namespace);
4785 } else {
4786 const debug_global_var = try o.builder.debugGlobalVar(
4787 linkage_name,
47584788 linkage_name,
47594789 debug_file,
47604790 debug_file,
47614791 line_number,
4762 ty,
4792 try o.lowerDebugType(decl.typeOf(zcu), true),
47634793 variable_index,
47644794 .none,
47654795 .external,
47664796 );
4797 const debug_expression = try o.builder.debugExpression(&.{});
47674798
4768 try o.debug_imports.append(o.gpa, try o.builder.debugImportDeclaration(
4769 name,
4770 debug_file,
4771 debug_scope,
4772 line_number,
4773 variable,
4774 ));
4775
4776 break :blk variable;
4777 } else try o.builder.debugGlobalVar(
4778 linkage_name,
4779 linkage_name,
4780 debug_file,
4781 debug_file,
4782 line_number,
4783 try o.lowerDebugType(decl.typeOf(zcu), true),
4784 variable_index,
4785 .none,
4786 .external,
4787 );
4788 const debug_expression = try o.builder.debugExpression(&.{});
4789
4790 const debug_global_var_expression = try o.builder.debugGlobalVarExpression(
4791 debug_global_var,
4792 debug_expression,
4793 );
4799 const debug_global_var_expression = try o.builder.debugGlobalVarExpression(
4800 debug_global_var,
4801 debug_expression,
4802 );
47944803
4795 variable_index.setGlobalVariableExpression(debug_global_var_expression, &o.builder);
4796 try o.debug_globals.append(o.gpa, debug_global_var_expression);
4804 variable_index.setGlobalVariableExpression(debug_global_var_expression, &o.builder);
4805 try o.debug_globals.append(o.gpa, debug_global_var_expression);
4806 }
47974807 }
47984808 }
47994809