feature. See also
. The project being documented here (as the example) is the Zig library itself.
Dwarf.parseFormValue
fn parseFormValue(
r: *Reader,
form_id: u64,
format: Format,
endian: Endian,
addr_size_bytes: u8,
implicit_const: ?i64,
) ScanError!FormValue
File
Code
fn parseFormValue(
r: *Reader,
form_id: u64,
format: Format,
endian: Endian,
addr_size_bytes: u8,
implicit_const: ?i64,
) ScanError!FormValue {
return switch (form_id) {
// compilation unit header as address size.
FORM.addr => .{ .addr = try readAddress(r, endian, addr_size_bytes) },
FORM.addrx1 => .{ .addrx = try r.takeByte() },
FORM.addrx2 => .{ .addrx = try r.takeInt(u16, endian) },
FORM.addrx3 => .{ .addrx = try r.takeInt(u24, endian) },
FORM.addrx4 => .{ .addrx = try r.takeInt(u32, endian) },
FORM.addrx => .{ .addrx = try r.takeLeb128(u64) },
FORM.block1 => .{ .block = try r.take(try r.takeByte()) },
FORM.block2 => .{ .block = try r.take(try r.takeInt(u16, endian)) },
FORM.block4 => .{ .block = try r.take(try r.takeInt(u32, endian)) },
FORM.block => .{ .block = try r.take(try r.takeLeb128(usize)) },
FORM.data1 => .{ .udata = try r.takeByte() },
FORM.data2 => .{ .udata = try r.takeInt(u16, endian) },
FORM.data4 => .{ .udata = try r.takeInt(u32, endian) },
FORM.data8 => .{ .udata = try r.takeInt(u64, endian) },
FORM.data16 => .{ .data16 = try r.takeArray(16) },
FORM.udata => .{ .udata = try r.takeLeb128(u64) },
FORM.sdata => .{ .sdata = try r.takeLeb128(i64) },
FORM.exprloc => .{ .exprloc = try r.take(try r.takeLeb128(usize)) },
FORM.flag => .{ .flag = (try r.takeByte()) != 0 },
FORM.flag_present => .{ .flag = true },
FORM.sec_offset => .{ .sec_offset = try readFormatSizedInt(r, format, endian) },
FORM.ref1 => .{ .ref = try r.takeByte() },
FORM.ref2 => .{ .ref = try r.takeInt(u16, endian) },
FORM.ref4 => .{ .ref = try r.takeInt(u32, endian) },
FORM.ref8 => .{ .ref = try r.takeInt(u64, endian) },
FORM.ref_udata => .{ .ref = try r.takeLeb128(u64) },
FORM.ref_addr => .{ .ref_addr = try readFormatSizedInt(r, format, endian) },
FORM.ref_sig8 => .{ .ref = try r.takeInt(u64, endian) },
FORM.string => .{ .string = try r.takeSentinel(0) },
FORM.strp => .{ .strp = try readFormatSizedInt(r, format, endian) },
FORM.strx1 => .{ .strx = try r.takeByte() },
FORM.strx2 => .{ .strx = try r.takeInt(u16, endian) },
FORM.strx3 => .{ .strx = try r.takeInt(u24, endian) },
FORM.strx4 => .{ .strx = try r.takeInt(u32, endian) },
FORM.strx => .{ .strx = try r.takeLeb128(usize) },
FORM.line_strp => .{ .line_strp = try readFormatSizedInt(r, format, endian) },
FORM.indirect => parseFormValue(r, try r.takeLeb128(u64), format, endian, addr_size_bytes, implicit_const),
FORM.implicit_const => .{ .sdata = implicit_const orelse return bad() },
FORM.loclistx => .{ .loclistx = try r.takeLeb128(u64) },
FORM.rnglistx => .{ .rnglistx = try r.takeLeb128(u64) },
else => {
return bad();
},
};
}