mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
macho: add missing defs of compact unwind info records
This commit is contained in:
parent
0420ad0292
commit
433709a788
@ -1912,3 +1912,90 @@ pub const LoadCommandIterator = struct {
|
|||||||
return cmd;
|
return cmd;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const compact_unwind_encoding_t = u32;
|
||||||
|
|
||||||
|
// Relocatable object files: __LD,__compact_unwind
|
||||||
|
|
||||||
|
pub const compact_unwind_entry = extern struct {
|
||||||
|
rangeStart: u64,
|
||||||
|
rangeLength: u32,
|
||||||
|
compactUnwindEncoding: u32,
|
||||||
|
personalityFunction: u64,
|
||||||
|
lsda: u64,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Final linked images: __TEXT,__unwind_info
|
||||||
|
// The __TEXT,__unwind_info section is laid out for an efficient two level lookup.
|
||||||
|
// The header of the section contains a coarse index that maps function address
|
||||||
|
// to the page (4096 byte block) containing the unwind info for that function.
|
||||||
|
|
||||||
|
pub const UNWIND_SECTION_VERSION = 1;
|
||||||
|
pub const UNWIND_SECOND_LEVEL_REGULAR = 2;
|
||||||
|
pub const UNWIND_SECOND_LEVEL_COMPRESSED = 3;
|
||||||
|
|
||||||
|
pub const unwind_info_section_header = extern struct {
|
||||||
|
/// UNWIND_SECTION_VERSION
|
||||||
|
version: u32 = UNWIND_SECTION_VERSION,
|
||||||
|
commonEncodingsArraySectionOffset: u32,
|
||||||
|
commonEncodingsArrayCount: u32,
|
||||||
|
personalityArraySectionOffset: u32,
|
||||||
|
personalityArrayCount: u32,
|
||||||
|
indexSectionOffset: u32,
|
||||||
|
indexCount: u32,
|
||||||
|
// compact_unwind_encoding_t[]
|
||||||
|
// uint32_t personalities[]
|
||||||
|
// unwind_info_section_header_index_entry[]
|
||||||
|
// unwind_info_section_header_lsda_index_entry[]
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const unwind_info_section_header_index_entry = extern struct {
|
||||||
|
functionOffset: u32,
|
||||||
|
|
||||||
|
/// section offset to start of regular or compress page
|
||||||
|
secondLevelPagesSectionOffset: u32,
|
||||||
|
|
||||||
|
/// section offset to start of lsda_index array for this range
|
||||||
|
lsdaIndexArraySectionOffset: u32,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const unwind_info_section_header_lsda_index_entry = extern struct {
|
||||||
|
functionOffset: u32,
|
||||||
|
lsdaOffset: u32,
|
||||||
|
};
|
||||||
|
|
||||||
|
// There are two kinds of second level index pages: regular and compressed.
|
||||||
|
// A compressed page can hold up to 1021 entries, but it cannot be used if
|
||||||
|
// too many different encoding types are used. The regular page holds 511
|
||||||
|
// entries.
|
||||||
|
|
||||||
|
pub const unwind_info_regular_second_level_entry = extern struct {
|
||||||
|
functionOffset: u32,
|
||||||
|
encoding: compact_unwind_encoding_t,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const unwind_info_regular_second_level_page_header = extern struct {
|
||||||
|
/// UNWIND_SECOND_LEVEL_REGULAR
|
||||||
|
kind: u32 = UNWIND_SECOND_LEVEL_REGULAR,
|
||||||
|
|
||||||
|
entryPageOffset: u16,
|
||||||
|
entryCount: u16,
|
||||||
|
// entry array
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const unwind_info_compressed_second_level_page_header = extern struct {
|
||||||
|
/// UNWIND_SECOND_LEVEL_COMPRESSED
|
||||||
|
kind: u32 = UNWIND_SECOND_LEVEL_COMPRESSED,
|
||||||
|
|
||||||
|
entryPageOffset: u16,
|
||||||
|
entryCount: u16,
|
||||||
|
encodingsPageOffset: u16,
|
||||||
|
encodingsCount: u16,
|
||||||
|
// 32bit entry array
|
||||||
|
// encodings array
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const UnwindInfoCompressedEntry = packed struct(u32) {
|
||||||
|
funcOffset: u24,
|
||||||
|
encodingIndex: u8,
|
||||||
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user