packaging: Add python3-base dependency
[platform/upstream/gdb.git] / bfd / coffswap.h
1 /* Generic COFF swapping routines, for BFD.
2    Copyright (C) 1990-2022 Free Software Foundation, Inc.
3    Written by Cygnus Support.
4
5    This file is part of BFD, the Binary File Descriptor library.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21
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.
26
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.  */
29
30 #ifndef GET_FCN_LNNOPTR
31 #define GET_FCN_LNNOPTR(abfd, ext) \
32   H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
33 #endif
34
35 #ifndef GET_FCN_ENDNDX
36 #define GET_FCN_ENDNDX(abfd, ext) \
37   H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx)
38 #endif
39
40 #ifndef PUT_FCN_LNNOPTR
41 #define PUT_FCN_LNNOPTR(abfd, in, ext) \
42   H_PUT_32 (abfd,  in, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
43 #endif
44 #ifndef PUT_FCN_ENDNDX
45 #define PUT_FCN_ENDNDX(abfd, in, ext) \
46   H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_endndx)
47 #endif
48 #ifndef GET_LNSZ_LNNO
49 #define GET_LNSZ_LNNO(abfd, ext) \
50   H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno)
51 #endif
52 #ifndef GET_LNSZ_SIZE
53 #define GET_LNSZ_SIZE(abfd, ext) \
54   H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size)
55 #endif
56 #ifndef PUT_LNSZ_LNNO
57 #define PUT_LNSZ_LNNO(abfd, in, ext) \
58   H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_lnno)
59 #endif
60 #ifndef PUT_LNSZ_SIZE
61 #define PUT_LNSZ_SIZE(abfd, in, ext) \
62   H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_size)
63 #endif
64 #ifndef GET_SCN_SCNLEN
65 #define GET_SCN_SCNLEN(abfd, ext) \
66   H_GET_32 (abfd, ext->x_scn.x_scnlen)
67 #endif
68 #ifndef GET_SCN_NRELOC
69 #define GET_SCN_NRELOC(abfd, ext) \
70   H_GET_16 (abfd, ext->x_scn.x_nreloc)
71 #endif
72 #ifndef GET_SCN_NLINNO
73 #define GET_SCN_NLINNO(abfd, ext) \
74   H_GET_16 (abfd, ext->x_scn.x_nlinno)
75 #endif
76 #ifndef PUT_SCN_SCNLEN
77 #define PUT_SCN_SCNLEN(abfd, in, ext) \
78   H_PUT_32 (abfd, in, ext->x_scn.x_scnlen)
79 #endif
80 #ifndef PUT_SCN_NRELOC
81 #define PUT_SCN_NRELOC(abfd, in, ext) \
82   H_PUT_16 (abfd, in, ext->x_scn.x_nreloc)
83 #endif
84 #ifndef PUT_SCN_NLINNO
85 #define PUT_SCN_NLINNO(abfd, in, ext) \
86   H_PUT_16 (abfd, in, ext->x_scn.x_nlinno)
87 #endif
88 #ifndef GET_LINENO_LNNO
89 #define GET_LINENO_LNNO(abfd, ext) \
90   H_GET_16 (abfd, ext->l_lnno);
91 #endif
92 #ifndef PUT_LINENO_LNNO
93 #define PUT_LINENO_LNNO(abfd, val, ext) \
94   H_PUT_16 (abfd, val, ext->l_lnno);
95 #endif
96
97 /* The f_symptr field in the filehdr is sometimes 64 bits.  */
98 #ifndef GET_FILEHDR_SYMPTR
99 #define GET_FILEHDR_SYMPTR H_GET_32
100 #endif
101 #ifndef PUT_FILEHDR_SYMPTR
102 #define PUT_FILEHDR_SYMPTR H_PUT_32
103 #endif
104
105 /* Some fields in the aouthdr are sometimes 64 bits.  */
106 #ifndef GET_AOUTHDR_TSIZE
107 #define GET_AOUTHDR_TSIZE H_GET_32
108 #endif
109 #ifndef PUT_AOUTHDR_TSIZE
110 #define PUT_AOUTHDR_TSIZE H_PUT_32
111 #endif
112 #ifndef GET_AOUTHDR_DSIZE
113 #define GET_AOUTHDR_DSIZE H_GET_32
114 #endif
115 #ifndef PUT_AOUTHDR_DSIZE
116 #define PUT_AOUTHDR_DSIZE H_PUT_32
117 #endif
118 #ifndef GET_AOUTHDR_BSIZE
119 #define GET_AOUTHDR_BSIZE H_GET_32
120 #endif
121 #ifndef PUT_AOUTHDR_BSIZE
122 #define PUT_AOUTHDR_BSIZE H_PUT_32
123 #endif
124 #ifndef GET_AOUTHDR_ENTRY
125 #define GET_AOUTHDR_ENTRY H_GET_32
126 #endif
127 #ifndef PUT_AOUTHDR_ENTRY
128 #define PUT_AOUTHDR_ENTRY H_PUT_32
129 #endif
130 #ifndef GET_AOUTHDR_TEXT_START
131 #define GET_AOUTHDR_TEXT_START H_GET_32
132 #endif
133 #ifndef PUT_AOUTHDR_TEXT_START
134 #define PUT_AOUTHDR_TEXT_START H_PUT_32
135 #endif
136 #ifndef GET_AOUTHDR_DATA_START
137 #define GET_AOUTHDR_DATA_START H_GET_32
138 #endif
139 #ifndef PUT_AOUTHDR_DATA_START
140 #define PUT_AOUTHDR_DATA_START H_PUT_32
141 #endif
142
143 /* Some fields in the scnhdr are sometimes 64 bits.  */
144 #ifndef GET_SCNHDR_PADDR
145 #define GET_SCNHDR_PADDR H_GET_32
146 #endif
147 #ifndef PUT_SCNHDR_PADDR
148 #define PUT_SCNHDR_PADDR H_PUT_32
149 #endif
150 #ifndef GET_SCNHDR_VADDR
151 #define GET_SCNHDR_VADDR H_GET_32
152 #endif
153 #ifndef PUT_SCNHDR_VADDR
154 #define PUT_SCNHDR_VADDR H_PUT_32
155 #endif
156 #ifndef GET_SCNHDR_SIZE
157 #define GET_SCNHDR_SIZE H_GET_32
158 #endif
159 #ifndef PUT_SCNHDR_SIZE
160 #define PUT_SCNHDR_SIZE H_PUT_32
161 #endif
162 #ifndef GET_SCNHDR_SCNPTR
163 #define GET_SCNHDR_SCNPTR H_GET_32
164 #endif
165 #ifndef PUT_SCNHDR_SCNPTR
166 #define PUT_SCNHDR_SCNPTR H_PUT_32
167 #endif
168 #ifndef GET_SCNHDR_RELPTR
169 #define GET_SCNHDR_RELPTR H_GET_32
170 #endif
171 #ifndef PUT_SCNHDR_RELPTR
172 #define PUT_SCNHDR_RELPTR H_PUT_32
173 #endif
174 #ifndef GET_SCNHDR_LNNOPTR
175 #define GET_SCNHDR_LNNOPTR H_GET_32
176 #endif
177 #ifndef PUT_SCNHDR_LNNOPTR
178 #define PUT_SCNHDR_LNNOPTR H_PUT_32
179 #endif
180 #ifndef GET_SCNHDR_NRELOC
181 #define GET_SCNHDR_NRELOC H_GET_16
182 #endif
183 #ifndef MAX_SCNHDR_NRELOC
184 #define MAX_SCNHDR_NRELOC 0xffff
185 #endif
186 #ifndef PUT_SCNHDR_NRELOC
187 #define PUT_SCNHDR_NRELOC H_PUT_16
188 #endif
189 #ifndef GET_SCNHDR_NLNNO
190 #define GET_SCNHDR_NLNNO H_GET_16
191 #endif
192 #ifndef MAX_SCNHDR_NLNNO
193 #define MAX_SCNHDR_NLNNO 0xffff
194 #endif
195 #ifndef PUT_SCNHDR_NLNNO
196 #define PUT_SCNHDR_NLNNO H_PUT_16
197 #endif
198 #ifndef GET_SCNHDR_FLAGS
199 #define GET_SCNHDR_FLAGS H_GET_32
200 #endif
201 #ifndef PUT_SCNHDR_FLAGS
202 #define PUT_SCNHDR_FLAGS H_PUT_32
203 #endif
204
205 #ifndef GET_RELOC_VADDR
206 #define GET_RELOC_VADDR H_GET_32
207 #endif
208 #ifndef PUT_RELOC_VADDR
209 #define PUT_RELOC_VADDR H_PUT_32
210 #endif
211
212 #ifndef NO_COFF_RELOCS
213
214 static void
215 coff_swap_reloc_in (bfd * abfd, void * src, void * dst)
216 {
217   RELOC *reloc_src = (RELOC *) src;
218   struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
219
220   reloc_dst->r_vaddr  = GET_RELOC_VADDR (abfd, reloc_src->r_vaddr);
221   reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
222   reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
223
224 #ifdef SWAP_IN_RELOC_OFFSET
225   reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
226 #endif
227 }
228
229 static unsigned int
230 coff_swap_reloc_out (bfd * abfd, void * src, void * dst)
231 {
232   struct internal_reloc *reloc_src = (struct internal_reloc *) src;
233   struct external_reloc *reloc_dst = (struct external_reloc *) dst;
234
235   PUT_RELOC_VADDR (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
236   H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
237   H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type);
238
239 #ifdef SWAP_OUT_RELOC_OFFSET
240   SWAP_OUT_RELOC_OFFSET (abfd, reloc_src->r_offset, reloc_dst->r_offset);
241 #endif
242 #ifdef SWAP_OUT_RELOC_EXTRA
243   SWAP_OUT_RELOC_EXTRA (abfd, reloc_src, reloc_dst);
244 #endif
245
246   return bfd_coff_relsz (abfd);
247 }
248
249 #ifdef TICOFF
250 static void
251 coff_swap_reloc_v0_in (bfd *abfd, void *src, void *dst)
252 {
253   struct external_reloc_v0 *reloc_src = (struct external_reloc_v0 *) src;
254   struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
255
256   reloc_dst->r_vaddr  = GET_RELOC_VADDR (abfd, reloc_src->r_vaddr);
257   reloc_dst->r_symndx = H_GET_16 (abfd, reloc_src->r_symndx);
258   reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
259 }
260
261 static unsigned int
262 coff_swap_reloc_v0_out (bfd *abfd, void *src, void *dst)
263 {
264   struct internal_reloc *reloc_src = (struct internal_reloc *) src;
265   struct external_reloc_v0 *reloc_dst = (struct external_reloc_v0 *) dst;
266
267   PUT_RELOC_VADDR (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
268   H_PUT_16 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
269   H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type);
270   SWAP_OUT_RELOC_EXTRA (abfd, reloc_src, reloc_dst);
271
272   return bfd_coff_relsz (abfd);
273 }
274 #endif
275
276 #endif /* NO_COFF_RELOCS */
277
278 static void
279 coff_swap_filehdr_in (bfd * abfd, void * src, void * dst)
280 {
281   FILHDR *filehdr_src = (FILHDR *) src;
282   struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
283
284 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
285   COFF_ADJUST_FILEHDR_IN_PRE (abfd, src, dst);
286 #endif
287   filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
288   filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
289   filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
290   filehdr_dst->f_symptr = GET_FILEHDR_SYMPTR (abfd, filehdr_src->f_symptr);
291   filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
292   filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src->f_opthdr);
293   filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
294
295 #ifdef COFF_ADJUST_FILEHDR_IN_POST
296   COFF_ADJUST_FILEHDR_IN_POST (abfd, src, dst);
297 #endif
298 }
299
300 static  unsigned int
301 coff_swap_filehdr_out (bfd *abfd, void * in, void * out)
302 {
303   struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
304   FILHDR *filehdr_out = (FILHDR *) out;
305
306 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
307   COFF_ADJUST_FILEHDR_OUT_PRE (abfd, in, out);
308 #endif
309   H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
310   H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
311   H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->f_timdat);
312   PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr, filehdr_out->f_symptr);
313   H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
314   H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
315   H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
316
317 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
318   COFF_ADJUST_FILEHDR_OUT_POST (abfd, in, out);
319 #endif
320   return bfd_coff_filhsz (abfd);
321 }
322
323 #ifndef NO_COFF_SYMBOLS
324
325 static void
326 coff_swap_sym_in (bfd * abfd, void * ext1, void * in1)
327 {
328   SYMENT *ext = (SYMENT *) ext1;
329   struct internal_syment *in = (struct internal_syment *) in1;
330
331   if (ext->e.e_name[0] == 0)
332     {
333       in->_n._n_n._n_zeroes = 0;
334       in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
335     }
336   else
337     {
338 #if SYMNMLEN != E_SYMNMLEN
339 #error we need to cope with truncating or extending SYMNMLEN
340 #else
341       memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
342 #endif
343     }
344
345   in->n_value = H_GET_32 (abfd, ext->e_value);
346   in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum);
347   if (sizeof (ext->e_type) == 2)
348     in->n_type = H_GET_16 (abfd, ext->e_type);
349   else
350     in->n_type = H_GET_32 (abfd, ext->e_type);
351   in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
352   in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
353 #ifdef COFF_ADJUST_SYM_IN_POST
354   COFF_ADJUST_SYM_IN_POST (abfd, ext1, in1);
355 #endif
356 }
357
358 static unsigned int
359 coff_swap_sym_out (bfd * abfd, void * inp, void * extp)
360 {
361   struct internal_syment *in = (struct internal_syment *) inp;
362   SYMENT *ext =(SYMENT *) extp;
363
364 #ifdef COFF_ADJUST_SYM_OUT_PRE
365   COFF_ADJUST_SYM_OUT_PRE (abfd, inp, extp);
366 #endif
367
368   if (in->_n._n_name[0] == 0)
369     {
370       H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
371       H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
372     }
373   else
374     {
375 #if SYMNMLEN != E_SYMNMLEN
376 #error we need to cope with truncating or extending SYMNMLEN
377 #else
378       memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
379 #endif
380     }
381
382   H_PUT_32 (abfd, in->n_value, ext->e_value);
383   H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
384
385   if (sizeof (ext->e_type) == 2)
386     H_PUT_16 (abfd, in->n_type, ext->e_type);
387   else
388     H_PUT_32 (abfd, in->n_type, ext->e_type);
389
390   H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
391   H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
392
393 #ifdef COFF_ADJUST_SYM_OUT_POST
394   COFF_ADJUST_SYM_OUT_POST (abfd, inp, extp);
395 #endif
396
397   return SYMESZ;
398 }
399
400 static void
401 coff_swap_aux_in (bfd *abfd,
402                   void * ext1,
403                   int type,
404                   int in_class,
405                   int indx,
406                   int numaux,
407                   void * in1)
408 {
409   AUXENT *ext = (AUXENT *) ext1;
410   union internal_auxent *in = (union internal_auxent *) in1;
411
412 #ifdef COFF_ADJUST_AUX_IN_PRE
413   COFF_ADJUST_AUX_IN_PRE (abfd, ext1, type, in_class, indx, numaux, in1);
414 #endif
415
416   switch (in_class)
417     {
418     case C_FILE:
419       if (ext->x_file.x_fname[0] == 0)
420         {
421           in->x_file.x_n.x_n.x_zeroes = 0;
422           in->x_file.x_n.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset);
423         }
424       else
425         {
426 #if FILNMLEN != E_FILNMLEN
427 #error we need to cope with truncating or extending FILNMLEN
428 #else
429           if (numaux > 1 && coff_data (abfd)->pe)
430             {
431               if (indx == 0)
432                 memcpy (in->x_file.x_n.x_fname, ext->x_file.x_fname,
433                         numaux * sizeof (AUXENT));
434             }
435           else
436             memcpy (in->x_file.x_n.x_fname, ext->x_file.x_fname, FILNMLEN);
437 #endif
438         }
439       goto end;
440
441     case C_STAT:
442 #ifdef C_LEAFSTAT
443     case C_LEAFSTAT:
444 #endif
445     case C_HIDDEN:
446       if (type == T_NULL)
447         {
448           in->x_scn.x_scnlen = GET_SCN_SCNLEN (abfd, ext);
449           in->x_scn.x_nreloc = GET_SCN_NRELOC (abfd, ext);
450           in->x_scn.x_nlinno = GET_SCN_NLINNO (abfd, ext);
451
452           /* PE defines some extra fields; we zero them out for
453              safety.  */
454           in->x_scn.x_checksum = 0;
455           in->x_scn.x_associated = 0;
456           in->x_scn.x_comdat = 0;
457
458           goto end;
459         }
460       break;
461     }
462
463   in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
464 #ifndef NO_TVNDX
465   in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
466 #endif
467
468   if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
469       || ISTAG (in_class))
470     {
471       in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
472       in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
473     }
474   else
475     {
476 #if DIMNUM != E_DIMNUM
477 #error we need to cope with truncating or extending DIMNUM
478 #endif
479       in->x_sym.x_fcnary.x_ary.x_dimen[0] =
480         H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
481       in->x_sym.x_fcnary.x_ary.x_dimen[1] =
482         H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
483       in->x_sym.x_fcnary.x_ary.x_dimen[2] =
484         H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
485       in->x_sym.x_fcnary.x_ary.x_dimen[3] =
486         H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
487     }
488
489   if (ISFCN (type))
490     in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
491   else
492     {
493       in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO (abfd, ext);
494       in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE (abfd, ext);
495     }
496
497  end: ;
498
499 #ifdef COFF_ADJUST_AUX_IN_POST
500   COFF_ADJUST_AUX_IN_POST (abfd, ext1, type, in_class, indx, numaux, in1);
501 #endif
502 }
503
504 static unsigned int
505 coff_swap_aux_out (bfd * abfd,
506                    void * inp,
507                    int type,
508                    int in_class,
509                    int indx ATTRIBUTE_UNUSED,
510                    int numaux ATTRIBUTE_UNUSED,
511                    void * extp)
512 {
513   union internal_auxent * in = (union internal_auxent *) inp;
514   AUXENT *ext = (AUXENT *) extp;
515
516 #ifdef COFF_ADJUST_AUX_OUT_PRE
517   COFF_ADJUST_AUX_OUT_PRE (abfd, inp, type, in_class, indx, numaux, extp);
518 #endif
519
520   memset (ext, 0, AUXESZ);
521
522   switch (in_class)
523     {
524     case C_FILE:
525       if (in->x_file.x_n.x_fname[0] == 0)
526         {
527           H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
528           H_PUT_32 (abfd, in->x_file.x_n.x_n.x_offset, ext->x_file.x_n.x_offset);
529         }
530       else
531         {
532 #if FILNMLEN != E_FILNMLEN
533 #error we need to cope with truncating or extending FILNMLEN
534 #else
535           memcpy (ext->x_file.x_fname, in->x_file.x_n.x_fname, FILNMLEN);
536 #endif
537         }
538       goto end;
539
540     case C_STAT:
541 #ifdef C_LEAFSTAT
542     case C_LEAFSTAT:
543 #endif
544     case C_HIDDEN:
545       if (type == T_NULL)
546         {
547           PUT_SCN_SCNLEN (abfd, in->x_scn.x_scnlen, ext);
548           PUT_SCN_NRELOC (abfd, in->x_scn.x_nreloc, ext);
549           PUT_SCN_NLINNO (abfd, in->x_scn.x_nlinno, ext);
550           goto end;
551         }
552       break;
553     }
554
555   H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
556 #ifndef NO_TVNDX
557   H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
558 #endif
559
560   if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
561       || ISTAG (in_class))
562     {
563       PUT_FCN_LNNOPTR (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
564       PUT_FCN_ENDNDX (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
565     }
566   else
567     {
568 #if DIMNUM != E_DIMNUM
569 #error we need to cope with truncating or extending DIMNUM
570 #endif
571       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
572                ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
573       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
574                ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
575       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
576                ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
577       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
578                ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
579     }
580
581   if (ISFCN (type))
582     H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
583   else
584     {
585       PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
586       PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
587     }
588
589  end:
590 #ifdef COFF_ADJUST_AUX_OUT_POST
591   COFF_ADJUST_AUX_OUT_POST (abfd, inp, type, in_class, indx, numaux, extp);
592 #endif
593   return AUXESZ;
594 }
595
596 #endif /* NO_COFF_SYMBOLS */
597
598 #ifndef NO_COFF_LINENOS
599
600 static void
601 coff_swap_lineno_in (bfd * abfd, void * ext1, void * in1)
602 {
603   LINENO *ext = (LINENO *) ext1;
604   struct internal_lineno *in = (struct internal_lineno *) in1;
605
606   in->l_addr.l_symndx = H_GET_32 (abfd, ext->l_addr.l_symndx);
607   in->l_lnno = GET_LINENO_LNNO (abfd, ext);
608 }
609
610 static unsigned int
611 coff_swap_lineno_out (bfd * abfd, void * inp, void * outp)
612 {
613   struct internal_lineno *in = (struct internal_lineno *) inp;
614   struct external_lineno *ext = (struct external_lineno *) outp;
615   H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
616
617   PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
618   return LINESZ;
619 }
620
621 #endif /* NO_COFF_LINENOS */
622
623 static void
624 coff_swap_aouthdr_in (bfd * abfd, void * aouthdr_ext1, void * aouthdr_int1)
625 {
626   AOUTHDR *aouthdr_ext;
627   struct internal_aouthdr *aouthdr_int;
628
629   aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
630   aouthdr_int = (struct internal_aouthdr *) aouthdr_int1;
631   aouthdr_int->magic = H_GET_16 (abfd, aouthdr_ext->magic);
632   aouthdr_int->vstamp = H_GET_16 (abfd, aouthdr_ext->vstamp);
633   aouthdr_int->tsize = GET_AOUTHDR_TSIZE (abfd, aouthdr_ext->tsize);
634   aouthdr_int->dsize = GET_AOUTHDR_DSIZE (abfd, aouthdr_ext->dsize);
635   aouthdr_int->bsize = GET_AOUTHDR_BSIZE (abfd, aouthdr_ext->bsize);
636   aouthdr_int->entry = GET_AOUTHDR_ENTRY (abfd, aouthdr_ext->entry);
637   aouthdr_int->text_start =
638     GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start);
639   aouthdr_int->data_start =
640     GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start);
641
642 #ifdef RS6000COFF_C
643 #ifdef XCOFF64
644   aouthdr_int->o_toc = H_GET_64 (abfd, aouthdr_ext->o_toc);
645 #else
646   aouthdr_int->o_toc = H_GET_32 (abfd, aouthdr_ext->o_toc);
647 #endif
648   aouthdr_int->o_snentry  = H_GET_16 (abfd, aouthdr_ext->o_snentry);
649   aouthdr_int->o_sntext   = H_GET_16 (abfd, aouthdr_ext->o_sntext);
650   aouthdr_int->o_sndata   = H_GET_16 (abfd, aouthdr_ext->o_sndata);
651   aouthdr_int->o_sntoc    = H_GET_16 (abfd, aouthdr_ext->o_sntoc);
652   aouthdr_int->o_snloader = H_GET_16 (abfd, aouthdr_ext->o_snloader);
653   aouthdr_int->o_snbss    = H_GET_16 (abfd, aouthdr_ext->o_snbss);
654   aouthdr_int->o_algntext = H_GET_16 (abfd, aouthdr_ext->o_algntext);
655   aouthdr_int->o_algndata = H_GET_16 (abfd, aouthdr_ext->o_algndata);
656   aouthdr_int->o_modtype  = H_GET_16 (abfd, aouthdr_ext->o_modtype);
657   aouthdr_int->o_cputype  = H_GET_16 (abfd, aouthdr_ext->o_cputype);
658 #ifdef XCOFF64
659   aouthdr_int->o_maxstack = H_GET_64 (abfd, aouthdr_ext->o_maxstack);
660   aouthdr_int->o_maxdata  = H_GET_64 (abfd, aouthdr_ext->o_maxdata);
661 #else
662   aouthdr_int->o_maxstack = H_GET_32 (abfd, aouthdr_ext->o_maxstack);
663   aouthdr_int->o_maxdata  = H_GET_32 (abfd, aouthdr_ext->o_maxdata);
664 #endif
665 #endif
666
667 #ifdef MIPSECOFF
668   aouthdr_int->bss_start  = H_GET_32 (abfd, aouthdr_ext->bss_start);
669   aouthdr_int->gp_value   = H_GET_32 (abfd, aouthdr_ext->gp_value);
670   aouthdr_int->gprmask    = H_GET_32 (abfd, aouthdr_ext->gprmask);
671   aouthdr_int->cprmask[0] = H_GET_32 (abfd, aouthdr_ext->cprmask[0]);
672   aouthdr_int->cprmask[1] = H_GET_32 (abfd, aouthdr_ext->cprmask[1]);
673   aouthdr_int->cprmask[2] = H_GET_32 (abfd, aouthdr_ext->cprmask[2]);
674   aouthdr_int->cprmask[3] = H_GET_32 (abfd, aouthdr_ext->cprmask[3]);
675 #endif
676
677 #ifdef ALPHAECOFF
678   aouthdr_int->bss_start = H_GET_64 (abfd, aouthdr_ext->bss_start);
679   aouthdr_int->gp_value  = H_GET_64 (abfd, aouthdr_ext->gp_value);
680   aouthdr_int->gprmask   = H_GET_32 (abfd, aouthdr_ext->gprmask);
681   aouthdr_int->fprmask   = H_GET_32 (abfd, aouthdr_ext->fprmask);
682 #endif
683 }
684
685 static unsigned int
686 coff_swap_aouthdr_out (bfd * abfd, void * in, void * out)
687 {
688   struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *) in;
689   AOUTHDR *aouthdr_out = (AOUTHDR *) out;
690
691   H_PUT_16 (abfd, aouthdr_in->magic, aouthdr_out->magic);
692   H_PUT_16 (abfd, aouthdr_in->vstamp, aouthdr_out->vstamp);
693   PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, aouthdr_out->tsize);
694   PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, aouthdr_out->dsize);
695   PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, aouthdr_out->bsize);
696   PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, aouthdr_out->entry);
697   PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
698                           aouthdr_out->text_start);
699   PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
700                           aouthdr_out->data_start);
701
702 #ifdef RS6000COFF_C
703 #ifdef XCOFF64
704   H_PUT_64 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
705 #else
706   H_PUT_32 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
707 #endif
708   H_PUT_16 (abfd, aouthdr_in->o_snentry, aouthdr_out->o_snentry);
709   H_PUT_16 (abfd, aouthdr_in->o_sntext, aouthdr_out->o_sntext);
710   H_PUT_16 (abfd, aouthdr_in->o_sndata, aouthdr_out->o_sndata);
711   H_PUT_16 (abfd, aouthdr_in->o_sntoc, aouthdr_out->o_sntoc);
712   H_PUT_16 (abfd, aouthdr_in->o_snloader, aouthdr_out->o_snloader);
713   H_PUT_16 (abfd, aouthdr_in->o_snbss, aouthdr_out->o_snbss);
714   H_PUT_16 (abfd, aouthdr_in->o_algntext, aouthdr_out->o_algntext);
715   H_PUT_16 (abfd, aouthdr_in->o_algndata, aouthdr_out->o_algndata);
716   H_PUT_16 (abfd, aouthdr_in->o_modtype, aouthdr_out->o_modtype);
717   H_PUT_16 (abfd, aouthdr_in->o_cputype, aouthdr_out->o_cputype);
718 #ifdef XCOFF64
719   H_PUT_64 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
720   H_PUT_64 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
721 #else
722   H_PUT_32 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
723   H_PUT_32 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
724 #endif
725   /* TODO: set o_*psize dynamically */
726   H_PUT_8 (abfd, 0, aouthdr_out->o_textpsize);
727   H_PUT_8 (abfd, 0, aouthdr_out->o_datapsize);
728   H_PUT_8 (abfd, 0, aouthdr_out->o_stackpsize);
729   H_PUT_8 (abfd, aouthdr_in->o_flags, aouthdr_out->o_flags);
730   H_PUT_16 (abfd, aouthdr_in->o_sntdata, aouthdr_out->o_sntdata);
731   H_PUT_16 (abfd, aouthdr_in->o_sntbss, aouthdr_out->o_sntbss);
732   H_PUT_32 (abfd, 0, aouthdr_out->o_debugger);
733 #ifdef XCOFF64
734   H_PUT_16 (abfd, aouthdr_in->o_x64flags, aouthdr_out->o_x64flags);
735   memset (aouthdr_out->o_resv3, 0, sizeof aouthdr_out->o_resv3);
736 #endif
737 #endif
738
739 #ifdef MIPSECOFF
740   H_PUT_32 (abfd, aouthdr_in->bss_start, aouthdr_out->bss_start);
741   H_PUT_32 (abfd, aouthdr_in->gp_value, aouthdr_out->gp_value);
742   H_PUT_32 (abfd, aouthdr_in->gprmask, aouthdr_out->gprmask);
743   H_PUT_32 (abfd, aouthdr_in->cprmask[0], aouthdr_out->cprmask[0]);
744   H_PUT_32 (abfd, aouthdr_in->cprmask[1], aouthdr_out->cprmask[1]);
745   H_PUT_32 (abfd, aouthdr_in->cprmask[2], aouthdr_out->cprmask[2]);
746   H_PUT_32 (abfd, aouthdr_in->cprmask[3], aouthdr_out->cprmask[3]);
747 #endif
748
749 #ifdef ALPHAECOFF
750   /* FIXME: What does bldrev mean?  */
751   H_PUT_16 (abfd, 2, aouthdr_out->bldrev);
752   H_PUT_16 (abfd, 0, aouthdr_out->padding);
753   H_PUT_64 (abfd, aouthdr_in->bss_start, aouthdr_out->bss_start);
754   H_PUT_64 (abfd, aouthdr_in->gp_value, aouthdr_out->gp_value);
755   H_PUT_32 (abfd, aouthdr_in->gprmask, aouthdr_out->gprmask);
756   H_PUT_32 (abfd, aouthdr_in->fprmask, aouthdr_out->fprmask);
757 #endif
758
759   return AOUTSZ;
760 }
761
762 ATTRIBUTE_UNUSED
763 static void
764 coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in)
765 {
766   SCNHDR *scnhdr_ext = (SCNHDR *) ext;
767   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
768
769 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
770   COFF_ADJUST_SCNHDR_IN_PRE (abfd, ext, in);
771 #endif
772   memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
773
774   scnhdr_int->s_vaddr = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
775   scnhdr_int->s_paddr = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
776   scnhdr_int->s_size = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
777
778   scnhdr_int->s_scnptr = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
779   scnhdr_int->s_relptr = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
780   scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
781   scnhdr_int->s_flags = GET_SCNHDR_FLAGS (abfd, scnhdr_ext->s_flags);
782   scnhdr_int->s_nreloc = GET_SCNHDR_NRELOC (abfd, scnhdr_ext->s_nreloc);
783   scnhdr_int->s_nlnno = GET_SCNHDR_NLNNO (abfd, scnhdr_ext->s_nlnno);
784 #ifdef COFF_ADJUST_SCNHDR_IN_POST
785   COFF_ADJUST_SCNHDR_IN_POST (abfd, ext, in);
786 #endif
787 }
788
789 ATTRIBUTE_UNUSED
790 static unsigned int
791 coff_swap_scnhdr_out (bfd * abfd, void * in, void * out)
792 {
793   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
794   SCNHDR *scnhdr_ext = (SCNHDR *) out;
795   unsigned int ret = bfd_coff_scnhsz (abfd);
796
797 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
798   COFF_ADJUST_SCNHDR_OUT_PRE (abfd, in, out);
799 #endif
800   memcpy (scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
801
802   PUT_SCNHDR_VADDR (abfd, scnhdr_int->s_vaddr, scnhdr_ext->s_vaddr);
803   PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_paddr, scnhdr_ext->s_paddr);
804   PUT_SCNHDR_SIZE (abfd, scnhdr_int->s_size, scnhdr_ext->s_size);
805   PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr, scnhdr_ext->s_scnptr);
806   PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr, scnhdr_ext->s_relptr);
807   PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr, scnhdr_ext->s_lnnoptr);
808   PUT_SCNHDR_FLAGS (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
809   if (scnhdr_int->s_nlnno <= MAX_SCNHDR_NLNNO)
810     PUT_SCNHDR_NLNNO (abfd, scnhdr_int->s_nlnno, scnhdr_ext->s_nlnno);
811   else
812     {
813       char buf[sizeof (scnhdr_int->s_name) + 1];
814
815       memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
816       buf[sizeof (scnhdr_int->s_name)] = '\0';
817       _bfd_error_handler
818         /* xgettext:c-format */
819         (_("%pB: warning: %s: line number overflow: 0x%lx > 0xffff"),
820          abfd, buf, scnhdr_int->s_nlnno);
821       PUT_SCNHDR_NLNNO (abfd, 0xffff, scnhdr_ext->s_nlnno);
822     }
823
824   if (scnhdr_int->s_nreloc <= MAX_SCNHDR_NRELOC)
825     PUT_SCNHDR_NRELOC (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc);
826   else
827     {
828       char buf[sizeof (scnhdr_int->s_name) + 1];
829
830       memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
831       buf[sizeof (scnhdr_int->s_name)] = '\0';
832       /* xgettext:c-format */
833       _bfd_error_handler (_("%pB: %s: reloc overflow: 0x%lx > 0xffff"),
834                           abfd, buf, scnhdr_int->s_nreloc);
835       bfd_set_error (bfd_error_file_truncated);
836       PUT_SCNHDR_NRELOC (abfd, 0xffff, scnhdr_ext->s_nreloc);
837       ret = 0;
838     }
839
840 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
841   COFF_ADJUST_SCNHDR_OUT_POST (abfd, in, out);
842 #endif
843   return ret;
844 }