summaryrefslogtreecommitdiff
path: root/gcc/lto/lto-macho.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/lto/lto-macho.h')
-rw-r--r--gcc/lto/lto-macho.h251
1 files changed, 251 insertions, 0 deletions
diff --git a/gcc/lto/lto-macho.h b/gcc/lto/lto-macho.h
new file mode 100644
index 00000000000..dcd0de3ca3f
--- /dev/null
+++ b/gcc/lto/lto-macho.h
@@ -0,0 +1,251 @@
+/* LTO routines for Mach-O object files.
+ Copyright 2010 Free Software Foundation, Inc.
+ Contributed by Steven Bosscher.
+
+This file is part of GCC.
+
+GCC 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, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+#ifndef LTO_MACH_O_H
+#define LTO_MACH_O_H
+
+/* On-disk file structures. */
+
+/* Mach-O header (32 bits version). */
+struct mach_o_header_32
+{
+ unsigned char magic[4]; /* Magic number. */
+ unsigned char cputype[4]; /* CPU that this object is for. */
+ unsigned char cpusubtype[4]; /* CPU subtype. */
+ unsigned char filetype[4]; /* Type of file. */
+ unsigned char ncmds[4]; /* Number of load commands. */
+ unsigned char sizeofcmds[4]; /* Total size of load commands. */
+ unsigned char flags[4]; /* Flags for special featues. */
+};
+typedef struct mach_o_header_32 mach_o_header_32;
+
+/* Mach-O header (64 bits version). */
+struct mach_o_header_64
+{
+ unsigned char magic[4]; /* Magic number. */
+ unsigned char cputype[4]; /* CPU that this object is for. */
+ unsigned char cpusubtype[4]; /* CPU subtype. */
+ unsigned char filetype[4]; /* Type of file. */
+ unsigned char ncmds[4]; /* Number of load commands. */
+ unsigned char sizeofcmds[4]; /* Total size of load commands. */
+ unsigned char flags[4]; /* Flags for special featues. */
+ unsigned char reserved[4]; /* Reserved. Duh. */
+};
+typedef struct mach_o_header_64 mach_o_header_64;
+
+/* Magic number. */
+#define MACH_O_MH_MAGIC 0xfeedface
+#define MACH_O_MH_CIGAM 0xcefaedfe
+#define MACH_O_MH_MAGIC_64 0xfeedfacf
+#define MACH_O_MH_CIGAM_64 0xcffaedfe
+
+/* Supported CPU types. */
+#define MACH_O_CPU_TYPE_I386 7
+#define MACH_O_CPU_TYPE_X86_64 7 + 0x1000000
+#define MACH_O_CPU_TYPE_POWERPC 18
+#define MACH_O_CPU_TYPE_POWERPC_64 18 + 0x1000000
+
+/* Supported file types. */
+#define MACH_O_MH_OBJECT 0x01
+
+/* Mach-O load command data structure. */
+struct mach_o_load_command
+{
+ unsigned char cmd[4]; /* The type of load command. */
+ unsigned char cmdsize[4]; /* Size in bytes of load command data structure. */
+};
+typedef struct mach_o_load_command mach_o_load_command;
+
+/* Supported load commands. We support only the segment load commands. */
+#define MACH_O_LC_SEGMENT 0x01
+#define MACH_O_LC_SEGMENT_64 0x19
+
+/* LC_SEGMENT load command. */
+struct mach_o_segment_command_32
+{
+ unsigned char cmd[4]; /* The type of load command (LC_SEGMENT). */
+ unsigned char cmdsize[4]; /* Size in bytes of load command data structure. */
+ unsigned char segname[16]; /* Name of this segment. */
+ unsigned char vmaddr[4]; /* Virtual memory address of this segment. */
+ unsigned char vmsize[4]; /* Size there, in bytes. */
+ unsigned char fileoff[4]; /* Offset in bytes of the data to be mapped. */
+ unsigned char filesize[4]; /* Size in bytes on disk. */
+ unsigned char maxprot[4]; /* Maximum permitted vmem protection. */
+ unsigned char initprot[4]; /* Initial vmem protection. */
+ unsigned char nsects[4]; /* Number of sections in this segment. */
+ unsigned char flags[4]; /* Flags that affect the loading. */
+};
+typedef struct mach_o_segment_command_32 mach_o_segment_command_32;
+
+/* LC_SEGMENT_64 load command. Only nsects matters for us, really. */
+struct mach_o_segment_command_64
+{
+ unsigned char cmd[4]; /* The type of load command (LC_SEGMENT_64). */
+ unsigned char cmdsize[4]; /* Size in bytes of load command data structure. */
+ unsigned char segname[16]; /* Name of this segment. */
+ unsigned char vmaddr[8]; /* Virtual memory address of this segment. */
+ unsigned char vmsize[8]; /* Size there, in bytes. */
+ unsigned char fileoff[8]; /* Offset in bytes of the data to be mapped. */
+ unsigned char filesize[8]; /* Size in bytes on disk. */
+ unsigned char maxprot[4]; /* Maximum permitted vmem protection. */
+ unsigned char initprot[4]; /* Initial vmem protection. */
+ unsigned char nsects[4]; /* Number of sections in this segment. */
+ unsigned char flags[4]; /* Flags that affect the loading. */
+};
+typedef struct mach_o_segment_command_64 mach_o_segment_command_64;
+
+/* A Mach-O 32-bits section. */
+struct mach_o_section_32
+{
+ unsigned char sectname[16]; /* Section name. */
+ unsigned char segname[16]; /* Segment that the section belongs to. */
+ unsigned char addr[4]; /* Address of this section in memory. */
+ unsigned char size[4]; /* Size in bytes of this section. */
+ unsigned char offset[4]; /* File offset of this section. */
+ unsigned char align[4]; /* log2 of this section's alignment. */
+ unsigned char reloff[4]; /* File offset of this section's relocs. */
+ unsigned char nreloc[4]; /* Number of relocs for this section. */
+ unsigned char flags[4]; /* Section flags/attributes. */
+ unsigned char reserved1[4];
+ unsigned char reserved2[4];
+};
+typedef struct mach_o_section_32 mach_o_section_32;
+
+/* A Mach-O 64-bits section. */
+struct mach_o_section_64
+{
+ unsigned char sectname[16]; /* Section name. */
+ unsigned char segname[16]; /* Segment that the section belongs to. */
+ unsigned char addr[8]; /* Address of this section in memory. */
+ unsigned char size[8]; /* Size in bytes of this section. */
+ unsigned char offset[4]; /* File offset of this section. */
+ unsigned char align[4]; /* log2 of this section's alignment. */
+ unsigned char reloff[4]; /* File offset of this section's relocs. */
+ unsigned char nreloc[4]; /* Number of relocs for this section. */
+ unsigned char flags[4]; /* Section flags/attributes. */
+ unsigned char reserved1[4];
+ unsigned char reserved2[4];
+ unsigned char reserved3[4];
+};
+typedef struct mach_o_section_64 mach_o_section_64;
+
+/* Flags for Mach-O sections. LTO sections are marked with S_ATTR_DEBUG
+ to instruct the linker to ignore the sections. */
+#define MACH_O_S_ATTR_DEBUG 0x02000000
+
+/* In-memory file structures. */
+
+/* Section data in output files is made of these. */
+struct lto_mach_o_data_d
+{
+ /* Pointer to data block. */
+ void *d_buf;
+
+ /* Size of data block. */
+ ssize_t d_size;
+
+ /* Next data block for this section. */
+ struct lto_mach_o_data_d *next;
+};
+typedef struct lto_mach_o_data_d *lto_mach_o_data;
+
+/* This struct tracks the data for a section. */
+struct lto_mach_o_section_d
+{
+ /* Singly-linked list of section's data blocks. */
+ lto_mach_o_data data_chain;
+
+ /* Offset in string table of the section name. */
+ size_t strtab_offs;
+
+ /* Section name. */
+ const char *name;
+
+ /* Number of trailing padding bytes needed. */
+ ssize_t pad_needed;
+
+ /* Raw section header data. */
+ size_t section_size;
+ union {
+ struct {
+ char sectname[16];
+ char segname[16];
+ } section;
+ mach_o_section_32 section_32;
+ mach_o_section_64 section_64;
+ } u;
+
+ /* Next section for this file. */
+ struct lto_mach_o_section_d *next;
+};
+typedef struct lto_mach_o_section_d *lto_mach_o_section;
+DEF_VEC_P (lto_mach_o_section);
+DEF_VEC_ALLOC_P (lto_mach_o_section, heap);
+
+/* A Mach-O file. */
+struct lto_mach_o_file_d
+{
+ /* The base information. */
+ lto_file base;
+
+ /* Common file members: */
+
+ /* The system file descriptor for the file. */
+ int fd;
+
+ /* The file's overall header. */
+ union {
+ /* We make use here of the fact that section_32 and section_64
+ have the same layout (except for section_64.reserved3). We
+ read the struct of proper size, but only address the first
+ member of this union. */
+ mach_o_header_64 header;
+ mach_o_header_32 header_32;
+ mach_o_header_64 header_64;
+ } u;
+
+ /* All sections in a varray. */
+ VEC(lto_mach_o_section, heap) *section_vec;
+
+ /* Readable file members: */
+
+ /* File total size. */
+ off_t file_size;
+
+ /* True if this file is open for writing. */
+ bool writable;
+
+ /* Section containing the __section_names section. */
+ lto_mach_o_section section_names_section;
+
+ /* Writable file members: */
+
+ /* The currently active section. */
+ lto_mach_o_section scn;
+
+ /* Linked list of data which must be freed *after* the file has been
+ closed. This is an annoying limitation of libelf. Which has been
+ faithfully reproduced here. */
+ struct lto_char_ptr_base *data;
+};
+typedef struct lto_mach_o_file_d lto_mach_o_file;
+
+#endif /* LTO_MACH_O_H */
+