| ... | ... | @@ -3926,31 +3926,21 @@ fn genVarDbgInfo( |
| 3926 | 3926 | name: [:0]const u8, |
| 3927 | 3927 | ) !void { |
| 3928 | 3928 | const name_with_null = name.ptr[0 .. name.len + 1]; |
| 3929 | | switch (mcv) { |
| 3930 | | .register => |reg| { |
| 3931 | | switch (self.debug_output) { |
| 3932 | | .dwarf => |dw| { |
| 3933 | | const dbg_info = &dw.dbg_info; |
| 3934 | | try dbg_info.ensureUnusedCapacity(3); |
| 3935 | | dbg_info.appendAssumeCapacity(@enumToInt(link.File.Dwarf.AbbrevKind.variable)); |
| 3929 | switch (self.debug_output) { |
| 3930 | .dwarf => |dw| { |
| 3931 | const dbg_info = &dw.dbg_info; |
| 3932 | try dbg_info.append(@enumToInt(link.File.Dwarf.AbbrevKind.variable)); |
| 3933 | |
| 3934 | switch (mcv) { |
| 3935 | .register => |reg| { |
| 3936 | try dbg_info.ensureUnusedCapacity(2); |
| 3936 | 3937 | dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc |
| 3937 | 3938 | 1, // ULEB128 dwarf expression length |
| 3938 | 3939 | reg.dwarfLocOp(), |
| 3939 | 3940 | }); |
| 3940 | | try dbg_info.ensureUnusedCapacity(5 + name_with_null.len); |
| 3941 | | try self.addDbgInfoTypeReloc(ty); // DW.AT.type, DW.FORM.ref4 |
| 3942 | | dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string |
| 3943 | 3941 | }, |
| 3944 | | .plan9 => {}, |
| 3945 | | .none => {}, |
| 3946 | | } |
| 3947 | | }, |
| 3948 | | .ptr_stack_offset, .stack_offset => |off| { |
| 3949 | | switch (self.debug_output) { |
| 3950 | | .dwarf => |dw| { |
| 3951 | | const dbg_info = &dw.dbg_info; |
| 3952 | | try dbg_info.ensureUnusedCapacity(8); |
| 3953 | | dbg_info.appendAssumeCapacity(@enumToInt(link.File.Dwarf.AbbrevKind.variable)); |
| 3942 | .ptr_stack_offset, .stack_offset => |off| { |
| 3943 | try dbg_info.ensureUnusedCapacity(7); |
| 3954 | 3944 | const fixup = dbg_info.items.len; |
| 3955 | 3945 | dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc |
| 3956 | 3946 | 1, // we will backpatch it after we encode the displacement in LEB128 |
| ... | ... | @@ -3958,18 +3948,36 @@ fn genVarDbgInfo( |
| 3958 | 3948 | }); |
| 3959 | 3949 | leb128.writeILEB128(dbg_info.writer(), -off) catch unreachable; |
| 3960 | 3950 | dbg_info.items[fixup] += @intCast(u8, dbg_info.items.len - fixup - 2); |
| 3961 | | try dbg_info.ensureUnusedCapacity(5 + name_with_null.len); |
| 3962 | | try self.addDbgInfoTypeReloc(ty); // DW.AT.type, DW.FORM.ref4 |
| 3963 | | dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string |
| 3964 | | |
| 3965 | 3951 | }, |
| 3966 | | .plan9 => {}, |
| 3967 | | .none => {}, |
| 3952 | .memory => |addr| { |
| 3953 | const endian = self.target.cpu.arch.endian(); |
| 3954 | const ptr_width = @intCast(u8, @divExact(self.target.cpu.arch.ptrBitWidth(), 8)); |
| 3955 | try dbg_info.ensureUnusedCapacity(2 + ptr_width); |
| 3956 | dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc |
| 3957 | 1 + ptr_width, |
| 3958 | DW.OP.addr, // literal address |
| 3959 | }); |
| 3960 | switch (ptr_width) { |
| 3961 | 0...4 => { |
| 3962 | try dbg_info.writer().writeInt(u32, @intCast(u32, addr), endian); |
| 3963 | }, |
| 3964 | 5...8 => { |
| 3965 | try dbg_info.writer().writeInt(u64, addr, endian); |
| 3966 | }, |
| 3967 | else => unreachable, |
| 3968 | } |
| 3969 | }, |
| 3970 | else => { |
| 3971 | log.debug("TODO generate debug info for {}", .{mcv}); |
| 3972 | }, |
| 3968 | 3973 | } |
| 3974 | |
| 3975 | try dbg_info.ensureUnusedCapacity(5 + name_with_null.len); |
| 3976 | try self.addDbgInfoTypeReloc(ty); // DW.AT.type, DW.FORM.ref4 |
| 3977 | dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string |
| 3969 | 3978 | }, |
| 3970 | | else => { |
| 3971 | | log.debug("TODO generate debug info for {}", .{mcv}); |
| 3972 | | }, |
| 3979 | .plan9 => {}, |
| 3980 | .none => {}, |
| 3973 | 3981 | } |
| 3974 | 3982 | } |
| 3975 | 3983 | |