]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/binutils/include/coff/rs6000.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / binutils / include / coff / rs6000.h
1 /* IBM RS/6000 "XCOFF" file definitions for BFD.
2    Copyright (C) 1990, 1991, 2001 Free Software Foundation, Inc.
3    Written by Mimi Phuong-Thao Vo of IBM
4    and John Gilmore of Cygnus Support.  */
5
6 /********************** FILE HEADER **********************/
7
8 struct external_filehdr {
9         char f_magic[2];        /* magic number                 */
10         char f_nscns[2];        /* number of sections           */
11         char f_timdat[4];       /* time & date stamp            */
12         char f_symptr[4];       /* file pointer to symtab       */
13         char f_nsyms[4];        /* number of symtab entries     */
14         char f_opthdr[2];       /* sizeof(optional hdr)         */
15         char f_flags[2];        /* flags                        */
16 };
17
18         /* IBM RS/6000 */
19 #define U802WRMAGIC     0730    /* writeable text segments **chh**      */
20 #define U802ROMAGIC     0735    /* readonly sharable text segments      */
21 #define U802TOCMAGIC    0737    /* readonly text segments and TOC       */
22
23 #define BADMAG(x)       \
24         ((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \
25          (x).f_magic != U802TOCMAGIC)
26
27 #define FILHDR  struct external_filehdr
28 #define FILHSZ  20
29
30
31 /********************** AOUT "OPTIONAL HEADER" **********************/
32
33
34 typedef struct 
35 {
36   unsigned char magic[2];       /* type of file                 */
37   unsigned char vstamp[2];      /* version stamp                */
38   unsigned char tsize[4];       /* text size in bytes, padded to FW bdry */
39   unsigned char dsize[4];       /* initialized data "  "        */
40   unsigned char bsize[4];       /* uninitialized data "   "     */
41   unsigned char entry[4];       /* entry pt.                    */
42   unsigned char text_start[4];  /* base of text used for this file */
43   unsigned char data_start[4];  /* base of data used for this file */
44   unsigned char o_toc[4];       /* address of TOC */
45   unsigned char o_snentry[2];   /* section number of entry point */
46   unsigned char o_sntext[2];    /* section number of .text section */
47   unsigned char o_sndata[2];    /* section number of .data section */
48   unsigned char o_sntoc[2];     /* section number of TOC */
49   unsigned char o_snloader[2];  /* section number of .loader section */
50   unsigned char o_snbss[2];     /* section number of .bss section */
51   unsigned char o_algntext[2];  /* .text alignment */
52   unsigned char o_algndata[2];  /* .data alignment */
53   unsigned char o_modtype[2];   /* module type (??) */
54   unsigned char o_cputype[2];   /* cpu type */
55   unsigned char o_maxstack[4];  /* max stack size (??) */
56   unsigned char o_maxdata[4];   /* max data size (??) */
57   unsigned char o_resv2[12];    /* reserved */
58 }
59 AOUTHDR;
60
61 #define AOUTSZ 72
62 #define SMALL_AOUTSZ (28)
63 #define AOUTHDRSZ 72
64
65 /********************** SECTION HEADER **********************/
66
67
68 struct external_scnhdr {
69         char            s_name[8];      /* section name                 */
70         char            s_paddr[4];     /* physical address, aliased s_nlib */
71         char            s_vaddr[4];     /* virtual address              */
72         char            s_size[4];      /* section size                 */
73         char            s_scnptr[4];    /* file ptr to raw data for section */
74         char            s_relptr[4];    /* file ptr to relocation       */
75         char            s_lnnoptr[4];   /* file ptr to line numbers     */
76         char            s_nreloc[2];    /* number of relocation entries */
77         char            s_nlnno[2];     /* number of line number entries*/
78         char            s_flags[4];     /* flags                        */
79 };
80
81 #define SCNHDR  struct external_scnhdr
82 #define SCNHSZ  40
83
84 /********************** LINE NUMBERS **********************/
85
86 /* 1 line number entry for every "breakpointable" source line in a section.
87  * Line numbers are grouped on a per function basis; first entry in a function
88  * grouping will have l_lnno = 0 and in place of physical address will be the
89  * symbol table index of the function name.
90  */
91 struct external_lineno {
92         union {
93                 char l_symndx[4];       /* function name symbol index, iff l_lnno == 0*/
94                 char l_paddr[4];        /* (physical) address of line number    */
95         } l_addr;
96         char l_lnno[2]; /* line number          */
97 };
98
99
100 #define LINENO  struct external_lineno
101 #define LINESZ  6
102
103
104 /********************** SYMBOLS **********************/
105
106 #define E_SYMNMLEN      8       /* # characters in a symbol name        */
107 #define E_FILNMLEN      14      /* # characters in a file name          */
108 #define E_DIMNUM        4       /* # array dimensions in auxiliary entry */
109
110 struct external_syment 
111 {
112   union {
113     char e_name[E_SYMNMLEN];
114     struct {
115       char e_zeroes[4];
116       char e_offset[4];
117     } e;
118   } e;
119   char e_value[4];
120   char e_scnum[2];
121   char e_type[2];
122   char e_sclass[1];
123   char e_numaux[1];
124 };
125
126
127
128 #define N_BTMASK        (017)
129 #define N_TMASK         (060)
130 #define N_BTSHFT        (4)
131 #define N_TSHIFT        (2)
132   
133
134 union external_auxent {
135         struct {
136                 char x_tagndx[4];       /* str, un, or enum tag indx */
137                 union {
138                         struct {
139                             char  x_lnno[2]; /* declaration line number */
140                             char  x_size[2]; /* str/union/array size */
141                         } x_lnsz;
142                         char x_fsize[4];        /* size of function */
143                 } x_misc;
144                 union {
145                         struct {                /* if ISFCN, tag, or .bb */
146                             char x_lnnoptr[4];  /* ptr to fcn line # */
147                             char x_endndx[4];   /* entry ndx past block end */
148                         } x_fcn;
149                         struct {                /* if ISARY, up to 4 dimen. */
150                             char x_dimen[E_DIMNUM][2];
151                         } x_ary;
152                 } x_fcnary;
153                 char x_tvndx[2];                /* tv index */
154         } x_sym;
155
156         union {
157                 char x_fname[E_FILNMLEN];
158                 struct {
159                         char x_zeroes[4];
160                         char x_offset[4];
161                 } x_n;
162         } x_file;
163
164         struct {
165                 char x_scnlen[4];                       /* section length */
166                 char x_nreloc[2];       /* # relocation entries */
167                 char x_nlinno[2];       /* # line numbers */
168         } x_scn;
169
170         struct {
171                 char x_tvfill[4];       /* tv fill value */
172                 char x_tvlen[2];        /* length of .tv */
173                 char x_tvran[2][2];     /* tv range */
174         } x_tv;         /* info about .tv section (in auxent of symbol .tv)) */
175
176         struct {
177                 unsigned char x_scnlen[4];
178                 unsigned char x_parmhash[4];
179                 unsigned char x_snhash[2];
180                 unsigned char x_smtyp[1];
181                 unsigned char x_smclas[1];
182                 unsigned char x_stab[4];
183                 unsigned char x_snstab[2];
184         } x_csect;
185
186 };
187
188 #define SYMENT  struct external_syment
189 #define SYMESZ  18      
190 #define AUXENT  union external_auxent
191 #define AUXESZ  18
192 #define DBXMASK 0x80            /* for dbx storage mask */
193 #define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)
194
195
196
197 /********************** RELOCATION DIRECTIVES **********************/
198
199
200 struct external_reloc {
201   char r_vaddr[4];
202   char r_symndx[4];
203   char r_size[1];
204   char r_type[1];
205 };
206
207
208 #define RELOC struct external_reloc
209 #define RELSZ 10
210
211 #define DEFAULT_DATA_SECTION_ALIGNMENT 4
212 #define DEFAULT_BSS_SECTION_ALIGNMENT 4
213 #define DEFAULT_TEXT_SECTION_ALIGNMENT 4
214 /* For new sections we havn't heard of before */
215 #define DEFAULT_SECTION_ALIGNMENT 4
216
217 /* The ldhdr structure.  This appears at the start of the .loader
218    section.  */
219
220 struct external_ldhdr
221 {
222   bfd_byte l_version[4];
223   bfd_byte l_nsyms[4];
224   bfd_byte l_nreloc[4];
225   bfd_byte l_istlen[4];
226   bfd_byte l_nimpid[4];
227   bfd_byte l_impoff[4];
228   bfd_byte l_stlen[4];
229   bfd_byte l_stoff[4];
230 };
231
232 #define LDHDRSZ (8 * 4)
233
234 struct external_ldsym
235 {
236   union
237     {
238       bfd_byte _l_name[SYMNMLEN];
239       struct
240         {
241           bfd_byte _l_zeroes[4];
242           bfd_byte _l_offset[4];
243         } _l_l;
244     } _l;
245   bfd_byte l_value[4];
246   bfd_byte l_scnum[2];
247   bfd_byte l_smtype[1];
248   bfd_byte l_smclas[1];
249   bfd_byte l_ifile[4];
250   bfd_byte l_parm[4];
251 };
252
253 #define LDSYMSZ (8 + 3 * 4 + 2 + 2)
254
255 struct external_ldrel
256 {
257   bfd_byte l_vaddr[4];
258   bfd_byte l_symndx[4];
259   bfd_byte l_rtype[2];
260   bfd_byte l_rsecnm[2];
261 };
262
263 #define LDRELSZ (2 * 4 + 2 * 2)