1/* LTO routines for Mach-O object files.
2   Copyright 2010 Free Software Foundation, Inc.
3   Contributed by Steven Bosscher.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3.  If not see
19<http://www.gnu.org/licenses/>.  */
20
21#ifndef LTO_MACH_O_H
22#define LTO_MACH_O_H
23
24/* On-disk file structures.  */
25
26/* Mach-O header (32 bits version).  */
27struct mach_o_header_32
28{
29  unsigned char magic[4];	/* Magic number.  */
30  unsigned char cputype[4];	/* CPU that this object is for.  */
31  unsigned char cpusubtype[4];	/* CPU subtype.  */
32  unsigned char filetype[4];	/* Type of file.  */
33  unsigned char ncmds[4];	/* Number of load commands.  */
34  unsigned char sizeofcmds[4];	/* Total size of load commands.  */
35  unsigned char flags[4];	/* Flags for special featues.  */
36};
37typedef struct mach_o_header_32 mach_o_header_32;
38
39/* Mach-O header (64 bits version).  */
40struct mach_o_header_64
41{
42  unsigned char magic[4];	/* Magic number.  */
43  unsigned char cputype[4];	/* CPU that this object is for.  */
44  unsigned char cpusubtype[4];	/* CPU subtype.  */
45  unsigned char filetype[4];	/* Type of file.  */
46  unsigned char ncmds[4];	/* Number of load commands.  */
47  unsigned char sizeofcmds[4];	/* Total size of load commands.  */
48  unsigned char flags[4];	/* Flags for special featues.  */
49  unsigned char reserved[4];	/* Reserved.  Duh.  */
50};
51typedef struct mach_o_header_64 mach_o_header_64;
52
53/* Magic number.  */
54#define MACH_O_MH_MAGIC			0xfeedface
55#define MACH_O_MH_CIGAM			0xcefaedfe
56#define MACH_O_MH_MAGIC_64		0xfeedfacf
57#define MACH_O_MH_CIGAM_64		0xcffaedfe
58
59/* Supported CPU types.  */
60#define MACH_O_CPU_TYPE_I386		7
61#define MACH_O_CPU_TYPE_X86_64		7 + 0x1000000
62#define MACH_O_CPU_TYPE_POWERPC		18
63#define MACH_O_CPU_TYPE_POWERPC_64	18 + 0x1000000
64
65/* Supported file types.  */
66#define MACH_O_MH_OBJECT		0x01
67
68/* Mach-O load command data structure.  */
69struct mach_o_load_command
70{
71  unsigned char cmd[4];		/* The type of load command.  */
72  unsigned char cmdsize[4];	/* Size in bytes of load command data structure.  */
73};
74typedef struct mach_o_load_command mach_o_load_command;
75
76/* Supported load commands.  We support only the segment load commands.  */
77#define MACH_O_LC_SEGMENT		0x01
78#define MACH_O_LC_SEGMENT_64		0x19
79
80/* LC_SEGMENT load command.  */
81struct mach_o_segment_command_32
82{
83  unsigned char cmd[4];		/* The type of load command (LC_SEGMENT).  */
84  unsigned char cmdsize[4];	/* Size in bytes of load command data structure.  */
85  unsigned char segname[16];	/* Name of this segment.  */
86  unsigned char vmaddr[4];	/* Virtual memory address of this segment.  */
87  unsigned char vmsize[4];	/* Size there, in bytes.  */
88  unsigned char fileoff[4];	/* Offset in bytes of the data to be mapped.  */
89  unsigned char filesize[4];	/* Size in bytes on disk.  */
90  unsigned char maxprot[4];	/* Maximum permitted vmem protection.  */
91  unsigned char initprot[4];	/* Initial vmem protection.  */
92  unsigned char nsects[4];	/* Number of sections in this segment.  */
93  unsigned char flags[4];	/* Flags that affect the loading.  */
94};
95typedef struct mach_o_segment_command_32 mach_o_segment_command_32;
96
97/* LC_SEGMENT_64 load command.  Only nsects matters for us, really.  */
98struct mach_o_segment_command_64
99{
100  unsigned char cmd[4];		/* The type of load command (LC_SEGMENT_64).  */
101  unsigned char cmdsize[4];	/* Size in bytes of load command data structure.  */
102  unsigned char segname[16];	/* Name of this segment.  */
103  unsigned char vmaddr[8];	/* Virtual memory address of this segment.  */
104  unsigned char vmsize[8];	/* Size there, in bytes.  */
105  unsigned char fileoff[8];	/* Offset in bytes of the data to be mapped.  */
106  unsigned char filesize[8];	/* Size in bytes on disk.  */
107  unsigned char maxprot[4];	/* Maximum permitted vmem protection.  */
108  unsigned char initprot[4];	/* Initial vmem protection.  */
109  unsigned char nsects[4];	/* Number of sections in this segment.  */
110  unsigned char flags[4];	/* Flags that affect the loading.  */
111};
112typedef struct mach_o_segment_command_64 mach_o_segment_command_64;
113
114/* A Mach-O 32-bits section.  */
115struct mach_o_section_32
116{
117  unsigned char sectname[16];	/* Section name.  */
118  unsigned char segname[16];	/* Segment that the section belongs to.  */
119  unsigned char addr[4];	/* Address of this section in memory.  */
120  unsigned char size[4];	/* Size in bytes of this section.  */
121  unsigned char offset[4];	/* File offset of this section.  */
122  unsigned char align[4];	/* log2 of this section's alignment.  */
123  unsigned char reloff[4];	/* File offset of this section's relocs.  */
124  unsigned char nreloc[4];	/* Number of relocs for this section.  */
125  unsigned char flags[4];	/* Section flags/attributes.  */
126  unsigned char reserved1[4];
127  unsigned char reserved2[4];
128};
129typedef struct mach_o_section_32 mach_o_section_32;
130
131/* A Mach-O 64-bits section.  */
132struct mach_o_section_64
133{
134  unsigned char sectname[16];	/* Section name.  */
135  unsigned char segname[16];	/* Segment that the section belongs to.  */
136  unsigned char addr[8];	/* Address of this section in memory.  */
137  unsigned char size[8];	/* Size in bytes of this section.  */
138  unsigned char offset[4];	/* File offset of this section.  */
139  unsigned char align[4];	/* log2 of this section's alignment.  */
140  unsigned char reloff[4];	/* File offset of this section's relocs.  */
141  unsigned char nreloc[4];	/* Number of relocs for this section.  */
142  unsigned char flags[4];	/* Section flags/attributes.  */
143  unsigned char reserved1[4];
144  unsigned char reserved2[4];
145  unsigned char reserved3[4];
146};
147typedef struct mach_o_section_64 mach_o_section_64;
148
149/* Flags for Mach-O sections.  LTO sections are marked with S_ATTR_DEBUG
150   to instruct the linker to ignore the sections.  */
151#define MACH_O_S_ATTR_DEBUG			0x02000000
152
153/* In-memory file structures.  */
154
155/* Section data in output files is made of these.  */
156struct lto_mach_o_data_d
157{
158  /* Pointer to data block.  */
159  void *d_buf;
160
161  /* Size of data block.  */
162  ssize_t d_size;
163
164  /* Next data block for this section.  */
165  struct lto_mach_o_data_d *next;
166};
167typedef struct lto_mach_o_data_d *lto_mach_o_data;
168
169/* This struct tracks the data for a section.  */
170struct lto_mach_o_section_d
171{
172  /* Singly-linked list of section's data blocks.  */
173  lto_mach_o_data data_chain;
174
175  /* Offset in string table of the section name.  */
176  size_t strtab_offs;
177
178  /* Section name.  */
179  const char *name;
180
181  /* Number of trailing padding bytes needed.  */
182  ssize_t pad_needed;
183
184  /* Raw section header data.  */
185  size_t section_size;
186  union {
187    struct {
188      char sectname[16];
189      char segname[16];
190    } section;
191    mach_o_section_32 section_32;
192    mach_o_section_64 section_64;
193  } u;
194
195  /* Next section for this file.  */
196  struct lto_mach_o_section_d *next;
197};
198typedef struct lto_mach_o_section_d *lto_mach_o_section;
199DEF_VEC_P (lto_mach_o_section);
200DEF_VEC_ALLOC_P (lto_mach_o_section, heap);
201
202/* A Mach-O file.  */
203struct lto_mach_o_file_d
204{
205  /* The base information.  */
206  lto_file base;
207
208  /* Common file members:  */
209
210  /* The system file descriptor for the file.  */
211  int fd;
212
213  /* The file's overall header.  */
214  union {
215    /* We make use here of the fact that section_32 and section_64
216       have the same layout (except for section_64.reserved3).  We
217       read the struct of proper size, but only address the first
218       member of this union.  */
219    mach_o_header_64 header;
220    mach_o_header_32 header_32;
221    mach_o_header_64 header_64;
222  } u;
223
224  /* All sections in a varray.  */
225  VEC(lto_mach_o_section, heap) *section_vec;
226
227  /* Readable file members:  */
228
229  /* File total size.  */
230  off_t file_size;
231
232  /* True if this file is open for writing.  */
233  bool writable;
234
235  /* Section containing the __section_names section.  */
236  lto_mach_o_section section_names_section;
237
238  /* Writable file members:  */
239
240  /* The currently active section.  */
241  lto_mach_o_section scn;
242
243  /* Linked list of data which must be freed *after* the file has been
244     closed.  This is an annoying limitation of libelf.  Which has been
245     faithfully reproduced here.  */
246  struct lto_char_ptr_base *data;
247};
248typedef struct lto_mach_o_file_d lto_mach_o_file;
249
250#endif /* LTO_MACH_O_H */
251
252