parseFormValue
Function parameters
Parameters
Type definitions in this namespace
Types
- ExceptionFrameHeader
- This represents the decoded .eh_frame_hdr header
Initialize DWARF info.
Functions
- open
- Initialize DWARF info.
- findCompileUnit
- TODO: change this to binary searching the sorted compile unit list
- scanAllUnwindInfo
- If `.eh_frame_hdr` is present, then only the header needs to be parsed.
- scanCieFdeInfo
- Scan `.eh_frame` and `.debug_frame` and build a sorted list of FDEs for binary searching during
- compactUnwindToDwarfRegNumber
- Returns the DWARF register number for an x86_64 register number found in compact unwind info
- bad
- This function is to make it handy to comment out the return and make it
Error sets in this namespace
Error Sets
= [_]?Section{null} ** num_sections
Values
- null_section_array
- = [_]?Section{null} ** num_sections
Source
Implementation
fn parseFormValue(
fbr: *FixedBufferReader,
form_id: u64,
format: Format,
implicit_const: ?i64,
) ScanError!FormValue {
return switch (form_id) {
FORM.addr => .{ .addr = try fbr.readAddress(switch (@bitSizeOf(usize)) {
32 => .@"32",
64 => .@"64",
else => @compileError("unsupported @sizeOf(usize)"),
}) },
FORM.addrx1 => .{ .addrx = try fbr.readInt(u8) },
FORM.addrx2 => .{ .addrx = try fbr.readInt(u16) },
FORM.addrx3 => .{ .addrx = try fbr.readInt(u24) },
FORM.addrx4 => .{ .addrx = try fbr.readInt(u32) },
FORM.addrx => .{ .addrx = try fbr.readUleb128(usize) },
FORM.block1,
FORM.block2,
FORM.block4,
FORM.block,
=> .{ .block = try fbr.readBytes(switch (form_id) {
FORM.block1 => try fbr.readInt(u8),
FORM.block2 => try fbr.readInt(u16),
FORM.block4 => try fbr.readInt(u32),
FORM.block => try fbr.readUleb128(usize),
else => unreachable,
}) },
FORM.data1 => .{ .udata = try fbr.readInt(u8) },
FORM.data2 => .{ .udata = try fbr.readInt(u16) },
FORM.data4 => .{ .udata = try fbr.readInt(u32) },
FORM.data8 => .{ .udata = try fbr.readInt(u64) },
FORM.data16 => .{ .data16 = (try fbr.readBytes(16))[0..16] },
FORM.udata => .{ .udata = try fbr.readUleb128(u64) },
FORM.sdata => .{ .sdata = try fbr.readIleb128(i64) },
FORM.exprloc => .{ .exprloc = try fbr.readBytes(try fbr.readUleb128(usize)) },
FORM.flag => .{ .flag = (try fbr.readByte()) != 0 },
FORM.flag_present => .{ .flag = true },
FORM.sec_offset => .{ .sec_offset = try fbr.readAddress(format) },
FORM.ref1 => .{ .ref = try fbr.readInt(u8) },
FORM.ref2 => .{ .ref = try fbr.readInt(u16) },
FORM.ref4 => .{ .ref = try fbr.readInt(u32) },
FORM.ref8 => .{ .ref = try fbr.readInt(u64) },
FORM.ref_udata => .{ .ref = try fbr.readUleb128(u64) },
FORM.ref_addr => .{ .ref_addr = try fbr.readAddress(format) },
FORM.ref_sig8 => .{ .ref = try fbr.readInt(u64) },
FORM.string => .{ .string = try fbr.readBytesTo(0) },
FORM.strp => .{ .strp = try fbr.readAddress(format) },
FORM.strx1 => .{ .strx = try fbr.readInt(u8) },
FORM.strx2 => .{ .strx = try fbr.readInt(u16) },
FORM.strx3 => .{ .strx = try fbr.readInt(u24) },
FORM.strx4 => .{ .strx = try fbr.readInt(u32) },
FORM.strx => .{ .strx = try fbr.readUleb128(usize) },
FORM.line_strp => .{ .line_strp = try fbr.readAddress(format) },
FORM.indirect => parseFormValue(fbr, try fbr.readUleb128(u64), format, implicit_const),
FORM.implicit_const => .{ .sdata = implicit_const orelse return bad() },
FORM.loclistx => .{ .loclistx = try fbr.readUleb128(u64) },
FORM.rnglistx => .{ .rnglistx = try fbr.readUleb128(u64) },
else => {
//debug.print("unrecognized form id: {x}\n", .{form_id});
return bad();
},
};
}