aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-12-05 17:48:54 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-12-05 22:35:07 +0100
commit12e34e70377882363dbedf2a7afdc8737a7435c5 (patch)
treec3e01b1a26a83062425af5fabaef8c0fc92092cf /src/link
parent97827d6d38ecd078fbbcff3d71a7e104341695cd (diff)
downloadzig-12e34e70377882363dbedf2a7afdc8737a7435c5.tar.gz
zig-12e34e70377882363dbedf2a7afdc8737a7435c5.zip
dwarf: pull out debug line program internals into DeclState helpers
Diffstat (limited to 'src/link')
-rw-r--r--src/link/Dwarf.zig27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig
index c0a61d057f..730a2562c6 100644
--- a/src/link/Dwarf.zig
+++ b/src/link/Dwarf.zig
@@ -778,6 +778,33 @@ pub const DeclState = struct {
try self.addTypeRelocGlobal(atom, child_ty, @intCast(u32, index));
dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
}
+
+ pub fn advancePCAndLine(
+ self: *DeclState,
+ delta_line: i32,
+ delta_pc: usize,
+ ) error{OutOfMemory}!void {
+ // TODO Look into using the DWARF special opcodes to compress this data.
+ // It lets you emit single-byte opcodes that add different numbers to
+ // both the PC and the line number at the same time.
+ const dbg_line = &self.dbg_line;
+ try dbg_line.ensureUnusedCapacity(11);
+ dbg_line.appendAssumeCapacity(DW.LNS.advance_pc);
+ leb128.writeULEB128(dbg_line.writer(), delta_pc) catch unreachable;
+ if (delta_line != 0) {
+ dbg_line.appendAssumeCapacity(DW.LNS.advance_line);
+ leb128.writeILEB128(dbg_line.writer(), delta_line) catch unreachable;
+ }
+ dbg_line.appendAssumeCapacity(DW.LNS.copy);
+ }
+
+ pub fn setPrologueEnd(self: *DeclState) error{OutOfMemory}!void {
+ try self.dbg_line.append(DW.LNS.set_prologue_end);
+ }
+
+ pub fn setEpilogueBegin(self: *DeclState) error{OutOfMemory}!void {
+ try self.dbg_line.append(DW.LNS.set_epilogue_begin);
+ }
};
pub const AbbrevEntry = struct {