comparison gcc/lto/lto-macho.h @ 63:b7f97abdc517 gcc-4.6-20100522

update gcc from gcc-4.5.0 to gcc-4.6
author ryoma <e075725@ie.u-ryukyu.ac.jp>
date Mon, 24 May 2010 12:47:05 +0900
parents
children
comparison
equal deleted inserted replaced
56:3c8a44c06a95 63:b7f97abdc517
1 /* LTO routines for Mach-O object files.
2 Copyright 2010 Free Software Foundation, Inc.
3 Contributed by Steven Bosscher.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along 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). */
27 struct 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 };
37 typedef struct mach_o_header_32 mach_o_header_32;
38
39 /* Mach-O header (64 bits version). */
40 struct 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 };
51 typedef 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. */
69 struct 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 };
74 typedef 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. */
81 struct 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 };
95 typedef struct mach_o_segment_command_32 mach_o_segment_command_32;
96
97 /* LC_SEGMENT_64 load command. Only nsects matters for us, really. */
98 struct 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 };
112 typedef struct mach_o_segment_command_64 mach_o_segment_command_64;
113
114 /* A Mach-O 32-bits section. */
115 struct 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 };
129 typedef struct mach_o_section_32 mach_o_section_32;
130
131 /* A Mach-O 64-bits section. */
132 struct 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 };
147 typedef 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. */
156 struct 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 };
167 typedef struct lto_mach_o_data_d *lto_mach_o_data;
168
169 /* This struct tracks the data for a section. */
170 struct 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 };
198 typedef struct lto_mach_o_section_d *lto_mach_o_section;
199 DEF_VEC_P (lto_mach_o_section);
200 DEF_VEC_ALLOC_P (lto_mach_o_section, heap);
201
202 /* A Mach-O file. */
203 struct 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 };
248 typedef struct lto_mach_o_file_d lto_mach_o_file;
249
250 #endif /* LTO_MACH_O_H */
251