diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2024-08-17 01:15:04 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-17 01:15:04 -0400 |
| commit | bb70501060a8bfff25818cf1d80491d724f8a634 (patch) | |
| tree | 546c8d93fcbdf4e2f3e2656d5d4f45bc79e9d483 /src/arch/aarch64/CodeGen.zig | |
| parent | 90989be0e31a91335f8d1c1eafb84c3b34792a8c (diff) | |
| parent | ed19ecd115beedfbf496c6f20995e74fbcd8ccb4 (diff) | |
| download | zig-bb70501060a8bfff25818cf1d80491d724f8a634.tar.gz zig-bb70501060a8bfff25818cf1d80491d724f8a634.zip | |
Merge pull request #21078 from jacobly0/new-dwarf
Dwarf: rework self-hosted debug info from scratch
Diffstat (limited to 'src/arch/aarch64/CodeGen.zig')
| -rw-r--r-- | src/arch/aarch64/CodeGen.zig | 51 |
1 files changed, 20 insertions, 31 deletions
diff --git a/src/arch/aarch64/CodeGen.zig b/src/arch/aarch64/CodeGen.zig index 231db8e98c..cb16dba688 100644 --- a/src/arch/aarch64/CodeGen.zig +++ b/src/arch/aarch64/CodeGen.zig @@ -18,7 +18,6 @@ const ErrorMsg = Zcu.ErrorMsg; const Target = std.Target; const Allocator = mem.Allocator; const trace = @import("../../tracy.zig").trace; -const DW = std.dwarf; const leb128 = std.leb; const log = std.log.scoped(.codegen); const build_options = @import("build_options"); @@ -181,11 +180,11 @@ const DbgInfoReloc = struct { } } - fn genArgDbgInfo(reloc: DbgInfoReloc, function: Self) error{OutOfMemory}!void { + fn genArgDbgInfo(reloc: DbgInfoReloc, function: Self) !void { switch (function.debug_output) { .dwarf => |dw| { - const loc: link.File.Dwarf.NavState.DbgInfoLoc = switch (reloc.mcv) { - .register => |reg| .{ .register = reg.dwarfLocOp() }, + const loc: link.File.Dwarf.Loc = switch (reloc.mcv) { + .register => |reg| .{ .reg = reg.dwarfNum() }, .stack_offset, .stack_argument_offset, => |offset| blk: { @@ -194,15 +193,15 @@ const DbgInfoReloc = struct { .stack_argument_offset => @as(i32, @intCast(function.saved_regs_stack_space + offset)), else => unreachable, }; - break :blk .{ .stack = .{ - .fp_register = Register.x29.dwarfLocOpDeref(), - .offset = adjusted_offset, + break :blk .{ .plus = .{ + &.{ .breg = Register.x29.dwarfNum() }, + &.{ .consts = adjusted_offset }, } }; }, else => unreachable, // not a possible argument }; - try dw.genArgDbgInfo(reloc.name, reloc.ty, function.owner_nav, loc); + try dw.genVarDebugInfo(.local_arg, reloc.name, reloc.ty, loc); }, .plan9 => {}, .none => {}, @@ -210,16 +209,10 @@ const DbgInfoReloc = struct { } fn genVarDbgInfo(reloc: DbgInfoReloc, function: Self) !void { - const is_ptr = switch (reloc.tag) { - .dbg_var_ptr => true, - .dbg_var_val => false, - else => unreachable, - }; - switch (function.debug_output) { - .dwarf => |dw| { - const loc: link.File.Dwarf.NavState.DbgInfoLoc = switch (reloc.mcv) { - .register => |reg| .{ .register = reg.dwarfLocOp() }, + .dwarf => |dwarf| { + const loc: link.File.Dwarf.Loc = switch (reloc.mcv) { + .register => |reg| .{ .reg = reg.dwarfNum() }, .ptr_stack_offset, .stack_offset, .stack_argument_offset, @@ -231,24 +224,20 @@ const DbgInfoReloc = struct { .stack_argument_offset => @as(i32, @intCast(function.saved_regs_stack_space + offset)), else => unreachable, }; - break :blk .{ - .stack = .{ - .fp_register = Register.x29.dwarfLocOpDeref(), - .offset = adjusted_offset, - }, - }; + break :blk .{ .plus = .{ + &.{ .reg = Register.x29.dwarfNum() }, + &.{ .consts = adjusted_offset }, + } }; }, - .memory => |address| .{ .memory = address }, - .linker_load => |linker_load| .{ .linker_load = linker_load }, - .immediate => |x| .{ .immediate = x }, - .undef => .undef, - .none => .none, + .memory => |address| .{ .constu = address }, + .immediate => |x| .{ .constu = x }, + .none => .empty, else => blk: { log.debug("TODO generate debug info for {}", .{reloc.mcv}); - break :blk .nop; + break :blk .empty; }, }; - try dw.genVarDbgInfo(reloc.name, reloc.ty, function.owner_nav, is_ptr, loc); + try dwarf.genVarDebugInfo(.local_var, reloc.name, reloc.ty, loc); }, .plan9 => {}, .none => {}, @@ -6207,7 +6196,7 @@ fn genTypedValue(self: *Self, val: Value) InnerError!MCValue { .memory => |addr| .{ .memory = addr }, .load_got => |sym_index| .{ .linker_load = .{ .type = .got, .sym_index = sym_index } }, .load_direct => |sym_index| .{ .linker_load = .{ .type = .direct, .sym_index = sym_index } }, - .load_symbol, .load_tlv, .lea_symbol => unreachable, // TODO + .load_symbol, .load_tlv, .lea_symbol, .lea_direct => unreachable, // TODO }, .fail => |msg| { self.err_msg = msg; |
