This commit was generated by cvs2svn to track changes on a CVS vendor
[external/binutils.git] / include / coff / sh.h
1 /*** coff information for Hitachi SH */
2
3 /********************** FILE HEADER **********************/
4
5 struct external_filehdr {
6         char f_magic[2];        /* magic number                 */
7         char f_nscns[2];        /* number of sections           */
8         char f_timdat[4];       /* time & date stamp            */
9         char f_symptr[4];       /* file pointer to symtab       */
10         char f_nsyms[4];        /* number of symtab entries     */
11         char f_opthdr[2];       /* sizeof(optional hdr)         */
12         char f_flags[2];        /* flags                        */
13 };
14
15
16
17 #define SH_ARCH_MAGIC_BIG       0x0500
18 #define SH_ARCH_MAGIC_LITTLE    0x0550  /* Little endian SH */
19
20
21 #define SHBADMAG(x) \
22  (((x).f_magic!=SH_ARCH_MAGIC_BIG) && \
23   ((x).f_magic!=SH_ARCH_MAGIC_LITTLE))
24
25 #define FILHDR  struct external_filehdr
26 #define FILHSZ  20
27
28
29 /********************** AOUT "OPTIONAL HEADER" **********************/
30
31
32 typedef struct 
33 {
34   char  magic[2];               /* type of file                         */
35   char  vstamp[2];              /* version stamp                        */
36   char  tsize[4];               /* text size in bytes, padded to FW bdry*/
37   char  dsize[4];               /* initialized data "  "                */
38   char  bsize[4];               /* uninitialized data "   "             */
39   char  entry[4];               /* entry pt.                            */
40   char  text_start[4];          /* base of text used for this file */
41   char  data_start[4];          /* base of data used for this file */
42 }
43 AOUTHDR;
44
45
46 #define AOUTHDRSZ 28
47 #define AOUTSZ 28
48
49
50
51
52 /********************** SECTION HEADER **********************/
53
54
55 struct external_scnhdr {
56         char            s_name[8];      /* section name                 */
57         char            s_paddr[4];     /* physical address, aliased s_nlib */
58         char            s_vaddr[4];     /* virtual address              */
59         char            s_size[4];      /* section size                 */
60         char            s_scnptr[4];    /* file ptr to raw data for section */
61         char            s_relptr[4];    /* file ptr to relocation       */
62         char            s_lnnoptr[4];   /* file ptr to line numbers     */
63         char            s_nreloc[2];    /* number of relocation entries */
64         char            s_nlnno[2];     /* number of line number entries*/
65         char            s_flags[4];     /* flags                        */
66 };
67
68 /*
69  * names of "special" sections
70  */
71 #define _TEXT   ".text"
72 #define _DATA   ".data"
73 #define _BSS    ".bss"
74
75
76 #define SCNHDR  struct external_scnhdr
77 #define SCNHSZ  40
78
79
80 /********************** LINE NUMBERS **********************/
81
82 /* 1 line number entry for every "breakpointable" source line in a section.
83  * Line numbers are grouped on a per function basis; first entry in a function
84  * grouping will have l_lnno = 0 and in place of physical address will be the
85  * symbol table index of the function name.
86  */
87 struct external_lineno {
88         union {
89                 char l_symndx[4];       /* function name symbol index, iff l_lnno == 0*/
90                 char l_paddr[4];        /* (physical) address of line number    */
91         } l_addr;
92         char l_lnno[4]; /* line number          */
93 };
94
95 #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) (ext->l_lnno));
96 #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_32(abfd,val,  (bfd_byte *) (ext->l_lnno));
97
98 #define LINENO  struct external_lineno
99 #define LINESZ  8
100
101
102 /********************** SYMBOLS **********************/
103
104 #define E_SYMNMLEN      8       /* # characters in a symbol name        */
105 #define E_FILNMLEN      14      /* # characters in a file name          */
106 #define E_DIMNUM        4       /* # array dimensions in auxiliary entry */
107
108 struct external_syment 
109 {
110   union {
111     char e_name[E_SYMNMLEN];
112     struct {
113       char e_zeroes[4];
114       char e_offset[4];
115     } e;
116   } e;
117   char e_value[4];
118   char e_scnum[2];
119   char e_type[2];
120   char e_sclass[1];
121   char e_numaux[1];
122 };
123
124
125
126 #define N_BTMASK        (017)
127 #define N_TMASK         (060)
128 #define N_BTSHFT        (4)
129 #define N_TSHIFT        (2)
130   
131
132 union external_auxent {
133         struct {
134                 char x_tagndx[4];       /* str, un, or enum tag indx */
135                 union {
136                         struct {
137                             char  x_lnno[2]; /* declaration line number */
138                             char  x_size[2]; /* str/union/array size */
139                         } x_lnsz;
140                         char x_fsize[4];        /* size of function */
141                 } x_misc;
142                 union {
143                         struct {                /* if ISFCN, tag, or .bb */
144                             char x_lnnoptr[4];  /* ptr to fcn line # */
145                             char x_endndx[4];   /* entry ndx past block end */
146                         } x_fcn;
147                         struct {                /* if ISARY, up to 4 dimen. */
148                             char x_dimen[E_DIMNUM][2];
149                         } x_ary;
150                 } x_fcnary;
151                 char x_tvndx[2];                /* tv index */
152         } x_sym;
153
154         union {
155                 char x_fname[E_FILNMLEN];
156                 struct {
157                         char x_zeroes[4];
158                         char x_offset[4];
159                 } x_n;
160         } x_file;
161
162         struct {
163                 char x_scnlen[4];                       /* section length */
164                 char x_nreloc[2];       /* # relocation entries */
165                 char x_nlinno[2];       /* # line numbers */
166         } x_scn;
167
168         struct {
169                 char x_tvfill[4];       /* tv fill value */
170                 char x_tvlen[2];        /* length of .tv */
171                 char x_tvran[2][2];     /* tv range */
172         } x_tv;         /* info about .tv section (in auxent of symbol .tv)) */
173
174
175 };
176
177 #define SYMENT  struct external_syment
178 #define SYMESZ  18      
179 #define AUXENT  union external_auxent
180 #define AUXESZ  18
181
182
183
184 /********************** RELOCATION DIRECTIVES **********************/
185
186 /* The external reloc has an offset field, because some of the reloc
187    types on the h8 don't have room in the instruction for the entire
188    offset - eg the strange jump and high page addressing modes */
189
190 struct external_reloc {
191   char r_vaddr[4];
192   char r_symndx[4];
193   char r_offset[4];
194   char r_type[2];
195   char r_stuff[2];
196 };
197
198
199 #define RELOC struct external_reloc
200 #define RELSZ 16
201
202 /* SH relocation types.  Not all of these are actually used.  */
203
204 #define R_SH_UNUSED     0               /* only used internally */
205 #define R_SH_PCREL8     3               /*  8 bit pcrel         */
206 #define R_SH_PCREL16    4               /* 16 bit pcrel         */
207 #define R_SH_HIGH8      5               /* high 8 bits of 24 bit address */
208 #define R_SH_LOW16      7               /* low 16 bits of 24 bit immediate */
209 #define R_SH_IMM24      6               /* 24 bit immediate */
210 #define R_SH_PCDISP8BY4 9               /* PC rel 8 bits *4 +ve */
211 #define R_SH_PCDISP8BY2 10              /* PC rel 8 bits *2 +ve */
212 #define R_SH_PCDISP8    11              /* 8 bit branch */
213 #define R_SH_PCDISP     12              /* 12 bit branch */
214 #define R_SH_IMM32      14              /* 32 bit immediate */
215 #define R_SH_IMM8       16              /* 8 bit immediate */
216 #define R_SH_IMM8BY2    17              /* 8 bit immediate *2 */
217 #define R_SH_IMM8BY4    18              /* 8 bit immediate *4 */
218 #define R_SH_IMM4       19              /* 4 bit immediate */
219 #define R_SH_IMM4BY2    20              /* 4 bit immediate *2 */
220 #define R_SH_IMM4BY4    21              /* 4 bit immediate *4 */
221 #define R_SH_PCRELIMM8BY2   22          /* PC rel 8 bits *2 unsigned */
222 #define R_SH_PCRELIMM8BY4   23          /* PC rel 8 bits *4 unsigned */
223 #define R_SH_IMM16      24              /* 16 bit immediate */
224
225 /* The switch table reloc types are used for relaxing.  They are
226    generated for expressions such as
227      .word L1 - L2
228    The r_offset field holds the difference between the reloc address
229    and L2.  */
230 #define R_SH_SWITCH16   25              /* 16 bit switch table entry */
231 #define R_SH_SWITCH32   26              /* 32 bit switch table entry */
232
233 /* The USES reloc type is used for relaxing.  The compiler will
234    generate .uses pseudo-ops when it finds a function call which it
235    can relax.  The r_offset field of the USES reloc holds the PC
236    relative offset to the instruction which loads the register used in
237    the function call.  */
238 #define R_SH_USES       27              /* .uses pseudo-op */
239
240 /* The COUNT reloc type is used for relaxing.  The assembler will
241    generate COUNT relocs for addresses referred to by the register
242    loads associated with USES relocs.  The r_offset field of the COUNT
243    reloc holds the number of times the address is references in the
244    object file.  */
245 #define R_SH_COUNT      28              /* Count of constant pool uses */
246
247 /* The ALIGN reloc type is used for relaxing.  The r_offset field is
248    the power of two to which subsequent portions of the object file
249    must be aligned.  */
250 #define R_SH_ALIGN      29              /* .align pseudo-op */
251
252 /* The CODE and DATA reloc types are used for aligning load and store
253    instructions.  The assembler will generate a CODE reloc before a
254    block of instructions.  It will generate a DATA reloc before data.
255    A section should be processed assuming it contains data, unless a
256    CODE reloc is seen.  The only relevant pieces of information in the
257    CODE and DATA relocs are the section and the address.  The symbol
258    and offset are meaningless.  */
259 #define R_SH_CODE       30              /* start of code */
260 #define R_SH_DATA       31              /* start of data */
261
262 /* The LABEL reloc type is used for aligning load and store
263    instructions.  The assembler will generate a LABEL reloc for each
264    label within a block of instructions.  This permits the linker to
265    avoid swapping instructions which are the targets of branches.  */
266 #define R_SH_LABEL      32              /* label */