OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [lto/] [lto-macho.h] - Blame information for rev 318

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 288 jeremybenn
/* 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
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.