Commit 3f912430bd

Jakub Konka <kubkon@jakubkonka.com>
2022-04-13 16:24:56
stage2,x64: deref memory if referenced via GOT for local vars
1 parent 0bf7283
Changed files (1)
src
arch
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});