2001-02-17 Philip Blundell <philb@gnu.org>
[binutils.git] / bfd / coffswap.h
blob2f89afbff2d08a2d6b331bcd676821b69de13a06
1 /* Generic COFF swapping routines, for BFD.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
4 Written by Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 /* This file contains routines used to swap COFF data. It is a header
23 file because the details of swapping depend on the details of the
24 structures used by each COFF implementation. This is included by
25 coffcode.h, as well as by the ECOFF backend.
27 Any file which uses this must first include "coff/internal.h" and
28 "coff/CPU.h". The functions will then be correct for that CPU. */
30 #define PUTWORD bfd_h_put_32
31 #define PUTHALF bfd_h_put_16
32 #define PUTBYTE bfd_h_put_8
34 #ifndef GET_FCN_LNNOPTR
35 #define GET_FCN_LNNOPTR(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
36 #endif
38 #ifndef GET_FCN_ENDNDX
39 #define GET_FCN_ENDNDX(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
40 #endif
42 #ifndef PUT_FCN_LNNOPTR
43 #define PUT_FCN_LNNOPTR(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
44 #endif
45 #ifndef PUT_FCN_ENDNDX
46 #define PUT_FCN_ENDNDX(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
47 #endif
48 #ifndef GET_LNSZ_LNNO
49 #define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno)
50 #endif
51 #ifndef GET_LNSZ_SIZE
52 #define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size)
53 #endif
54 #ifndef PUT_LNSZ_LNNO
55 #define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno)
56 #endif
57 #ifndef PUT_LNSZ_SIZE
58 #define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size)
59 #endif
60 #ifndef GET_SCN_SCNLEN
61 #define GET_SCN_SCNLEN(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen)
62 #endif
63 #ifndef GET_SCN_NRELOC
64 #define GET_SCN_NRELOC(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc)
65 #endif
66 #ifndef GET_SCN_NLINNO
67 #define GET_SCN_NLINNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno)
68 #endif
69 #ifndef PUT_SCN_SCNLEN
70 #define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen)
71 #endif
72 #ifndef PUT_SCN_NRELOC
73 #define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc)
74 #endif
75 #ifndef PUT_SCN_NLINNO
76 #define PUT_SCN_NLINNO(abfd,in, ext) bfd_h_put_16(abfd,in, (bfd_byte *) ext->x_scn.x_nlinno)
77 #endif
78 #ifndef GET_LINENO_LNNO
79 #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno));
80 #endif
81 #ifndef PUT_LINENO_LNNO
82 #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val, (bfd_byte *) (ext->l_lnno));
83 #endif
85 /* The f_symptr field in the filehdr is sometimes 64 bits. */
86 #ifndef GET_FILEHDR_SYMPTR
87 #define GET_FILEHDR_SYMPTR bfd_h_get_32
88 #endif
89 #ifndef PUT_FILEHDR_SYMPTR
90 #define PUT_FILEHDR_SYMPTR bfd_h_put_32
91 #endif
93 /* Some fields in the aouthdr are sometimes 64 bits. */
94 #ifndef GET_AOUTHDR_TSIZE
95 #define GET_AOUTHDR_TSIZE bfd_h_get_32
96 #endif
97 #ifndef PUT_AOUTHDR_TSIZE
98 #define PUT_AOUTHDR_TSIZE bfd_h_put_32
99 #endif
100 #ifndef GET_AOUTHDR_DSIZE
101 #define GET_AOUTHDR_DSIZE bfd_h_get_32
102 #endif
103 #ifndef PUT_AOUTHDR_DSIZE
104 #define PUT_AOUTHDR_DSIZE bfd_h_put_32
105 #endif
106 #ifndef GET_AOUTHDR_BSIZE
107 #define GET_AOUTHDR_BSIZE bfd_h_get_32
108 #endif
109 #ifndef PUT_AOUTHDR_BSIZE
110 #define PUT_AOUTHDR_BSIZE bfd_h_put_32
111 #endif
112 #ifndef GET_AOUTHDR_ENTRY
113 #define GET_AOUTHDR_ENTRY bfd_h_get_32
114 #endif
115 #ifndef PUT_AOUTHDR_ENTRY
116 #define PUT_AOUTHDR_ENTRY bfd_h_put_32
117 #endif
118 #ifndef GET_AOUTHDR_TEXT_START
119 #define GET_AOUTHDR_TEXT_START bfd_h_get_32
120 #endif
121 #ifndef PUT_AOUTHDR_TEXT_START
122 #define PUT_AOUTHDR_TEXT_START bfd_h_put_32
123 #endif
124 #ifndef GET_AOUTHDR_DATA_START
125 #define GET_AOUTHDR_DATA_START bfd_h_get_32
126 #endif
127 #ifndef PUT_AOUTHDR_DATA_START
128 #define PUT_AOUTHDR_DATA_START bfd_h_put_32
129 #endif
131 /* Some fields in the scnhdr are sometimes 64 bits. */
132 #ifndef GET_SCNHDR_PADDR
133 #define GET_SCNHDR_PADDR bfd_h_get_32
134 #endif
135 #ifndef PUT_SCNHDR_PADDR
136 #define PUT_SCNHDR_PADDR bfd_h_put_32
137 #endif
138 #ifndef GET_SCNHDR_VADDR
139 #define GET_SCNHDR_VADDR bfd_h_get_32
140 #endif
141 #ifndef PUT_SCNHDR_VADDR
142 #define PUT_SCNHDR_VADDR bfd_h_put_32
143 #endif
144 #ifndef GET_SCNHDR_SIZE
145 #define GET_SCNHDR_SIZE bfd_h_get_32
146 #endif
147 #ifndef PUT_SCNHDR_SIZE
148 #define PUT_SCNHDR_SIZE bfd_h_put_32
149 #endif
150 #ifndef GET_SCNHDR_SCNPTR
151 #define GET_SCNHDR_SCNPTR bfd_h_get_32
152 #endif
153 #ifndef PUT_SCNHDR_SCNPTR
154 #define PUT_SCNHDR_SCNPTR bfd_h_put_32
155 #endif
156 #ifndef GET_SCNHDR_RELPTR
157 #define GET_SCNHDR_RELPTR bfd_h_get_32
158 #endif
159 #ifndef PUT_SCNHDR_RELPTR
160 #define PUT_SCNHDR_RELPTR bfd_h_put_32
161 #endif
162 #ifndef GET_SCNHDR_LNNOPTR
163 #define GET_SCNHDR_LNNOPTR bfd_h_get_32
164 #endif
165 #ifndef PUT_SCNHDR_LNNOPTR
166 #define PUT_SCNHDR_LNNOPTR bfd_h_put_32
167 #endif
168 #ifndef GET_SCNHDR_NRELOC
169 #define GET_SCNHDR_NRELOC bfd_h_get_16
170 #endif
171 #ifndef MAX_SCNHDR_NRELOC
172 #define MAX_SCNHDR_NRELOC 0xffff
173 #endif
174 #ifndef PUT_SCNHDR_NRELOC
175 #define PUT_SCNHDR_NRELOC bfd_h_put_16
176 #endif
177 #ifndef GET_SCNHDR_NLNNO
178 #define GET_SCNHDR_NLNNO bfd_h_get_16
179 #endif
180 #ifndef MAX_SCNHDR_NLNNO
181 #define MAX_SCNHDR_NLNNO 0xffff
182 #endif
183 #ifndef PUT_SCNHDR_NLNNO
184 #define PUT_SCNHDR_NLNNO bfd_h_put_16
185 #endif
186 #ifndef GET_SCNHDR_FLAGS
187 #define GET_SCNHDR_FLAGS bfd_h_get_32
188 #endif
189 #ifndef PUT_SCNHDR_FLAGS
190 #define PUT_SCNHDR_FLAGS bfd_h_put_32
191 #endif
193 #ifndef GET_RELOC_VADDR
194 #define GET_RELOC_VADDR bfd_h_get_32
195 #endif
196 #ifndef PUT_RELOC_VADDR
197 #define PUT_RELOC_VADDR bfd_h_put_32
198 #endif
200 static void coff_swap_aouthdr_in PARAMS ((bfd *, PTR, PTR));
201 static unsigned int coff_swap_aouthdr_out PARAMS ((bfd *, PTR, PTR));
202 static void coff_swap_scnhdr_in PARAMS ((bfd *, PTR, PTR));
203 static unsigned int coff_swap_scnhdr_out PARAMS ((bfd *, PTR, PTR));
204 static void coff_swap_filehdr_in PARAMS ((bfd *, PTR, PTR));
205 static unsigned int coff_swap_filehdr_out PARAMS ((bfd *, PTR, PTR));
206 #ifndef NO_COFF_RELOCS
207 static void coff_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
208 static unsigned int coff_swap_reloc_out PARAMS ((bfd *, PTR, PTR));
209 #endif /* NO_COFF_RELOCS */
210 #ifndef NO_COFF_SYMBOLS
211 static void coff_swap_sym_in PARAMS ((bfd *, PTR, PTR));
212 static unsigned int coff_swap_sym_out PARAMS ((bfd *, PTR, PTR));
213 static void coff_swap_aux_in PARAMS ((bfd *, PTR, int, int, int, int, PTR));
214 static unsigned int coff_swap_aux_out PARAMS ((bfd *, PTR, int, int, int, int, PTR));
215 #endif /* NO_COFF_SYMBOLS */
216 #ifndef NO_COFF_LINENOS
217 static void coff_swap_lineno_in PARAMS ((bfd *, PTR, PTR));
218 static unsigned int coff_swap_lineno_out PARAMS ((bfd *, PTR, PTR));
219 #endif /* NO_COFF_LINENOS */
221 #ifndef NO_COFF_RELOCS
223 static void
224 coff_swap_reloc_in (abfd, src, dst)
225 bfd *abfd;
226 PTR src;
227 PTR dst;
229 RELOC *reloc_src = (RELOC *) src;
230 struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
232 reloc_dst->r_vaddr = GET_RELOC_VADDR (abfd, (bfd_byte *)reloc_src->r_vaddr);
233 reloc_dst->r_symndx = bfd_h_get_signed_32(abfd, (bfd_byte *) reloc_src->r_symndx);
235 #ifdef RS6000COFF_C
236 reloc_dst->r_type = bfd_h_get_8(abfd, reloc_src->r_type);
237 reloc_dst->r_size = bfd_h_get_8(abfd, reloc_src->r_size);
238 #else
239 reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type);
240 #endif
242 #ifdef SWAP_IN_RELOC_OFFSET
243 reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET(abfd,
244 (bfd_byte *) reloc_src->r_offset);
245 #endif
248 static unsigned int
249 coff_swap_reloc_out (abfd, src, dst)
250 bfd *abfd;
251 PTR src;
252 PTR dst;
254 struct internal_reloc *reloc_src = (struct internal_reloc *)src;
255 struct external_reloc *reloc_dst = (struct external_reloc *)dst;
256 PUT_RELOC_VADDR (abfd, reloc_src->r_vaddr, (bfd_byte *) reloc_dst->r_vaddr);
257 bfd_h_put_32(abfd, reloc_src->r_symndx, (bfd_byte *) reloc_dst->r_symndx);
259 #ifdef RS6000COFF_C
260 bfd_h_put_8 (abfd, reloc_src->r_type, (bfd_byte *) reloc_dst->r_type);
261 bfd_h_put_8 (abfd, reloc_src->r_size, (bfd_byte *) reloc_dst->r_size);
262 #else
263 bfd_h_put_16(abfd, reloc_src->r_type, (bfd_byte *)
264 reloc_dst->r_type);
265 #endif
267 #ifdef SWAP_OUT_RELOC_OFFSET
268 SWAP_OUT_RELOC_OFFSET(abfd,
269 reloc_src->r_offset,
270 (bfd_byte *) reloc_dst->r_offset);
271 #endif
272 #ifdef SWAP_OUT_RELOC_EXTRA
273 SWAP_OUT_RELOC_EXTRA(abfd,reloc_src, reloc_dst);
274 #endif
276 return bfd_coff_relsz (abfd);
279 #endif /* NO_COFF_RELOCS */
281 static void
282 coff_swap_filehdr_in (abfd, src, dst)
283 bfd *abfd;
284 PTR src;
285 PTR dst;
287 FILHDR *filehdr_src = (FILHDR *) src;
288 struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
289 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
290 COFF_ADJUST_FILEHDR_IN_PRE (abfd, src, dst);
291 #endif
292 filehdr_dst->f_magic = bfd_h_get_16(abfd, (bfd_byte *) filehdr_src->f_magic);
293 filehdr_dst->f_nscns = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_nscns);
294 filehdr_dst->f_timdat = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_timdat);
295 filehdr_dst->f_symptr =
296 GET_FILEHDR_SYMPTR (abfd, (bfd_byte *) filehdr_src->f_symptr);
297 filehdr_dst->f_nsyms = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_nsyms);
298 filehdr_dst->f_opthdr = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_opthdr);
299 filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags);
300 #ifdef TIC80_TARGET_ID
301 filehdr_dst->f_target_id = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_target_id);
302 #endif
304 #ifdef COFF_ADJUST_FILEHDR_IN_POST
305 COFF_ADJUST_FILEHDR_IN_POST (abfd, src, dst);
306 #endif
309 static unsigned int
310 coff_swap_filehdr_out (abfd, in, out)
311 bfd *abfd;
312 PTR in;
313 PTR out;
315 struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
316 FILHDR *filehdr_out = (FILHDR *)out;
318 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
319 COFF_ADJUST_FILEHDR_OUT_PRE (abfd, in, out);
320 #endif
321 bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
322 bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
323 bfd_h_put_32(abfd, filehdr_in->f_timdat, (bfd_byte *) filehdr_out->f_timdat);
324 PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr,
325 (bfd_byte *) filehdr_out->f_symptr);
326 bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
327 bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
328 bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
329 #ifdef TIC80_TARGET_ID
330 bfd_h_put_16(abfd, filehdr_in->f_target_id, (bfd_byte *) filehdr_out->f_target_id);
331 #endif
333 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
334 COFF_ADJUST_FILEHDR_OUT_POST (abfd, in, out);
335 #endif
336 return bfd_coff_filhsz (abfd);
339 #ifndef NO_COFF_SYMBOLS
341 static void
342 coff_swap_sym_in (abfd, ext1, in1)
343 bfd *abfd;
344 PTR ext1;
345 PTR in1;
347 SYMENT *ext = (SYMENT *)ext1;
348 struct internal_syment *in = (struct internal_syment *)in1;
350 if( ext->e.e_name[0] == 0) {
351 in->_n._n_n._n_zeroes = 0;
352 in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset);
354 else {
355 #if SYMNMLEN != E_SYMNMLEN
356 -> Error, we need to cope with truncating or extending SYMNMLEN!;
357 #else
358 memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
359 #endif
361 in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value);
362 in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
363 if (sizeof (ext->e_type) == 2){
364 in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type);
366 else {
367 in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type);
369 in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
370 in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux);
371 #ifdef COFF_ADJUST_SYM_IN_POST
372 COFF_ADJUST_SYM_IN_POST (abfd, ext1, in1);
373 #endif
376 static unsigned int
377 coff_swap_sym_out (abfd, inp, extp)
378 bfd *abfd;
379 PTR inp;
380 PTR extp;
382 struct internal_syment *in = (struct internal_syment *)inp;
383 SYMENT *ext =(SYMENT *)extp;
384 if(in->_n._n_name[0] == 0) {
385 bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes);
386 bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *) ext->e.e.e_offset);
388 else {
389 #if SYMNMLEN != E_SYMNMLEN
390 -> Error, we need to cope with truncating or extending SYMNMLEN!;
391 #else
392 memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
393 #endif
395 bfd_h_put_32(abfd, in->n_value , (bfd_byte *) ext->e_value);
396 bfd_h_put_16(abfd, in->n_scnum , (bfd_byte *) ext->e_scnum);
397 if (sizeof (ext->e_type) == 2)
399 bfd_h_put_16(abfd, in->n_type , (bfd_byte *) ext->e_type);
401 else
403 bfd_h_put_32(abfd, in->n_type , (bfd_byte *) ext->e_type);
405 bfd_h_put_8(abfd, in->n_sclass , ext->e_sclass);
406 bfd_h_put_8(abfd, in->n_numaux , ext->e_numaux);
407 #ifdef COFF_ADJUST_SYM_OUT_POST
408 COFF_ADJUST_SYM_OUT_POST (abfd, inp, extp);
409 #endif
410 return SYMESZ;
413 static void
414 coff_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1)
415 bfd *abfd;
416 PTR ext1;
417 int type;
418 int class;
419 int indx;
420 int numaux;
421 PTR in1;
423 AUXENT *ext = (AUXENT *)ext1;
424 union internal_auxent *in = (union internal_auxent *)in1;
426 #ifdef COFF_ADJUST_AUX_IN_PRE
427 COFF_ADJUST_AUX_IN_PRE (abfd, ext1, type, class, indx, numaux, in1);
428 #endif
429 switch (class) {
430 case C_FILE:
431 if (ext->x_file.x_fname[0] == 0) {
432 in->x_file.x_n.x_zeroes = 0;
433 in->x_file.x_n.x_offset =
434 bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset);
435 } else {
436 #if FILNMLEN != E_FILNMLEN
437 -> Error, we need to cope with truncating or extending FILNMLEN!;
438 #else
439 if (numaux > 1)
441 if (indx == 0)
442 memcpy (in->x_file.x_fname, ext->x_file.x_fname,
443 numaux * sizeof (AUXENT));
445 else
447 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
449 #endif
451 goto end;
453 case C_STAT:
454 #ifdef C_LEAFSTAT
455 case C_LEAFSTAT:
456 #endif
457 case C_HIDDEN:
458 if (type == T_NULL) {
459 in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext);
460 in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext);
461 in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext);
463 /* PE defines some extra fields; we zero them out for
464 safety. */
465 in->x_scn.x_checksum = 0;
466 in->x_scn.x_associated = 0;
467 in->x_scn.x_comdat = 0;
469 goto end;
471 break;
474 in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx);
475 #ifndef NO_TVNDX
476 in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx);
477 #endif
479 if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
481 in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
482 in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
484 else
486 #if DIMNUM != E_DIMNUM
487 #error we need to cope with truncating or extending DIMNUM
488 #endif
489 in->x_sym.x_fcnary.x_ary.x_dimen[0] =
490 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
491 in->x_sym.x_fcnary.x_ary.x_dimen[1] =
492 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
493 in->x_sym.x_fcnary.x_ary.x_dimen[2] =
494 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
495 in->x_sym.x_fcnary.x_ary.x_dimen[3] =
496 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
499 if (ISFCN(type)) {
500 in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
502 else {
503 in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext);
504 in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext);
507 end: ;
508 /* the semicolon is because MSVC doesn't like labels at
509 end of block. */
511 #ifdef COFF_ADJUST_AUX_IN_POST
512 COFF_ADJUST_AUX_IN_POST (abfd, ext1, type, class, indx, numaux, in1);
513 #endif
516 static unsigned int
517 coff_swap_aux_out (abfd, inp, type, class, indx, numaux, extp)
518 bfd *abfd;
519 PTR inp;
520 int type;
521 int class;
522 int indx ATTRIBUTE_UNUSED;
523 int numaux ATTRIBUTE_UNUSED;
524 PTR extp;
526 union internal_auxent *in = (union internal_auxent *)inp;
527 AUXENT *ext = (AUXENT *)extp;
529 #ifdef COFF_ADJUST_AUX_OUT_PRE
530 COFF_ADJUST_AUX_OUT_PRE (abfd, inp, type, class, indx, numaux, extp);
531 #endif
532 memset((PTR)ext, 0, AUXESZ);
533 switch (class) {
534 case C_FILE:
535 if (in->x_file.x_fname[0] == 0) {
536 PUTWORD(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
537 PUTWORD(abfd,
538 in->x_file.x_n.x_offset,
539 (bfd_byte *) ext->x_file.x_n.x_offset);
541 else {
542 #if FILNMLEN != E_FILNMLEN
543 -> Error, we need to cope with truncating or extending FILNMLEN!;
544 #else
545 memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
546 #endif
548 goto end;
550 case C_STAT:
551 #ifdef C_LEAFSTAT
552 case C_LEAFSTAT:
553 #endif
554 case C_HIDDEN:
555 if (type == T_NULL) {
556 PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext);
557 PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext);
558 PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext);
559 goto end;
561 break;
564 PUTWORD(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
565 #ifndef NO_TVNDX
566 bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
567 #endif
569 if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
571 PUT_FCN_LNNOPTR(abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
572 PUT_FCN_ENDNDX(abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
574 else
576 #if DIMNUM != E_DIMNUM
577 #error we need to cope with truncating or extending DIMNUM
578 #endif
579 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
580 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
581 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
582 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
583 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
584 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
585 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
586 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
589 if (ISFCN (type))
590 PUTWORD (abfd, in->x_sym.x_misc.x_fsize,
591 (bfd_byte *) ext->x_sym.x_misc.x_fsize);
592 else
594 PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
595 PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
598 end:
599 #ifdef COFF_ADJUST_AUX_OUT_POST
600 COFF_ADJUST_AUX_OUT_POST (abfd, inp, type, class, indx, numaux, extp);
601 #endif
602 return AUXESZ;
605 #endif /* NO_COFF_SYMBOLS */
607 #ifndef NO_COFF_LINENOS
609 static void
610 coff_swap_lineno_in (abfd, ext1, in1)
611 bfd *abfd;
612 PTR ext1;
613 PTR in1;
615 LINENO *ext = (LINENO *)ext1;
616 struct internal_lineno *in = (struct internal_lineno *)in1;
618 in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx);
619 in->l_lnno = GET_LINENO_LNNO(abfd, ext);
622 static unsigned int
623 coff_swap_lineno_out (abfd, inp, outp)
624 bfd *abfd;
625 PTR inp;
626 PTR outp;
628 struct internal_lineno *in = (struct internal_lineno *)inp;
629 struct external_lineno *ext = (struct external_lineno *)outp;
630 PUTWORD(abfd, in->l_addr.l_symndx, (bfd_byte *)
631 ext->l_addr.l_symndx);
633 PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
634 return LINESZ;
637 #endif /* NO_COFF_LINENOS */
639 static void
640 coff_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
641 bfd *abfd;
642 PTR aouthdr_ext1;
643 PTR aouthdr_int1;
645 AOUTHDR *aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
646 struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1;
648 aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic);
649 aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp);
650 aouthdr_int->tsize =
651 GET_AOUTHDR_TSIZE (abfd, (bfd_byte *) aouthdr_ext->tsize);
652 aouthdr_int->dsize =
653 GET_AOUTHDR_DSIZE (abfd, (bfd_byte *) aouthdr_ext->dsize);
654 aouthdr_int->bsize =
655 GET_AOUTHDR_BSIZE (abfd, (bfd_byte *) aouthdr_ext->bsize);
656 aouthdr_int->entry =
657 GET_AOUTHDR_ENTRY (abfd, (bfd_byte *) aouthdr_ext->entry);
658 aouthdr_int->text_start =
659 GET_AOUTHDR_TEXT_START (abfd, (bfd_byte *) aouthdr_ext->text_start);
660 aouthdr_int->data_start =
661 GET_AOUTHDR_DATA_START (abfd, (bfd_byte *) aouthdr_ext->data_start);
663 #ifdef I960
664 aouthdr_int->tagentries = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tagentries);
665 #endif
667 #ifdef APOLLO_M68
668 bfd_h_put_32(abfd, aouthdr_int->o_inlib, (bfd_byte *) aouthdr_ext->o_inlib);
669 bfd_h_put_32(abfd, aouthdr_int->o_sri, (bfd_byte *) aouthdr_ext->o_sri);
670 bfd_h_put_32(abfd, aouthdr_int->vid[0], (bfd_byte *) aouthdr_ext->vid);
671 bfd_h_put_32(abfd, aouthdr_int->vid[1], (bfd_byte *) aouthdr_ext->vid + 4);
672 #endif
674 #ifdef RS6000COFF_C
675 #ifdef XCOFF64
676 aouthdr_int->o_toc = bfd_h_get_64(abfd, aouthdr_ext->o_toc);
677 #else
678 aouthdr_int->o_toc = bfd_h_get_32(abfd, aouthdr_ext->o_toc);
679 #endif
680 aouthdr_int->o_snentry = bfd_h_get_16(abfd, aouthdr_ext->o_snentry);
681 aouthdr_int->o_sntext = bfd_h_get_16(abfd, aouthdr_ext->o_sntext);
682 aouthdr_int->o_sndata = bfd_h_get_16(abfd, aouthdr_ext->o_sndata);
683 aouthdr_int->o_sntoc = bfd_h_get_16(abfd, aouthdr_ext->o_sntoc);
684 aouthdr_int->o_snloader = bfd_h_get_16(abfd, aouthdr_ext->o_snloader);
685 aouthdr_int->o_snbss = bfd_h_get_16(abfd, aouthdr_ext->o_snbss);
686 aouthdr_int->o_algntext = bfd_h_get_16(abfd, aouthdr_ext->o_algntext);
687 aouthdr_int->o_algndata = bfd_h_get_16(abfd, aouthdr_ext->o_algndata);
688 aouthdr_int->o_modtype = bfd_h_get_16(abfd, aouthdr_ext->o_modtype);
689 aouthdr_int->o_cputype = bfd_h_get_16(abfd, aouthdr_ext->o_cputype);
690 #ifdef XCOFF64
691 aouthdr_int->o_maxstack = bfd_h_get_64(abfd, aouthdr_ext->o_maxstack);
692 aouthdr_int->o_maxdata = bfd_h_get_64(abfd, aouthdr_ext->o_maxdata);
693 #else
694 aouthdr_int->o_maxstack = bfd_h_get_32(abfd, aouthdr_ext->o_maxstack);
695 aouthdr_int->o_maxdata = bfd_h_get_32(abfd, aouthdr_ext->o_maxdata);
696 #endif
697 #endif
699 #ifdef MIPSECOFF
700 aouthdr_int->bss_start = bfd_h_get_32(abfd, aouthdr_ext->bss_start);
701 aouthdr_int->gp_value = bfd_h_get_32(abfd, aouthdr_ext->gp_value);
702 aouthdr_int->gprmask = bfd_h_get_32(abfd, aouthdr_ext->gprmask);
703 aouthdr_int->cprmask[0] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[0]);
704 aouthdr_int->cprmask[1] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[1]);
705 aouthdr_int->cprmask[2] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[2]);
706 aouthdr_int->cprmask[3] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[3]);
707 #endif
709 #ifdef ALPHAECOFF
710 aouthdr_int->bss_start = bfd_h_get_64(abfd, aouthdr_ext->bss_start);
711 aouthdr_int->gp_value = bfd_h_get_64(abfd, aouthdr_ext->gp_value);
712 aouthdr_int->gprmask = bfd_h_get_32(abfd, aouthdr_ext->gprmask);
713 aouthdr_int->fprmask = bfd_h_get_32(abfd, aouthdr_ext->fprmask);
714 #endif
717 static unsigned int
718 coff_swap_aouthdr_out (abfd, in, out)
719 bfd *abfd;
720 PTR in;
721 PTR out;
723 struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
724 AOUTHDR *aouthdr_out = (AOUTHDR *)out;
726 bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->magic);
727 bfd_h_put_16(abfd, aouthdr_in->vstamp, (bfd_byte *) aouthdr_out->vstamp);
728 PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->tsize);
729 PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->dsize);
730 PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->bsize);
731 PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->entry);
732 PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
733 (bfd_byte *) aouthdr_out->text_start);
734 PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
735 (bfd_byte *) aouthdr_out->data_start);
737 #ifdef I960
738 bfd_h_put_32(abfd, aouthdr_in->tagentries, (bfd_byte *) aouthdr_out->tagentries);
739 #endif
741 #ifdef RS6000COFF_C
742 #ifdef XCOFF64
743 bfd_h_put_64 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
744 #else
745 bfd_h_put_32 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
746 #endif
747 bfd_h_put_16 (abfd, aouthdr_in->o_snentry, aouthdr_out->o_snentry);
748 bfd_h_put_16 (abfd, aouthdr_in->o_sntext, aouthdr_out->o_sntext);
749 bfd_h_put_16 (abfd, aouthdr_in->o_sndata, aouthdr_out->o_sndata);
750 bfd_h_put_16 (abfd, aouthdr_in->o_sntoc, aouthdr_out->o_sntoc);
751 bfd_h_put_16 (abfd, aouthdr_in->o_snloader, aouthdr_out->o_snloader);
752 bfd_h_put_16 (abfd, aouthdr_in->o_snbss, aouthdr_out->o_snbss);
753 bfd_h_put_16 (abfd, aouthdr_in->o_algntext, aouthdr_out->o_algntext);
754 bfd_h_put_16 (abfd, aouthdr_in->o_algndata, aouthdr_out->o_algndata);
755 bfd_h_put_16 (abfd, aouthdr_in->o_modtype, aouthdr_out->o_modtype);
756 bfd_h_put_16 (abfd, aouthdr_in->o_cputype, aouthdr_out->o_cputype);
757 #ifdef XCOFF64
758 bfd_h_put_64 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
759 bfd_h_put_64 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
760 #else
761 bfd_h_put_32 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
762 bfd_h_put_32 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
763 #endif
764 memset (aouthdr_out->o_resv2, 0, sizeof aouthdr_out->o_resv2);
765 #ifdef XCOFF64
766 memset (aouthdr_out->o_debugger, 0, sizeof aouthdr_out->o_debugger);
767 memset (aouthdr_out->o_resv3, 0, sizeof aouthdr_out->o_resv3);
768 #endif
769 #endif
771 #ifdef MIPSECOFF
772 bfd_h_put_32(abfd, aouthdr_in->bss_start, (bfd_byte *) aouthdr_out->bss_start);
773 bfd_h_put_32(abfd, aouthdr_in->gp_value, (bfd_byte *) aouthdr_out->gp_value);
774 bfd_h_put_32(abfd, aouthdr_in->gprmask, (bfd_byte *) aouthdr_out->gprmask);
775 bfd_h_put_32(abfd, aouthdr_in->cprmask[0], (bfd_byte *) aouthdr_out->cprmask[0]);
776 bfd_h_put_32(abfd, aouthdr_in->cprmask[1], (bfd_byte *) aouthdr_out->cprmask[1]);
777 bfd_h_put_32(abfd, aouthdr_in->cprmask[2], (bfd_byte *) aouthdr_out->cprmask[2]);
778 bfd_h_put_32(abfd, aouthdr_in->cprmask[3], (bfd_byte *) aouthdr_out->cprmask[3]);
779 #endif
781 #ifdef ALPHAECOFF
782 /* FIXME: What does bldrev mean? */
783 bfd_h_put_16(abfd, (bfd_vma) 2, (bfd_byte *) aouthdr_out->bldrev);
784 bfd_h_put_16(abfd, (bfd_vma) 0, (bfd_byte *) aouthdr_out->padding);
785 bfd_h_put_64(abfd, aouthdr_in->bss_start, (bfd_byte *) aouthdr_out->bss_start);
786 bfd_h_put_64(abfd, aouthdr_in->gp_value, (bfd_byte *) aouthdr_out->gp_value);
787 bfd_h_put_32(abfd, aouthdr_in->gprmask, (bfd_byte *) aouthdr_out->gprmask);
788 bfd_h_put_32(abfd, aouthdr_in->fprmask, (bfd_byte *) aouthdr_out->fprmask);
789 #endif
791 return AOUTSZ;
794 static void
795 coff_swap_scnhdr_in (abfd, ext, in)
796 bfd *abfd;
797 PTR ext;
798 PTR in;
800 SCNHDR *scnhdr_ext = (SCNHDR *) ext;
801 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
803 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
804 COFF_ADJUST_SCNHDR_IN_PRE (abfd, ext, in);
805 #endif
806 memcpy(scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
807 scnhdr_int->s_vaddr =
808 GET_SCNHDR_VADDR (abfd, (bfd_byte *) scnhdr_ext->s_vaddr);
809 scnhdr_int->s_paddr =
810 GET_SCNHDR_PADDR (abfd, (bfd_byte *) scnhdr_ext->s_paddr);
811 scnhdr_int->s_size =
812 GET_SCNHDR_SIZE (abfd, (bfd_byte *) scnhdr_ext->s_size);
814 scnhdr_int->s_scnptr =
815 GET_SCNHDR_SCNPTR (abfd, (bfd_byte *) scnhdr_ext->s_scnptr);
816 scnhdr_int->s_relptr =
817 GET_SCNHDR_RELPTR (abfd, (bfd_byte *) scnhdr_ext->s_relptr);
818 scnhdr_int->s_lnnoptr =
819 GET_SCNHDR_LNNOPTR (abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr);
820 scnhdr_int->s_flags =
821 GET_SCNHDR_FLAGS (abfd, (bfd_byte *) scnhdr_ext->s_flags);
822 scnhdr_int->s_nreloc =
823 GET_SCNHDR_NRELOC (abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
824 scnhdr_int->s_nlnno =
825 GET_SCNHDR_NLNNO (abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
826 #ifdef I960
827 scnhdr_int->s_align =
828 GET_SCNHDR_ALIGN (abfd, (bfd_byte *) scnhdr_ext->s_align);
829 #endif
830 #ifdef COFF_ADJUST_SCNHDR_IN_POST
831 COFF_ADJUST_SCNHDR_IN_POST (abfd, ext, in);
832 #endif
835 static unsigned int
836 coff_swap_scnhdr_out (abfd, in, out)
837 bfd *abfd;
838 PTR in;
839 PTR out;
841 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
842 SCNHDR *scnhdr_ext = (SCNHDR *)out;
843 unsigned int ret = bfd_coff_scnhsz (abfd);
845 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
846 COFF_ADJUST_SCNHDR_OUT_PRE (abfd, in, out);
847 #endif
848 memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
850 PUT_SCNHDR_VADDR (abfd, scnhdr_int->s_vaddr,
851 (bfd_byte *) scnhdr_ext->s_vaddr);
853 PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_paddr,
854 (bfd_byte *) scnhdr_ext->s_paddr);
855 PUT_SCNHDR_SIZE (abfd, scnhdr_int->s_size,
856 (bfd_byte *) scnhdr_ext->s_size);
858 PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
859 (bfd_byte *) scnhdr_ext->s_scnptr);
860 PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
861 (bfd_byte *) scnhdr_ext->s_relptr);
862 PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
863 (bfd_byte *) scnhdr_ext->s_lnnoptr);
864 PUT_SCNHDR_FLAGS (abfd, scnhdr_int->s_flags,
865 (bfd_byte *) scnhdr_ext->s_flags);
866 #if defined(M88)
867 PUTWORD(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
868 PUTWORD(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
869 #else
870 if (scnhdr_int->s_nlnno <= MAX_SCNHDR_NLNNO)
871 PUT_SCNHDR_NLNNO(abfd, scnhdr_int->s_nlnno,
872 (bfd_byte *) scnhdr_ext->s_nlnno);
873 else
875 char buf[sizeof (scnhdr_int->s_name) + 1];
877 memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
878 buf[sizeof (scnhdr_int->s_name)] = '\0';
879 (*_bfd_error_handler)
880 (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
881 bfd_get_filename (abfd),
882 buf, scnhdr_int->s_nlnno);
883 PUT_SCNHDR_NLNNO(abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nlnno);
885 if (scnhdr_int->s_nreloc <= MAX_SCNHDR_NRELOC)
886 PUT_SCNHDR_NRELOC(abfd, scnhdr_int->s_nreloc,
887 (bfd_byte *) scnhdr_ext->s_nreloc);
888 else
890 char buf[sizeof (scnhdr_int->s_name) + 1];
892 memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
893 buf[sizeof (scnhdr_int->s_name)] = '\0';
894 (*_bfd_error_handler) (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
895 bfd_get_filename (abfd),
896 buf, scnhdr_int->s_nreloc);
897 bfd_set_error (bfd_error_file_truncated);
898 PUT_SCNHDR_NRELOC(abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nreloc);
899 ret = 0;
901 #endif
903 #ifdef I960
904 PUT_SCNHDR_ALIGN (abfd, scnhdr_int->s_align, (bfd_byte *) scnhdr_ext->s_align);
905 #endif
906 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
907 COFF_ADJUST_SCNHDR_OUT_POST (abfd, in, out);
908 #endif
909 return ret;