diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-13 18:06:16 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-15 03:07:51 -0400 |
| commit | b6d61028508c5b1e1961a124bc17d4d9bda9686f (patch) | |
| tree | 9b50fbfca9bf08638a44635d7da534284afb684d /src/link | |
| parent | e08eab664861461b0adbe7984881f72b5a36a979 (diff) | |
| download | zig-b6d61028508c5b1e1961a124bc17d4d9bda9686f.tar.gz zig-b6d61028508c5b1e1961a124bc17d4d9bda9686f.zip | |
x86_64: reimplement `@floatToInt`
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/Dwarf.zig | 92 |
1 files changed, 68 insertions, 24 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig index c134f60316..1a064049fc 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -608,23 +608,44 @@ pub const DeclState = struct { switch (loc) { .register => |reg| { - try dbg_info.ensureUnusedCapacity(3); + try dbg_info.ensureUnusedCapacity(4); dbg_info.appendAssumeCapacity(@enumToInt(AbbrevKind.parameter)); - dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc - 1, // ULEB128 dwarf expression length - reg, - }); + // DW.AT.location, DW.FORM.exprloc + var expr_len = std.io.countingWriter(std.io.null_writer); + if (reg < 32) { + expr_len.writer().writeByte(DW.OP.reg0 + reg) catch unreachable; + } else { + expr_len.writer().writeByte(DW.OP.regx) catch unreachable; + leb128.writeULEB128(expr_len.writer(), reg) catch unreachable; + } + leb128.writeULEB128(dbg_info.writer(), expr_len.bytes_written) catch unreachable; + if (reg < 32) { + dbg_info.appendAssumeCapacity(DW.OP.reg0 + reg); + } else { + dbg_info.appendAssumeCapacity(DW.OP.regx); + leb128.writeULEB128(dbg_info.writer(), reg) catch unreachable; + } }, .stack => |info| { - try dbg_info.ensureUnusedCapacity(8); + try dbg_info.ensureUnusedCapacity(9); dbg_info.appendAssumeCapacity(@enumToInt(AbbrevKind.parameter)); - const fixup = dbg_info.items.len; - dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc - 1, // we will backpatch it after we encode the displacement in LEB128 - info.fp_register, // frame pointer - }); + // DW.AT.location, DW.FORM.exprloc + var expr_len = std.io.countingWriter(std.io.null_writer); + if (info.fp_register < 32) { + expr_len.writer().writeByte(DW.OP.breg0 + info.fp_register) catch unreachable; + } else { + expr_len.writer().writeByte(DW.OP.bregx) catch unreachable; + leb128.writeULEB128(expr_len.writer(), info.fp_register) catch unreachable; + } + leb128.writeILEB128(expr_len.writer(), info.offset) catch unreachable; + leb128.writeULEB128(dbg_info.writer(), expr_len.bytes_written) catch unreachable; + if (info.fp_register < 32) { + dbg_info.appendAssumeCapacity(DW.OP.breg0 + info.fp_register); + } else { + dbg_info.appendAssumeCapacity(DW.OP.bregx); + leb128.writeULEB128(dbg_info.writer(), info.fp_register) catch unreachable; + } leb128.writeILEB128(dbg_info.writer(), info.offset) catch unreachable; - dbg_info.items[fixup] += @intCast(u8, dbg_info.items.len - fixup - 2); }, .wasm_local => |value| { const leb_size = link.File.Wasm.getULEB128Size(value); @@ -670,22 +691,45 @@ pub const DeclState = struct { switch (loc) { .register => |reg| { - try dbg_info.ensureUnusedCapacity(2); - dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc - 1, // ULEB128 dwarf expression length - reg, - }); + try dbg_info.ensureUnusedCapacity(4); + dbg_info.appendAssumeCapacity(@enumToInt(AbbrevKind.parameter)); + // DW.AT.location, DW.FORM.exprloc + var expr_len = std.io.countingWriter(std.io.null_writer); + if (reg < 32) { + expr_len.writer().writeByte(DW.OP.reg0 + reg) catch unreachable; + } else { + expr_len.writer().writeByte(DW.OP.regx) catch unreachable; + leb128.writeULEB128(expr_len.writer(), reg) catch unreachable; + } + leb128.writeULEB128(dbg_info.writer(), expr_len.bytes_written) catch unreachable; + if (reg < 32) { + dbg_info.appendAssumeCapacity(DW.OP.reg0 + reg); + } else { + dbg_info.appendAssumeCapacity(DW.OP.regx); + leb128.writeULEB128(dbg_info.writer(), reg) catch unreachable; + } }, .stack => |info| { - try dbg_info.ensureUnusedCapacity(7); - const fixup = dbg_info.items.len; - dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc - 1, // we will backpatch it after we encode the displacement in LEB128 - info.fp_register, - }); + try dbg_info.ensureUnusedCapacity(9); + dbg_info.appendAssumeCapacity(@enumToInt(AbbrevKind.parameter)); + // DW.AT.location, DW.FORM.exprloc + var expr_len = std.io.countingWriter(std.io.null_writer); + if (info.fp_register < 32) { + expr_len.writer().writeByte(DW.OP.breg0 + info.fp_register) catch unreachable; + } else { + expr_len.writer().writeByte(DW.OP.bregx) catch unreachable; + leb128.writeULEB128(expr_len.writer(), info.fp_register) catch unreachable; + } + leb128.writeILEB128(expr_len.writer(), info.offset) catch unreachable; + leb128.writeULEB128(dbg_info.writer(), expr_len.bytes_written) catch unreachable; + if (info.fp_register < 32) { + dbg_info.appendAssumeCapacity(DW.OP.breg0 + info.fp_register); + } else { + dbg_info.appendAssumeCapacity(DW.OP.bregx); + leb128.writeULEB128(dbg_info.writer(), info.fp_register) catch unreachable; + } leb128.writeILEB128(dbg_info.writer(), info.offset) catch unreachable; - dbg_info.items[fixup] += @intCast(u8, dbg_info.items.len - fixup - 2); }, .wasm_local => |value| { |
