aboutsummaryrefslogtreecommitdiff
path: root/src/arch/aarch64/CodeGen.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2024-08-17 01:15:04 -0400
committerGitHub <noreply@github.com>2024-08-17 01:15:04 -0400
commitbb70501060a8bfff25818cf1d80491d724f8a634 (patch)
tree546c8d93fcbdf4e2f3e2656d5d4f45bc79e9d483 /src/arch/aarch64/CodeGen.zig
parent90989be0e31a91335f8d1c1eafb84c3b34792a8c (diff)
parented19ecd115beedfbf496c6f20995e74fbcd8ccb4 (diff)
downloadzig-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.zig51
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;