aboutsummaryrefslogtreecommitdiff
path: root/include/mach-o
diff options
context:
space:
mode:
authorTristan Gingold <tristan.gingold@adacore.com>2014-03-17 09:46:36 +0100
committerTristan Gingold <tristan.gingold@adacore.com>2014-03-17 10:29:07 +0100
commit167e1c1f1fde89cb29a9dae05a9c6cac5d27fdb2 (patch)
tree24071fdc983a55d9599b7ca17f2763f56891d71b /include/mach-o
parentfbe383b9ee1b597e294ee41b795308d504fd09f5 (diff)
downloadgdb-167e1c1f1fde89cb29a9dae05a9c6cac5d27fdb2.zip
gdb-167e1c1f1fde89cb29a9dae05a9c6cac5d27fdb2.tar.gz
gdb-167e1c1f1fde89cb29a9dae05a9c6cac5d27fdb2.tar.bz2
od-macho: dump compact unwind info.
binutils/ * od-macho.c (dump_section_header): Renames of dump_section. (dump_segment): Adjust after renaming. (OPT_COMPACT_UNWIND): Define. (options): Add compact unwind. (mach_o_help): Document compact_unwind. (unwind_x86_64_regs, unwind_x86_regs): New arrays. (dump_unwind_encoding_x86, dump_unwind_encoding) (dump_obj_compact_unwind, dump_exe_compact_unwind) (dump_section_content): New functions. (mach_o_dump): Handle compact unwind. include/mach-o/ * unwind.h: New file.
Diffstat (limited to 'include/mach-o')
-rw-r--r--include/mach-o/ChangeLog4
-rw-r--r--include/mach-o/unwind.h199
2 files changed, 203 insertions, 0 deletions
diff --git a/include/mach-o/ChangeLog b/include/mach-o/ChangeLog
index 5be7170..c4a4a2c 100644
--- a/include/mach-o/ChangeLog
+++ b/include/mach-o/ChangeLog
@@ -1,3 +1,7 @@
+2014-03-17 Tristan Gingold <gingold@adacore.com>
+
+ * unwind.h: New file.
+
2014-03-05 Alan Modra <amodra@gmail.com>
Update copyright years.
diff --git a/include/mach-o/unwind.h b/include/mach-o/unwind.h
new file mode 100644
index 0000000..f67c75b
--- /dev/null
+++ b/include/mach-o/unwind.h
@@ -0,0 +1,199 @@
+/* Mach-O compact unwind encoding.
+ Copyright (C) 2014 Free Software Foundation, Inc.
+
+ This file is part of BFD, the Binary File Descriptor library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
+
+#ifndef _MACH_O_UNWIND_H
+#define _MACH_O_UNWIND_H
+
+/* Encodings bits for all cpus. */
+#define MACH_O_UNWIND_IS_NOT_FUNCTION_START 0x80000000
+#define MACH_O_UNWIND_HAS_LSDA 0x40000000
+#define MACH_O_UNWIND_PERSONALITY_MASK 0x30000000
+#define MACH_O_UNWIND_PERSONALITY_SHIFT 28
+
+/* Encodings for x86-64. */
+
+/* Kind of encoding (4 bits). */
+#define MACH_O_UNWIND_X86_64_MODE_MASK 0x0f000000
+
+/* Frame is RBP based, using the standard sequence: push %rbp; mov %rsp, %rbp.
+ Non-volatile registers must be saved in the stack starting at %rbp-8 to
+ %rbp-2040 (offset is encoded in offset bits * 8). Registers saved are
+ encoded in registers bits, 3 bits per register. */
+#define MACH_O_UNWIND_X86_64_MODE_RBP_FRAME 0x01000000
+#define MACH_O_UNWIND_X86_64_RBP_FRAME_REGSITERS 0x00007FFF
+#define MACH_O_UNWIND_X86_64_RBP_FRAME_OFFSET 0x00FF0000
+
+/* Frameless function, with a small stack size. */
+#define MACH_O_UNWIND_X86_64_MODE_STACK_IMMD 0x02000000
+#define MACH_O_UNWIND_X86_64_FRAMELESS_STACK_SIZE 0x00FF0000
+#define MACH_O_UNWIND_X86_64_FRAMELESS_REG_COUNT 0x00001C00
+#define MACH_O_UNWIND_X86_64_FRAMELESS_REG_PERMUTATION 0x000003FF
+
+/* Frameless function, with a larger stack size. The stack size is the sum
+ of the X in subq $X,%rsp (address of X is at function + stack size bits)
+ and stack adjust. */
+#define MACH_O_UNWIND_X86_64_MODE_STACK_IND 0x03000000
+#define MACH_O_UNWIND_X86_64_FRAMELESS_STACK_ADJUST 0x0000E000
+
+/* Use dwarf. */
+#define MACH_O_UNWIND_X86_64_MODE_DWARF 0x04000000
+#define MACH_O_UNWIND_X86_64_DWARF_SECTION_OFFSET 0x00ffffff
+
+/* Registers. */
+#define MACH_O_UNWIND_X86_64_REG_NONE 0
+#define MACH_O_UNWIND_X86_64_REG_RBX 1
+#define MACH_O_UNWIND_X86_64_REG_R12 2
+#define MACH_O_UNWIND_X86_64_REG_R13 3
+#define MACH_O_UNWIND_X86_64_REG_R14 4
+#define MACH_O_UNWIND_X86_64_REG_R15 5
+#define MACH_O_UNWIND_X86_64_REG_RBP 6
+
+/* Encodings for x86 (almot the same as x86-64). */
+
+/* Kind of encoding (4 bits). */
+#define MACH_O_UNWIND_X86_MODE_MASK 0x0f000000
+
+/* Frame is EBP based, using the standard sequence: push %ebp; mov %esp, %ebp.
+ Non-volatile registers must be saved in the stack starting at %ebp-4 to
+ %ebp-240 (offset is encoded in offset bits * 4). Registers saved are
+ encoded in registers bits, 3 bits per register. */
+#define MACH_O_UNWIND_X86_MODE_EBP_FRAME 0x01000000
+#define MACH_O_UNWIND_X86_EBP_FRAME_REGSITERS 0x00007FFF
+#define MACH_O_UNWIND_X86_EBP_FRAME_OFFSET 0x00FF0000
+
+/* Frameless function, with a small stack size. */
+#define MACH_O_UNWIND_X86_MODE_STACK_IMMD 0x02000000
+#define MACH_O_UNWIND_X86_FRAMELESS_STACK_SIZE 0x00FF0000
+#define MACH_O_UNWIND_X86_FRAMELESS_REG_COUNT 0x00001C00
+#define MACH_O_UNWIND_X86_FRAMELESS_REG_PERMUTATION 0x000003FF
+
+/* Frameless function, with a larger stack size. The stack size is the sum
+ of the X in subq $X,%esp (address of X is at function + stack size bits)
+ and stack adjust. */
+#define MACH_O_UNWIND_X86_MODE_STACK_IND 0x03000000
+#define MACH_O_UNWIND_X86_FRAMELESS_STACK_ADJUST 0x0000E000
+
+/* Use dwarf. */
+#define MACH_O_UNWIND_X86_MODE_DWARF 0x04000000
+#define MACH_O_UNWIND_X86_DWARF_SECTION_OFFSET 0x00ffffff
+
+/* Registers. */
+#define MACH_O_UNWIND_X86_REG_NONE 0
+#define MACH_O_UNWIND_X86_REG_EBX 1
+#define MACH_O_UNWIND_X86_REG_ECX 2
+#define MACH_O_UNWIND_X86_REG_EDX 3
+#define MACH_O_UNWIND_X86_REG_EDI 4
+#define MACH_O_UNWIND_X86_REG_ESI 5
+#define MACH_O_UNWIND_X86_REG_EBP 6
+
+/* Entry in object file (in __LD,__compact_unwind section). */
+
+struct mach_o_compact_unwind_32
+{
+ unsigned char start[4];
+ unsigned char length[4];
+ unsigned char encoding[4];
+ unsigned char personality[4];
+ unsigned char lsda[4];
+};
+
+struct mach_o_compact_unwind_64
+{
+ unsigned char start[8];
+ unsigned char length[4];
+ unsigned char encoding[4];
+ unsigned char personnality[8];
+ unsigned char lsda[8];
+};
+
+/* Header in images (in __TEXT,__unwind_info). */
+
+#define MACH_O_UNWIND_SECTION_VERSION 1 /* Current verion in header. */
+struct mach_o_unwind_info_header
+{
+ unsigned char version[4]; /* Currently MACH_O_UNWIND_SECTION_VERSION. */
+ unsigned char encodings_array_offset[4];
+ unsigned char encodings_array_count[4];
+ unsigned char personality_array_offset[4];
+ unsigned char personality_array_count[4];
+ unsigned char index_offset[4];
+ unsigned char index_count[4];
+ /* Followed by:
+ - encodings array
+ These are the encodings shared, for index < encoding_array_count
+ - personality array
+ count given by personality_array_count
+ - index entries
+ count given by index_count
+ - lsda index entries
+ last offset given by lsda offset of last index_entry.
+ */
+};
+
+struct mach_o_unwind_index_entry
+{
+ unsigned char function_offset[4];
+ unsigned char second_level_offset[4];
+ unsigned char lsda_index_offset[4];
+};
+
+struct mach_o_unwind_lsda_index_entry
+{
+ unsigned char function_offset[4];
+ unsigned char lsda_offset[4];
+};
+
+/* Second level index pages. */
+
+#define MACH_O_UNWIND_SECOND_LEVEL_REGULAR 2
+struct mach_o_unwind_regular_second_level_page_header
+{
+ unsigned char kind[4];
+ unsigned char entry_page_offset[2];
+ unsigned char entry_count[2];
+ /* Array of entries. */
+};
+
+struct mach_o_unwind_regular_second_level_entry
+{
+ unsigned char function_offset[4];
+ unsigned char encoding[4];
+};
+
+#define MACH_O_UNWIND_SECOND_LEVEL_COMPRESSED 3
+struct mach_o_unwind_compressed_second_level_page_header
+{
+ unsigned char kind[4];
+ unsigned char entry_page_offset[2];
+ unsigned char entry_count[2];
+ unsigned char encodings_offset[2];
+ unsigned char encodings_count[2];
+ /* Followed by entries array (one word, see below). */
+ /* Followed by (non-common) encodings array. */
+};
+
+/* Compressed entries are one word, containing function offset and encoding
+ index. */
+#define MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(en) \
+ ((en) & 0x00FFFFFF)
+#define MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX(en) \
+ (((en) >> 24) & 0xFF)
+
+#endif /* _MACH_O_UNWIND_H */