Function scanCieFdeInfo [src]

Scan .eh_frame and .debug_frame and build a sorted list of FDEs for binary searching during unwinding.

Prototype

pub fn scanCieFdeInfo(di: *Dwarf, allocator: Allocator, base_address: usize) !void

Parameters

di: *Dwarfallocator: Allocatorbase_address: usize

Source

pub fn scanCieFdeInfo(di: *Dwarf, allocator: Allocator, base_address: usize) !void { const frame_sections = [2]Section.Id{ .eh_frame, .debug_frame }; for (frame_sections) |frame_section| { if (di.section(frame_section)) |section_data| { var fbr: FixedBufferReader = .{ .buf = section_data, .endian = di.endian }; while (fbr.pos < fbr.buf.len) { const entry_header = try EntryHeader.read(&fbr, null, frame_section); switch (entry_header.type) { .cie => { const cie = try CommonInformationEntry.parse( entry_header.entry_bytes, di.sectionVirtualOffset(frame_section, base_address).?, true, entry_header.format, frame_section, entry_header.length_offset, @sizeOf(usize), di.endian, ); try di.cie_map.put(allocator, entry_header.length_offset, cie); }, .fde => |cie_offset| { const cie = di.cie_map.get(cie_offset) orelse return bad(); const fde = try FrameDescriptionEntry.parse( entry_header.entry_bytes, di.sectionVirtualOffset(frame_section, base_address).?, true, cie, @sizeOf(usize), di.endian, ); try di.fde_list.append(allocator, fde); }, .terminator => break, } } std.mem.sortUnstable(FrameDescriptionEntry, di.fde_list.items, {}, struct { fn lessThan(ctx: void, a: FrameDescriptionEntry, b: FrameDescriptionEntry) bool { _ = ctx; return a.pc_begin < b.pc_begin; } }.lessThan); } } }