aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-04-13 16:24:56 +0200
committerJakub Konka <kubkon@jakubkonka.com>2022-04-13 16:24:56 +0200
commit3f912430bdddede8c3f6a9555b76499aa2dabb7e (patch)
tree8c405e643a8cfa44d4f0d5838a570576dd106caa /src
parent0bf72833307bf500ebec1a08641600f12cda0434 (diff)
downloadzig-3f912430bdddede8c3f6a9555b76499aa2dabb7e.tar.gz
zig-3f912430bdddede8c3f6a9555b76499aa2dabb7e.zip
stage2,x64: deref memory if referenced via GOT for local vars
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/CodeGen.zig16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index a06f7941b4..32065fa1bb 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -3911,8 +3911,8 @@ fn airDbgVar(self: *Self, inst: Air.Inst.Index) !void {
const tag = self.air.instructions.items(.tag)[inst];
switch (tag) {
- .dbg_var_ptr => try self.genVarDbgInfo(ty.childType(), mcv, name),
- .dbg_var_val => try self.genVarDbgInfo(ty, mcv, name),
+ .dbg_var_ptr => try self.genVarDbgInfo(tag, ty.childType(), mcv, name),
+ .dbg_var_val => try self.genVarDbgInfo(tag, ty, mcv, name),
else => unreachable,
}
@@ -3921,6 +3921,7 @@ fn airDbgVar(self: *Self, inst: Air.Inst.Index) !void {
fn genVarDbgInfo(
self: *Self,
+ tag: Air.Inst.Tag,
ty: Type,
mcv: MCValue,
name: [:0]const u8,
@@ -3952,9 +3953,14 @@ fn genVarDbgInfo(
.memory => |addr| {
const endian = self.target.cpu.arch.endian();
const ptr_width = @intCast(u8, @divExact(self.target.cpu.arch.ptrBitWidth(), 8));
+ const is_ptr = switch (tag) {
+ .dbg_var_ptr => true,
+ .dbg_var_val => false,
+ else => unreachable,
+ };
try dbg_info.ensureUnusedCapacity(2 + ptr_width);
dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc
- 1 + ptr_width,
+ 1 + ptr_width + @boolToInt(is_ptr),
DW.OP.addr, // literal address
});
switch (ptr_width) {
@@ -3966,6 +3972,10 @@ fn genVarDbgInfo(
},
else => unreachable,
}
+ if (is_ptr) {
+ // We need deref the address as we point to the value via GOT entry.
+ try dbg_info.append(DW.OP.deref);
+ }
},
else => {
log.debug("TODO generate debug info for {}", .{mcv});