#include <mach-o/compact_unwind_encoding.h>
mach-o/compact_unwind_encoding.h
===----------------------------------------------------------------------===//
7 enums · 6 structs · 5 macros · 1 typedef
The compact unwind encoding is a 32-bit value which encoded in an
architecture specific way, which registers to restore from where, and how
to unwind out of the function.
typedef uint32_t compact_unwind_encoding_t
architecture independent bits
underlying type unsigned int
| UNWIND_IS_NOT_FUNCTION_START | 2147483648 | |
| UNWIND_HAS_LSDA | 1073741824 | |
| UNWIND_PERSONALITY_MASK | 805306368 | |
x86
1-bit: start
1-bit: has lsda
2-bit: personality index
4-bits: 0=old, 1=ebp based, 2=stack-imm, 3=stack-ind, 4=DWARF
ebp based:
15-bits (5*3-bits per reg) register permutation
8-bits for stack offset
frameless:
8-bits stack size
3-bits stack adjust
3-bits register count
10-bits register permutation
underlying type unsigned int
| UNWIND_X86_MODE_MASK | 251658240 | |
| UNWIND_X86_MODE_EBP_FRAME | 16777216 | |
| UNWIND_X86_MODE_STACK_IMMD | 33554432 | |
| UNWIND_X86_MODE_STACK_IND | 50331648 | |
| UNWIND_X86_MODE_DWARF | 67108864 | |
| UNWIND_X86_EBP_FRAME_REGISTERS | 32767 | |
| UNWIND_X86_EBP_FRAME_OFFSET | 16711680 | |
| UNWIND_X86_FRAMELESS_STACK_SIZE | 16711680 | |
| UNWIND_X86_FRAMELESS_STACK_ADJUST | 57344 | |
| UNWIND_X86_FRAMELESS_STACK_REG_COUNT | 7168 | |
| UNWIND_X86_FRAMELESS_STACK_REG_PERMUTATION | 1023 | |
| UNWIND_X86_DWARF_SECTION_OFFSET | 16777215 | |
underlying type unsigned int
| UNWIND_X86_REG_NONE | 0 | |
| UNWIND_X86_REG_EBX | 1 | |
| UNWIND_X86_REG_ECX | 2 | |
| UNWIND_X86_REG_EDX | 3 | |
| UNWIND_X86_REG_EDI | 4 | |
| UNWIND_X86_REG_ESI | 5 | |
| UNWIND_X86_REG_EBP | 6 | |
x86_64
1-bit: start
1-bit: has lsda
2-bit: personality index
4-bits: 0=old, 1=rbp based, 2=stack-imm, 3=stack-ind, 4=DWARF
rbp based:
15-bits (5*3-bits per reg) register permutation
8-bits for stack offset
frameless:
8-bits stack size
3-bits stack adjust
3-bits register count
10-bits register permutation
underlying type unsigned int
| UNWIND_X86_64_MODE_MASK | 251658240 | |
| UNWIND_X86_64_MODE_RBP_FRAME | 16777216 | |
| UNWIND_X86_64_MODE_STACK_IMMD | 33554432 | |
| UNWIND_X86_64_MODE_STACK_IND | 50331648 | |
| UNWIND_X86_64_MODE_DWARF | 67108864 | |
| UNWIND_X86_64_RBP_FRAME_REGISTERS | 32767 | |
| UNWIND_X86_64_RBP_FRAME_OFFSET | 16711680 | |
| UNWIND_X86_64_FRAMELESS_STACK_SIZE | 16711680 | |
| UNWIND_X86_64_FRAMELESS_STACK_ADJUST | 57344 | |
| UNWIND_X86_64_FRAMELESS_STACK_REG_COUNT | 7168 | |
| UNWIND_X86_64_FRAMELESS_STACK_REG_PERMUTATION | 1023 | |
| UNWIND_X86_64_DWARF_SECTION_OFFSET | 16777215 | |
underlying type unsigned int
| UNWIND_X86_64_REG_NONE | 0 | |
| UNWIND_X86_64_REG_RBX | 1 | |
| UNWIND_X86_64_REG_R12 | 2 | |
| UNWIND_X86_64_REG_R13 | 3 | |
| UNWIND_X86_64_REG_R14 | 4 | |
| UNWIND_X86_64_REG_R15 | 5 | |
| UNWIND_X86_64_REG_RBP | 6 | |
ARM64
1-bit: start
1-bit: has lsda
2-bit: personality index
4-bits: 4=frame-based, 3=DWARF, 2=frameless
frameless:
12-bits of stack size
frame-based:
4-bits D reg pairs saved
5-bits X reg pairs saved
DWARF:
24-bits offset of DWARF FDE in __eh_frame section
underlying type unsigned int
| UNWIND_ARM64_MODE_MASK | 251658240 | |
| UNWIND_ARM64_MODE_FRAMELESS | 33554432 | |
| UNWIND_ARM64_MODE_DWARF | 50331648 | |
| UNWIND_ARM64_MODE_FRAME | 67108864 | |
| UNWIND_ARM64_FRAME_X19_X20_PAIR | 1 | |
| UNWIND_ARM64_FRAME_X21_X22_PAIR | 2 | |
| UNWIND_ARM64_FRAME_X23_X24_PAIR | 4 | |
| UNWIND_ARM64_FRAME_X25_X26_PAIR | 8 | |
| UNWIND_ARM64_FRAME_X27_X28_PAIR | 16 | |
| UNWIND_ARM64_FRAME_D8_D9_PAIR | 256 | |
| UNWIND_ARM64_FRAME_D10_D11_PAIR | 512 | |
| UNWIND_ARM64_FRAME_D12_D13_PAIR | 1024 | |
| UNWIND_ARM64_FRAME_D14_D15_PAIR | 2048 | |
| UNWIND_ARM64_FRAMELESS_STACK_SIZE_MASK | 16773120 | |
| UNWIND_ARM64_DWARF_SECTION_OFFSET | 16777215 | |
armv7k
1-bit: start
1-bit: has lsda
2-bit: personality index
4-bits: 1=frame, 2=frame+dregs, 4=dwarf
underlying type unsigned int
| UNWIND_ARM_MODE_MASK | 251658240 | |
| UNWIND_ARM_MODE_FRAME | 16777216 | |
| UNWIND_ARM_MODE_FRAME_D | 33554432 | |
| UNWIND_ARM_MODE_DWARF | 67108864 | |
| UNWIND_ARM_FRAME_STACK_ADJUST_MASK | 12582912 | |
| UNWIND_ARM_FRAME_FIRST_PUSH_R4 | 1 | |
| UNWIND_ARM_FRAME_FIRST_PUSH_R5 | 2 | |
| UNWIND_ARM_FRAME_FIRST_PUSH_R6 | 4 | |
| UNWIND_ARM_FRAME_SECOND_PUSH_R8 | 8 | |
| UNWIND_ARM_FRAME_SECOND_PUSH_R9 | 16 | |
| UNWIND_ARM_FRAME_SECOND_PUSH_R10 | 32 | |
| UNWIND_ARM_FRAME_SECOND_PUSH_R11 | 64 | |
| UNWIND_ARM_FRAME_SECOND_PUSH_R12 | 128 | |
| UNWIND_ARM_FRAME_D_REG_COUNT_MASK | 1792 | |
| UNWIND_ARM_DWARF_SECTION_OFFSET | 16777215 | |
#define UNWIND_SECTION_VERSION 1
#define UNWIND_SECOND_LEVEL_REGULAR 2
#define UNWIND_SECOND_LEVEL_COMPRESSED 3
#define UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(entry) (entry & 0x00FFFFFF)
#define UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX(entry) ((entry >> 24) & 0xFF)