aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-08-12 11:55:38 +0200
committerJakub Konka <kubkon@jakubkonka.com>2022-08-12 12:05:34 +0200
commitaeaffd42f6d1c8fc92fa7669a579a8e6c46eb641 (patch)
treeaad5e99e972b3cb4fe3b92aaf355ea86037de334 /src/link
parentf2f1bb7cb675fc14dc7754f06329b5780091baaf (diff)
downloadzig-aeaffd42f6d1c8fc92fa7669a579a8e6c46eb641.tar.gz
zig-aeaffd42f6d1c8fc92fa7669a579a8e6c46eb641.zip
x86: fix generating debug info for variables
Add handling for these additional `MCValue`s: * `.immediate` - lower to `DW.OP.consts` or `DW.OP.constu` depending on signedness followed by popping off the DWARF stack with `DW.OP.stack_value` * `.undef` - lower to `DW.OP.implicit_value` * `.none` - lower to `DW.OP.lit0` followed by popping off the DWARF stack with `DW.OP.stack_value` For any remaining unhandled case, we generate `DW.OP.nop` in order not to mess up remaining DWARF info.
Diffstat (limited to 'src/link')
-rw-r--r--src/link/Dwarf.zig11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig
index 73891a81f5..3ae151491f 100644
--- a/src/link/Dwarf.zig
+++ b/src/link/Dwarf.zig
@@ -102,7 +102,7 @@ pub const DeclState = struct {
}
pub fn addExprlocReloc(self: *DeclState, target: u32, offset: u32, is_ptr: bool) !void {
- log.debug("{x}: target sym @{d}, via GOT {}", .{ offset, target, is_ptr });
+ log.debug("{x}: target sym %{d}, via GOT {}", .{ offset, target, is_ptr });
try self.exprloc_relocs.append(self.gpa, .{
.@"type" = if (is_ptr) .got_load else .direct_load,
.target = target,
@@ -135,7 +135,7 @@ pub const DeclState = struct {
.@"type" = ty,
.offset = undefined,
});
- log.debug("@{d}: {}", .{ sym_index, ty.fmtDebug() });
+ log.debug("%{d}: {}", .{ sym_index, ty.fmtDebug() });
try self.abbrev_resolver.putNoClobberContext(self.gpa, ty, sym_index, .{
.mod = self.mod,
});
@@ -143,7 +143,7 @@ pub const DeclState = struct {
.mod = self.mod,
}).?;
};
- log.debug("{x}: @{d} + 0", .{ offset, resolv });
+ log.debug("{x}: %{d} + 0", .{ offset, resolv });
try self.abbrev_relocs.append(self.gpa, .{
.target = resolv,
.atom = atom,
@@ -1056,6 +1056,7 @@ pub fn commitDeclState(
break :blk false;
};
if (deferred) {
+ log.debug("resolving %{d} deferred until flush", .{target});
try self.global_abbrev_relocs.append(gpa, .{
.target = null,
.offset = reloc.offset,
@@ -1063,10 +1064,12 @@ pub fn commitDeclState(
.addend = reloc.addend,
});
} else {
+ const value = symbol.atom.off + symbol.offset + reloc.addend;
+ log.debug("{x}: [() => {x}] (%{d}, '{}')", .{ reloc.offset, value, target, ty.fmtDebug() });
mem.writeInt(
u32,
dbg_info_buffer.items[reloc.offset..][0..@sizeOf(u32)],
- symbol.atom.off + symbol.offset + reloc.addend,
+ value,
target_endian,
);
}