Annotation of src/external/gpl3/binutils/dist/include/mach-o/unwind.h, Revision 1.1.1.2
1.1 christos 1: /* Mach-O compact unwind encoding.
1.1.1.2 ! christos 2: Copyright (C) 2014-2016 Free Software Foundation, Inc.
1.1 christos 3:
4: This file is part of BFD, the Binary File Descriptor library.
5:
6: This program is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 3 of the License, or
9: (at your option) any later version.
10:
11: This program is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with this program; if not, write to the Free Software
18: Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19: MA 02110-1301, USA. */
20:
21: #ifndef _MACH_O_UNWIND_H
22: #define _MACH_O_UNWIND_H
23:
24: /* Encodings bits for all cpus. */
25: #define MACH_O_UNWIND_IS_NOT_FUNCTION_START 0x80000000
26: #define MACH_O_UNWIND_HAS_LSDA 0x40000000
27: #define MACH_O_UNWIND_PERSONALITY_MASK 0x30000000
28: #define MACH_O_UNWIND_PERSONALITY_SHIFT 28
29:
30: /* Encodings for x86-64. */
31:
32: /* Kind of encoding (4 bits). */
33: #define MACH_O_UNWIND_X86_64_MODE_MASK 0x0f000000
34:
35: /* Frame is RBP based, using the standard sequence: push %rbp; mov %rsp, %rbp.
36: Non-volatile registers must be saved in the stack starting at %rbp-8 to
37: %rbp-2040 (offset is encoded in offset bits * 8). Registers saved are
38: encoded in registers bits, 3 bits per register. */
39: #define MACH_O_UNWIND_X86_64_MODE_RBP_FRAME 0x01000000
40: #define MACH_O_UNWIND_X86_64_RBP_FRAME_REGSITERS 0x00007FFF
41: #define MACH_O_UNWIND_X86_64_RBP_FRAME_OFFSET 0x00FF0000
42:
43: /* Frameless function, with a small stack size. */
44: #define MACH_O_UNWIND_X86_64_MODE_STACK_IMMD 0x02000000
45: #define MACH_O_UNWIND_X86_64_FRAMELESS_STACK_SIZE 0x00FF0000
46: #define MACH_O_UNWIND_X86_64_FRAMELESS_REG_COUNT 0x00001C00
47: #define MACH_O_UNWIND_X86_64_FRAMELESS_REG_PERMUTATION 0x000003FF
48:
49: /* Frameless function, with a larger stack size. The stack size is the sum
50: of the X in subq $X,%rsp (address of X is at function + stack size bits)
51: and stack adjust. */
52: #define MACH_O_UNWIND_X86_64_MODE_STACK_IND 0x03000000
53: #define MACH_O_UNWIND_X86_64_FRAMELESS_STACK_ADJUST 0x0000E000
54:
55: /* Use dwarf. */
56: #define MACH_O_UNWIND_X86_64_MODE_DWARF 0x04000000
57: #define MACH_O_UNWIND_X86_64_DWARF_SECTION_OFFSET 0x00ffffff
58:
59: /* Registers. */
60: #define MACH_O_UNWIND_X86_64_REG_NONE 0
61: #define MACH_O_UNWIND_X86_64_REG_RBX 1
62: #define MACH_O_UNWIND_X86_64_REG_R12 2
63: #define MACH_O_UNWIND_X86_64_REG_R13 3
64: #define MACH_O_UNWIND_X86_64_REG_R14 4
65: #define MACH_O_UNWIND_X86_64_REG_R15 5
66: #define MACH_O_UNWIND_X86_64_REG_RBP 6
67:
68: /* Encodings for x86 (almot the same as x86-64). */
69:
70: /* Kind of encoding (4 bits). */
71: #define MACH_O_UNWIND_X86_MODE_MASK 0x0f000000
72:
73: /* Frame is EBP based, using the standard sequence: push %ebp; mov %esp, %ebp.
74: Non-volatile registers must be saved in the stack starting at %ebp-4 to
75: %ebp-240 (offset is encoded in offset bits * 4). Registers saved are
76: encoded in registers bits, 3 bits per register. */
77: #define MACH_O_UNWIND_X86_MODE_EBP_FRAME 0x01000000
78: #define MACH_O_UNWIND_X86_EBP_FRAME_REGSITERS 0x00007FFF
79: #define MACH_O_UNWIND_X86_EBP_FRAME_OFFSET 0x00FF0000
80:
81: /* Frameless function, with a small stack size. */
82: #define MACH_O_UNWIND_X86_MODE_STACK_IMMD 0x02000000
83: #define MACH_O_UNWIND_X86_FRAMELESS_STACK_SIZE 0x00FF0000
84: #define MACH_O_UNWIND_X86_FRAMELESS_REG_COUNT 0x00001C00
85: #define MACH_O_UNWIND_X86_FRAMELESS_REG_PERMUTATION 0x000003FF
86:
87: /* Frameless function, with a larger stack size. The stack size is the sum
88: of the X in subq $X,%esp (address of X is at function + stack size bits)
89: and stack adjust. */
90: #define MACH_O_UNWIND_X86_MODE_STACK_IND 0x03000000
91: #define MACH_O_UNWIND_X86_FRAMELESS_STACK_ADJUST 0x0000E000
92:
93: /* Use dwarf. */
94: #define MACH_O_UNWIND_X86_MODE_DWARF 0x04000000
95: #define MACH_O_UNWIND_X86_DWARF_SECTION_OFFSET 0x00ffffff
96:
97: /* Registers. */
98: #define MACH_O_UNWIND_X86_REG_NONE 0
99: #define MACH_O_UNWIND_X86_REG_EBX 1
100: #define MACH_O_UNWIND_X86_REG_ECX 2
101: #define MACH_O_UNWIND_X86_REG_EDX 3
102: #define MACH_O_UNWIND_X86_REG_EDI 4
103: #define MACH_O_UNWIND_X86_REG_ESI 5
104: #define MACH_O_UNWIND_X86_REG_EBP 6
105:
1.1.1.2 ! christos 106: /* Encodings for arm64. */
! 107:
! 108: #define MACH_O_UNWIND_ARM64_MODE_MASK 0x0f000000
! 109:
! 110: /* Leaf function: FP/LR are *not* saved, none or some non-volatile registers
! 111: are saved, stack is allocated. The size of the frame (register saved and
! 112: memory) is encoded in STACK_SIZE in 16 byte units. */
! 113: #define MACH_O_UNWIND_ARM64_MODE_FRAMELESS 0x02000000
! 114:
! 115: #define MACH_O_UNWIND_ARM64_MODE_DWARF 0x03000000
! 116:
! 117: /* Standard frame: FP/LR are pushed, SP is copied to FP, then non-volatile
! 118: registers are saved. */
! 119: #define MACH_O_UNWIND_ARM64_MODE_FRAME 0x04000000
! 120:
! 121: /* Registers (for FRAME). */
! 122: #define MACH_O_UNWIND_ARM64_FRAME_X19_X20_PAIR 0x00000001
! 123: #define MACH_O_UNWIND_ARM64_FRAME_X21_X22_PAIR 0x00000002
! 124: #define MACH_O_UNWIND_ARM64_FRAME_X23_X24_PAIR 0x00000004
! 125: #define MACH_O_UNWIND_ARM64_FRAME_X25_X26_PAIR 0x00000008
! 126: #define MACH_O_UNWIND_ARM64_FRAME_X27_X28_PAIR 0x00000010
! 127: #define MACH_O_UNWIND_ARM64_FRAME_D8_D9_PAIR 0x00000100
! 128: #define MACH_O_UNWIND_ARM64_FRAME_D10_D11_PAIR 0x00000200
! 129: #define MACH_O_UNWIND_ARM64_FRAME_D12_D13_PAIR 0x00000400
! 130: #define MACH_O_UNWIND_ARM64_FRAME_D14_D15_PAIR 0x00000800
! 131:
! 132: #define MACH_O_UNWIND_ARM64_FRAMELESS_STACK_SIZE_MASK 0x00fff000
! 133: #define MACH_O_UNWIND_ARM64_DWARF_SECTION_OFFSET 0x00ffffff
! 134:
1.1 christos 135: /* Entry in object file (in __LD,__compact_unwind section). */
136:
137: struct mach_o_compact_unwind_32
138: {
139: unsigned char start[4];
140: unsigned char length[4];
141: unsigned char encoding[4];
142: unsigned char personality[4];
143: unsigned char lsda[4];
144: };
145:
146: struct mach_o_compact_unwind_64
147: {
148: unsigned char start[8];
149: unsigned char length[4];
150: unsigned char encoding[4];
151: unsigned char personality[8];
152: unsigned char lsda[8];
153: };
154:
155: /* Header in images (in __TEXT,__unwind_info). */
156:
157: #define MACH_O_UNWIND_SECTION_VERSION 1 /* Current verion in header. */
158: struct mach_o_unwind_info_header
159: {
160: unsigned char version[4]; /* Currently MACH_O_UNWIND_SECTION_VERSION. */
161: unsigned char encodings_array_offset[4];
162: unsigned char encodings_array_count[4];
163: unsigned char personality_array_offset[4];
164: unsigned char personality_array_count[4];
165: unsigned char index_offset[4];
166: unsigned char index_count[4];
167: /* Followed by:
168: - encodings array
169: These are the encodings shared, for index < encoding_array_count
170: - personality array
171: count given by personality_array_count
172: - index entries
173: count given by index_count
174: - lsda index entries
175: last offset given by lsda offset of last index_entry.
176: */
177: };
178:
179: struct mach_o_unwind_index_entry
180: {
181: unsigned char function_offset[4];
182: unsigned char second_level_offset[4];
183: unsigned char lsda_index_offset[4];
184: };
185:
186: struct mach_o_unwind_lsda_index_entry
187: {
188: unsigned char function_offset[4];
189: unsigned char lsda_offset[4];
190: };
191:
192: /* Second level index pages. */
193:
194: #define MACH_O_UNWIND_SECOND_LEVEL_REGULAR 2
195: struct mach_o_unwind_regular_second_level_page_header
196: {
197: unsigned char kind[4];
198: unsigned char entry_page_offset[2];
199: unsigned char entry_count[2];
200: /* Array of entries. */
201: };
202:
203: struct mach_o_unwind_regular_second_level_entry
204: {
205: unsigned char function_offset[4];
206: unsigned char encoding[4];
207: };
208:
209: #define MACH_O_UNWIND_SECOND_LEVEL_COMPRESSED 3
210: struct mach_o_unwind_compressed_second_level_page_header
211: {
212: unsigned char kind[4];
213: unsigned char entry_page_offset[2];
214: unsigned char entry_count[2];
215: unsigned char encodings_offset[2];
216: unsigned char encodings_count[2];
217: /* Followed by entries array (one word, see below). */
218: /* Followed by (non-common) encodings array. */
219: };
220:
221: /* Compressed entries are one word, containing function offset and encoding
222: index. */
223: #define MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(en) \
224: ((en) & 0x00FFFFFF)
225: #define MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX(en) \
226: (((en) >> 24) & 0xFF)
227:
228: #endif /* _MACH_O_UNWIND_H */
CVSweb <webmaster@jp.NetBSD.org>