packaging: Enable testing infrastructure
[external/binutils.git] / bfd / ecoffswap.h
1 /* Generic ECOFF swapping routines, for BFD.
2    Copyright (C) 1992-2019 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
23 /* NOTE: This is a header file, but it contains executable routines.
24    This is done this way because these routines are substantially
25    similar, but are not identical, for all ECOFF targets.
26
27    These are routines to swap the ECOFF symbolic information in and
28    out.  The routines are defined statically.  You can set breakpoints
29    on them in gdb by naming the including source file; e.g.,
30    'coff-mips.c':ecoff_swap_hdr_in.
31
32    Before including this header file, one of ECOFF_32, ECOFF_64,
33    ECOFF_SIGNED_32 or ECOFF_SIGNED_64 must be defined.  These are
34    checked when swapping information that depends upon the target
35    size.  This code works for 32 bit and 64 bit ECOFF, but may need to
36    be generalized in the future.
37
38    Some header file which defines the external forms of these
39    structures must also be included before including this header file.
40    Currently this is either coff/mips.h or coff/alpha.h.
41
42    If the symbol TEST is defined when this file is compiled, a
43    comparison is made to ensure that, in fact, the output is
44    bit-for-bit the same as the input.  Of course, this symbol should
45    only be defined when deliberately testing the code on a machine
46    with the proper byte sex and such.  */
47
48 #ifdef ECOFF_32
49 #define ECOFF_GET_OFF H_GET_32
50 #define ECOFF_PUT_OFF H_PUT_32
51 #endif
52 #ifdef ECOFF_64
53 #define ECOFF_GET_OFF H_GET_64
54 #define ECOFF_PUT_OFF H_PUT_64
55 #endif
56 #ifdef ECOFF_SIGNED_32
57 #define ECOFF_GET_OFF H_GET_S32
58 #define ECOFF_PUT_OFF H_PUT_S32
59 #endif
60 #ifdef ECOFF_SIGNED_64
61 #define ECOFF_GET_OFF H_GET_S64
62 #define ECOFF_PUT_OFF H_PUT_S64
63 #endif
64
65 /* ECOFF auxiliary information swapping routines.  These are the same
66    for all ECOFF targets, so they are defined in ecofflink.c.  */
67
68 extern void _bfd_ecoff_swap_tir_in
69   (int, const struct tir_ext *, TIR *);
70 extern void _bfd_ecoff_swap_tir_out
71   (int, const TIR *, struct tir_ext *);
72 extern void _bfd_ecoff_swap_rndx_in
73   (int, const struct rndx_ext *, RNDXR *);
74 extern void _bfd_ecoff_swap_rndx_out
75   (int, const RNDXR *, struct rndx_ext *);
76
77 /* Prototypes for functions defined in this file.  */
78
79 static void ecoff_swap_hdr_in (bfd *, void *, HDRR *);
80 static void ecoff_swap_hdr_out (bfd *, const HDRR *, void *);
81 static void ecoff_swap_fdr_in (bfd *, void *, FDR *);
82 static void ecoff_swap_fdr_out (bfd *, const FDR *, void *);
83 static void ecoff_swap_pdr_in (bfd *, void *, PDR *);
84 static void ecoff_swap_pdr_out (bfd *, const PDR *, void *);
85 static void ecoff_swap_sym_in (bfd *, void *, SYMR *);
86 static void ecoff_swap_sym_out (bfd *, const SYMR *, void *);
87 static void ecoff_swap_ext_in (bfd *, void *, EXTR *);
88 static void ecoff_swap_ext_out (bfd *, const EXTR *, void *);
89 static void ecoff_swap_rfd_in (bfd *, void *, RFDT *);
90 static void ecoff_swap_rfd_out (bfd *, const RFDT *, void *);
91 static void ecoff_swap_opt_in (bfd *, void *, OPTR *);
92 static void ecoff_swap_opt_out (bfd *, const OPTR *, void *);
93 static void ecoff_swap_dnr_in (bfd *, void *, DNR *);
94 static void ecoff_swap_dnr_out (bfd *, const DNR *, void *);
95
96 /* Swap in the symbolic header.  */
97
98 static void
99 ecoff_swap_hdr_in (bfd *abfd, void * ext_copy, HDRR *intern)
100 {
101   struct hdr_ext ext[1];
102
103   *ext = *(struct hdr_ext *) ext_copy;
104
105   intern->magic         = H_GET_S16     (abfd, ext->h_magic);
106   intern->vstamp        = H_GET_S16     (abfd, ext->h_vstamp);
107   intern->ilineMax      = H_GET_32      (abfd, ext->h_ilineMax);
108   intern->cbLine        = ECOFF_GET_OFF (abfd, ext->h_cbLine);
109   intern->cbLineOffset  = ECOFF_GET_OFF (abfd, ext->h_cbLineOffset);
110   intern->idnMax        = H_GET_32      (abfd, ext->h_idnMax);
111   intern->cbDnOffset    = ECOFF_GET_OFF (abfd, ext->h_cbDnOffset);
112   intern->ipdMax        = H_GET_32      (abfd, ext->h_ipdMax);
113   intern->cbPdOffset    = ECOFF_GET_OFF (abfd, ext->h_cbPdOffset);
114   intern->isymMax       = H_GET_32      (abfd, ext->h_isymMax);
115   intern->cbSymOffset   = ECOFF_GET_OFF (abfd, ext->h_cbSymOffset);
116   intern->ioptMax       = H_GET_32      (abfd, ext->h_ioptMax);
117   intern->cbOptOffset   = ECOFF_GET_OFF (abfd, ext->h_cbOptOffset);
118   intern->iauxMax       = H_GET_32      (abfd, ext->h_iauxMax);
119   intern->cbAuxOffset   = ECOFF_GET_OFF (abfd, ext->h_cbAuxOffset);
120   intern->issMax        = H_GET_32      (abfd, ext->h_issMax);
121   intern->cbSsOffset    = ECOFF_GET_OFF (abfd, ext->h_cbSsOffset);
122   intern->issExtMax     = H_GET_32      (abfd, ext->h_issExtMax);
123   intern->cbSsExtOffset = ECOFF_GET_OFF (abfd, ext->h_cbSsExtOffset);
124   intern->ifdMax        = H_GET_32      (abfd, ext->h_ifdMax);
125   intern->cbFdOffset    = ECOFF_GET_OFF (abfd, ext->h_cbFdOffset);
126   intern->crfd          = H_GET_32      (abfd, ext->h_crfd);
127   intern->cbRfdOffset   = ECOFF_GET_OFF (abfd, ext->h_cbRfdOffset);
128   intern->iextMax       = H_GET_32      (abfd, ext->h_iextMax);
129   intern->cbExtOffset   = ECOFF_GET_OFF (abfd, ext->h_cbExtOffset);
130
131 #ifdef TEST
132   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
133     abort ();
134 #endif
135 }
136
137 /* Swap out the symbolic header.  */
138
139 static void
140 ecoff_swap_hdr_out (bfd *abfd, const HDRR *intern_copy, void * ext_ptr)
141 {
142   struct hdr_ext *ext = (struct hdr_ext *) ext_ptr;
143   HDRR intern[1];
144
145   *intern = *intern_copy;
146
147   H_PUT_S16     (abfd, intern->magic,         ext->h_magic);
148   H_PUT_S16     (abfd, intern->vstamp,        ext->h_vstamp);
149   H_PUT_32      (abfd, intern->ilineMax,      ext->h_ilineMax);
150   ECOFF_PUT_OFF (abfd, intern->cbLine,        ext->h_cbLine);
151   ECOFF_PUT_OFF (abfd, intern->cbLineOffset,  ext->h_cbLineOffset);
152   H_PUT_32      (abfd, intern->idnMax,        ext->h_idnMax);
153   ECOFF_PUT_OFF (abfd, intern->cbDnOffset,    ext->h_cbDnOffset);
154   H_PUT_32      (abfd, intern->ipdMax,        ext->h_ipdMax);
155   ECOFF_PUT_OFF (abfd, intern->cbPdOffset,    ext->h_cbPdOffset);
156   H_PUT_32      (abfd, intern->isymMax,       ext->h_isymMax);
157   ECOFF_PUT_OFF (abfd, intern->cbSymOffset,   ext->h_cbSymOffset);
158   H_PUT_32      (abfd, intern->ioptMax,       ext->h_ioptMax);
159   ECOFF_PUT_OFF (abfd, intern->cbOptOffset,   ext->h_cbOptOffset);
160   H_PUT_32      (abfd, intern->iauxMax,       ext->h_iauxMax);
161   ECOFF_PUT_OFF (abfd, intern->cbAuxOffset,   ext->h_cbAuxOffset);
162   H_PUT_32      (abfd, intern->issMax,        ext->h_issMax);
163   ECOFF_PUT_OFF (abfd, intern->cbSsOffset,    ext->h_cbSsOffset);
164   H_PUT_32      (abfd, intern->issExtMax,     ext->h_issExtMax);
165   ECOFF_PUT_OFF (abfd, intern->cbSsExtOffset, ext->h_cbSsExtOffset);
166   H_PUT_32      (abfd, intern->ifdMax,        ext->h_ifdMax);
167   ECOFF_PUT_OFF (abfd, intern->cbFdOffset,    ext->h_cbFdOffset);
168   H_PUT_32      (abfd, intern->crfd,          ext->h_crfd);
169   ECOFF_PUT_OFF (abfd, intern->cbRfdOffset,   ext->h_cbRfdOffset);
170   H_PUT_32      (abfd, intern->iextMax,       ext->h_iextMax);
171   ECOFF_PUT_OFF (abfd, intern->cbExtOffset,   ext->h_cbExtOffset);
172
173 #ifdef TEST
174   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
175     abort ();
176 #endif
177 }
178
179 /* Swap in the file descriptor record.  */
180
181 static void
182 ecoff_swap_fdr_in (bfd *abfd, void * ext_copy, FDR *intern)
183 {
184   struct fdr_ext ext[1];
185
186   *ext = *(struct fdr_ext *) ext_copy;
187
188   intern->adr           = ECOFF_GET_OFF (abfd, ext->f_adr);
189   intern->rss           = H_GET_32 (abfd, ext->f_rss);
190 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
191   if (intern->rss == (signed long) 0xffffffff)
192     intern->rss = -1;
193 #endif
194   intern->issBase       = H_GET_32 (abfd, ext->f_issBase);
195   intern->cbSs          = ECOFF_GET_OFF (abfd, ext->f_cbSs);
196   intern->isymBase      = H_GET_32 (abfd, ext->f_isymBase);
197   intern->csym          = H_GET_32 (abfd, ext->f_csym);
198   intern->ilineBase     = H_GET_32 (abfd, ext->f_ilineBase);
199   intern->cline         = H_GET_32 (abfd, ext->f_cline);
200   intern->ioptBase      = H_GET_32 (abfd, ext->f_ioptBase);
201   intern->copt          = H_GET_32 (abfd, ext->f_copt);
202 #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
203   intern->ipdFirst      = H_GET_16 (abfd, ext->f_ipdFirst);
204   intern->cpd           = H_GET_16 (abfd, ext->f_cpd);
205 #endif
206 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
207   intern->ipdFirst      = H_GET_32 (abfd, ext->f_ipdFirst);
208   intern->cpd           = H_GET_32 (abfd, ext->f_cpd);
209 #endif
210   intern->iauxBase      = H_GET_32 (abfd, ext->f_iauxBase);
211   intern->caux          = H_GET_32 (abfd, ext->f_caux);
212   intern->rfdBase       = H_GET_32 (abfd, ext->f_rfdBase);
213   intern->crfd          = H_GET_32 (abfd, ext->f_crfd);
214
215   /* Now the fun stuff...  */
216   if (bfd_header_big_endian (abfd))
217     {
218       intern->lang       = ((ext->f_bits1[0] & FDR_BITS1_LANG_BIG)
219                             >> FDR_BITS1_LANG_SH_BIG);
220       intern->fMerge     = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_BIG);
221       intern->fReadin    = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_BIG);
222       intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_BIG);
223       intern->glevel     = ((ext->f_bits2[0] & FDR_BITS2_GLEVEL_BIG)
224                             >> FDR_BITS2_GLEVEL_SH_BIG);
225     }
226   else
227     {
228       intern->lang       = ((ext->f_bits1[0] & FDR_BITS1_LANG_LITTLE)
229                             >> FDR_BITS1_LANG_SH_LITTLE);
230       intern->fMerge     = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_LITTLE);
231       intern->fReadin    = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_LITTLE);
232       intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_LITTLE);
233       intern->glevel     = ((ext->f_bits2[0] & FDR_BITS2_GLEVEL_LITTLE)
234                             >> FDR_BITS2_GLEVEL_SH_LITTLE);
235     }
236   intern->reserved = 0;
237
238   intern->cbLineOffset  = ECOFF_GET_OFF (abfd, ext->f_cbLineOffset);
239   intern->cbLine        = ECOFF_GET_OFF (abfd, ext->f_cbLine);
240
241 #ifdef TEST
242   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
243     abort ();
244 #endif
245 }
246
247 /* Swap out the file descriptor record.  */
248
249 static void
250 ecoff_swap_fdr_out (bfd *abfd, const FDR *intern_copy, void * ext_ptr)
251 {
252   struct fdr_ext *ext = (struct fdr_ext *) ext_ptr;
253   FDR intern[1];
254
255   /* Make it reasonable to do in-place.  */
256   *intern = *intern_copy;
257
258   ECOFF_PUT_OFF (abfd, intern->adr,       ext->f_adr);
259   H_PUT_32      (abfd, intern->rss,       ext->f_rss);
260   H_PUT_32      (abfd, intern->issBase,   ext->f_issBase);
261   ECOFF_PUT_OFF (abfd, intern->cbSs,      ext->f_cbSs);
262   H_PUT_32      (abfd, intern->isymBase,  ext->f_isymBase);
263   H_PUT_32      (abfd, intern->csym,      ext->f_csym);
264   H_PUT_32      (abfd, intern->ilineBase, ext->f_ilineBase);
265   H_PUT_32      (abfd, intern->cline,     ext->f_cline);
266   H_PUT_32      (abfd, intern->ioptBase,  ext->f_ioptBase);
267   H_PUT_32      (abfd, intern->copt,      ext->f_copt);
268 #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
269   H_PUT_16      (abfd, intern->ipdFirst,  ext->f_ipdFirst);
270   H_PUT_16      (abfd, intern->cpd,       ext->f_cpd);
271 #endif
272 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
273   H_PUT_32      (abfd, intern->ipdFirst,  ext->f_ipdFirst);
274   H_PUT_32      (abfd, intern->cpd,       ext->f_cpd);
275 #endif
276   H_PUT_32      (abfd, intern->iauxBase,  ext->f_iauxBase);
277   H_PUT_32      (abfd, intern->caux,      ext->f_caux);
278   H_PUT_32      (abfd, intern->rfdBase,   ext->f_rfdBase);
279   H_PUT_32      (abfd, intern->crfd,      ext->f_crfd);
280
281   /* Now the fun stuff...  */
282   if (bfd_header_big_endian (abfd))
283     {
284       ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_BIG)
285                           & FDR_BITS1_LANG_BIG)
286                          | (intern->fMerge ? FDR_BITS1_FMERGE_BIG : 0)
287                          | (intern->fReadin ? FDR_BITS1_FREADIN_BIG : 0)
288                          | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_BIG : 0));
289       ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_BIG)
290                          & FDR_BITS2_GLEVEL_BIG);
291       ext->f_bits2[1] = 0;
292       ext->f_bits2[2] = 0;
293     }
294   else
295     {
296       ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_LITTLE)
297                           & FDR_BITS1_LANG_LITTLE)
298                          | (intern->fMerge ? FDR_BITS1_FMERGE_LITTLE : 0)
299                          | (intern->fReadin ? FDR_BITS1_FREADIN_LITTLE : 0)
300                          | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_LITTLE : 0));
301       ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_LITTLE)
302                          & FDR_BITS2_GLEVEL_LITTLE);
303       ext->f_bits2[1] = 0;
304       ext->f_bits2[2] = 0;
305     }
306
307   ECOFF_PUT_OFF (abfd, intern->cbLineOffset, ext->f_cbLineOffset);
308   ECOFF_PUT_OFF (abfd, intern->cbLine, ext->f_cbLine);
309
310 #ifdef TEST
311   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
312     abort ();
313 #endif
314 }
315
316 /* Swap in the procedure descriptor record.  */
317
318 static void
319 ecoff_swap_pdr_in (bfd *abfd, void * ext_copy, PDR *intern)
320 {
321   struct pdr_ext ext[1];
322
323   *ext = *(struct pdr_ext *) ext_copy;
324
325   memset ((void *) intern, 0, sizeof (*intern));
326
327   intern->adr           = ECOFF_GET_OFF (abfd, ext->p_adr);
328   intern->isym          = H_GET_32 (abfd, ext->p_isym);
329   intern->iline         = H_GET_32 (abfd, ext->p_iline);
330   intern->regmask       = H_GET_32 (abfd, ext->p_regmask);
331   intern->regoffset     = H_GET_S32 (abfd, ext->p_regoffset);
332   intern->iopt          = H_GET_S32 (abfd, ext->p_iopt);
333   intern->fregmask      = H_GET_32 (abfd, ext->p_fregmask);
334   intern->fregoffset    = H_GET_S32 (abfd, ext->p_fregoffset);
335   intern->frameoffset   = H_GET_S32 (abfd, ext->p_frameoffset);
336   intern->framereg      = H_GET_16 (abfd, ext->p_framereg);
337   intern->pcreg         = H_GET_16 (abfd, ext->p_pcreg);
338   intern->lnLow         = H_GET_32 (abfd, ext->p_lnLow);
339   intern->lnHigh        = H_GET_32 (abfd, ext->p_lnHigh);
340   intern->cbLineOffset  = ECOFF_GET_OFF (abfd, ext->p_cbLineOffset);
341
342 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
343   if (intern->isym == (signed long) 0xffffffff)
344     intern->isym = -1;
345   if (intern->iline == (signed long) 0xffffffff)
346     intern->iline = -1;
347
348   intern->gp_prologue = H_GET_8 (abfd, ext->p_gp_prologue);
349   if (bfd_header_big_endian (abfd))
350     {
351       intern->gp_used = 0 != (ext->p_bits1[0] & PDR_BITS1_GP_USED_BIG);
352       intern->reg_frame = 0 != (ext->p_bits1[0] & PDR_BITS1_REG_FRAME_BIG);
353       intern->prof = 0 != (ext->p_bits1[0] & PDR_BITS1_PROF_BIG);
354       intern->reserved = (((ext->p_bits1[0] & PDR_BITS1_RESERVED_BIG)
355                            << PDR_BITS1_RESERVED_SH_LEFT_BIG)
356                           | ((ext->p_bits2[0] & PDR_BITS2_RESERVED_BIG)
357                              >> PDR_BITS2_RESERVED_SH_BIG));
358     }
359   else
360     {
361       intern->gp_used = 0 != (ext->p_bits1[0] & PDR_BITS1_GP_USED_LITTLE);
362       intern->reg_frame = 0 != (ext->p_bits1[0] & PDR_BITS1_REG_FRAME_LITTLE);
363       intern->prof = 0 != (ext->p_bits1[0] & PDR_BITS1_PROF_LITTLE);
364       intern->reserved = (((ext->p_bits1[0] & PDR_BITS1_RESERVED_LITTLE)
365                            >> PDR_BITS1_RESERVED_SH_LITTLE)
366                           | ((ext->p_bits2[0] & PDR_BITS2_RESERVED_LITTLE)
367                              << PDR_BITS2_RESERVED_SH_LEFT_LITTLE));
368     }
369   intern->localoff = H_GET_8 (abfd, ext->p_localoff);
370 #endif
371
372 #ifdef TEST
373   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
374     abort ();
375 #endif
376 }
377
378 /* Swap out the procedure descriptor record.  */
379
380 static void
381 ecoff_swap_pdr_out (bfd *abfd, const PDR *intern_copy, void * ext_ptr)
382 {
383   struct pdr_ext *ext = (struct pdr_ext *) ext_ptr;
384   PDR intern[1];
385
386   /* Make it reasonable to do in-place.  */
387   *intern = *intern_copy;
388
389   ECOFF_PUT_OFF (abfd, intern->adr,          ext->p_adr);
390   H_PUT_32      (abfd, intern->isym,         ext->p_isym);
391   H_PUT_32      (abfd, intern->iline,        ext->p_iline);
392   H_PUT_32      (abfd, intern->regmask,      ext->p_regmask);
393   H_PUT_32      (abfd, intern->regoffset,    ext->p_regoffset);
394   H_PUT_32      (abfd, intern->iopt,         ext->p_iopt);
395   H_PUT_32      (abfd, intern->fregmask,     ext->p_fregmask);
396   H_PUT_32      (abfd, intern->fregoffset,   ext->p_fregoffset);
397   H_PUT_32      (abfd, intern->frameoffset,  ext->p_frameoffset);
398   H_PUT_16      (abfd, intern->framereg,     ext->p_framereg);
399   H_PUT_16      (abfd, intern->pcreg,        ext->p_pcreg);
400   H_PUT_32      (abfd, intern->lnLow,        ext->p_lnLow);
401   H_PUT_32      (abfd, intern->lnHigh,       ext->p_lnHigh);
402   ECOFF_PUT_OFF (abfd, intern->cbLineOffset, ext->p_cbLineOffset);
403
404 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
405   H_PUT_8       (abfd, intern->gp_prologue,  ext->p_gp_prologue);
406
407   if (bfd_header_big_endian (abfd))
408     {
409       ext->p_bits1[0] = ((intern->gp_used ? PDR_BITS1_GP_USED_BIG : 0)
410                          | (intern->reg_frame ? PDR_BITS1_REG_FRAME_BIG : 0)
411                          | (intern->prof ? PDR_BITS1_PROF_BIG : 0)
412                          | ((intern->reserved
413                              >> PDR_BITS1_RESERVED_SH_LEFT_BIG)
414                             & PDR_BITS1_RESERVED_BIG));
415       ext->p_bits2[0] = ((intern->reserved << PDR_BITS2_RESERVED_SH_BIG)
416                          & PDR_BITS2_RESERVED_BIG);
417     }
418   else
419     {
420       ext->p_bits1[0] = ((intern->gp_used ? PDR_BITS1_GP_USED_LITTLE : 0)
421                          | (intern->reg_frame ? PDR_BITS1_REG_FRAME_LITTLE : 0)
422                          | (intern->prof ? PDR_BITS1_PROF_LITTLE : 0)
423                          | ((intern->reserved << PDR_BITS1_RESERVED_SH_LITTLE)
424                             & PDR_BITS1_RESERVED_LITTLE));
425       ext->p_bits2[0] = ((intern->reserved >>
426                           PDR_BITS2_RESERVED_SH_LEFT_LITTLE)
427                          & PDR_BITS2_RESERVED_LITTLE);
428     }
429   H_PUT_8 (abfd, intern->localoff, ext->p_localoff);
430 #endif
431
432 #ifdef TEST
433   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
434     abort ();
435 #endif
436 }
437
438 /* Swap in a symbol record.  */
439
440 static void
441 ecoff_swap_sym_in (bfd *abfd, void * ext_copy, SYMR *intern)
442 {
443   struct sym_ext ext[1];
444
445   *ext = *(struct sym_ext *) ext_copy;
446
447   intern->iss           = H_GET_32 (abfd, ext->s_iss);
448   intern->value         = ECOFF_GET_OFF (abfd, ext->s_value);
449
450 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
451   if (intern->iss == (signed long) 0xffffffff)
452     intern->iss = -1;
453 #endif
454
455   /* Now the fun stuff...  */
456   if (bfd_header_big_endian (abfd))
457     {
458       intern->st          =  (ext->s_bits1[0] & SYM_BITS1_ST_BIG)
459                                              >> SYM_BITS1_ST_SH_BIG;
460       intern->sc          = ((ext->s_bits1[0] & SYM_BITS1_SC_BIG)
461                                              << SYM_BITS1_SC_SH_LEFT_BIG)
462                           | ((ext->s_bits2[0] & SYM_BITS2_SC_BIG)
463                                              >> SYM_BITS2_SC_SH_BIG);
464       intern->reserved    = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_BIG);
465       intern->index       = ((ext->s_bits2[0] & SYM_BITS2_INDEX_BIG)
466                                              << SYM_BITS2_INDEX_SH_LEFT_BIG)
467                           | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_BIG)
468                           | (ext->s_bits4[0] << SYM_BITS4_INDEX_SH_LEFT_BIG);
469     }
470   else
471     {
472       intern->st          =  (ext->s_bits1[0] & SYM_BITS1_ST_LITTLE)
473                                              >> SYM_BITS1_ST_SH_LITTLE;
474       intern->sc          = ((ext->s_bits1[0] & SYM_BITS1_SC_LITTLE)
475                                              >> SYM_BITS1_SC_SH_LITTLE)
476                           | ((ext->s_bits2[0] & SYM_BITS2_SC_LITTLE)
477                                              << SYM_BITS2_SC_SH_LEFT_LITTLE);
478       intern->reserved    = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_LITTLE);
479       intern->index       = ((ext->s_bits2[0] & SYM_BITS2_INDEX_LITTLE)
480                                              >> SYM_BITS2_INDEX_SH_LITTLE)
481                           | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_LITTLE)
482                           | ((unsigned int) ext->s_bits4[0]
483                              << SYM_BITS4_INDEX_SH_LEFT_LITTLE);
484     }
485
486 #ifdef TEST
487   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
488     abort ();
489 #endif
490 }
491
492 /* Swap out a symbol record.  */
493
494 static void
495 ecoff_swap_sym_out (bfd *abfd, const SYMR *intern_copy, void * ext_ptr)
496 {
497   struct sym_ext *ext = (struct sym_ext *) ext_ptr;
498   SYMR intern[1];
499
500   /* Make it reasonable to do in-place.  */
501   *intern = *intern_copy;
502
503   H_PUT_32 (abfd, intern->iss, ext->s_iss);
504   ECOFF_PUT_OFF (abfd, intern->value, ext->s_value);
505
506   /* Now the fun stuff...  */
507   if (bfd_header_big_endian (abfd))
508     {
509       ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_BIG)
510                           & SYM_BITS1_ST_BIG)
511                          | ((intern->sc >> SYM_BITS1_SC_SH_LEFT_BIG)
512                             & SYM_BITS1_SC_BIG));
513       ext->s_bits2[0] = (((intern->sc << SYM_BITS2_SC_SH_BIG)
514                           & SYM_BITS2_SC_BIG)
515                          | (intern->reserved ? SYM_BITS2_RESERVED_BIG : 0)
516                          | ((intern->index >> SYM_BITS2_INDEX_SH_LEFT_BIG)
517                             & SYM_BITS2_INDEX_BIG));
518       ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_BIG) & 0xff;
519       ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_BIG) & 0xff;
520     }
521   else
522     {
523       ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_LITTLE)
524                           & SYM_BITS1_ST_LITTLE)
525                          | ((intern->sc << SYM_BITS1_SC_SH_LITTLE)
526                             & SYM_BITS1_SC_LITTLE));
527       ext->s_bits2[0] = (((intern->sc >> SYM_BITS2_SC_SH_LEFT_LITTLE)
528                           & SYM_BITS2_SC_LITTLE)
529                          | (intern->reserved ? SYM_BITS2_RESERVED_LITTLE : 0)
530                          | ((intern->index << SYM_BITS2_INDEX_SH_LITTLE)
531                             & SYM_BITS2_INDEX_LITTLE));
532       ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_LITTLE) & 0xff;
533       ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_LITTLE) & 0xff;
534     }
535
536 #ifdef TEST
537   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
538     abort ();
539 #endif
540 }
541
542 /* Swap in an external symbol record.  */
543
544 static void
545 ecoff_swap_ext_in (bfd *abfd, void * ext_copy, EXTR *intern)
546 {
547   struct ext_ext ext[1];
548
549   *ext = *(struct ext_ext *) ext_copy;
550
551   /* Now the fun stuff...  */
552   if (bfd_header_big_endian (abfd))
553     {
554       intern->jmptbl      = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_BIG);
555       intern->cobol_main  = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_BIG);
556       intern->weakext     = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_BIG);
557     }
558   else
559     {
560       intern->jmptbl      = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_LITTLE);
561       intern->cobol_main  = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_LITTLE);
562       intern->weakext     = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_LITTLE);
563     }
564   intern->reserved = 0;
565
566 #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
567   intern->ifd = H_GET_S16 (abfd, ext->es_ifd);
568 #endif
569 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
570   intern->ifd = H_GET_S32 (abfd, ext->es_ifd);
571 #endif
572
573   ecoff_swap_sym_in (abfd, &ext->es_asym, &intern->asym);
574
575 #ifdef TEST
576   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
577     abort ();
578 #endif
579 }
580
581 /* Swap out an external symbol record.  */
582
583 static void
584 ecoff_swap_ext_out (bfd *abfd, const EXTR *intern_copy, void * ext_ptr)
585 {
586   struct ext_ext *ext = (struct ext_ext *) ext_ptr;
587   EXTR intern[1];
588
589   /* Make it reasonable to do in-place.  */
590   *intern = *intern_copy;
591
592   /* Now the fun stuff...  */
593   if (bfd_header_big_endian (abfd))
594     {
595       ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_BIG : 0)
596                           | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_BIG : 0)
597                           | (intern->weakext ? EXT_BITS1_WEAKEXT_BIG : 0));
598       ext->es_bits2[0] = 0;
599 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
600       ext->es_bits2[1] = 0;
601       ext->es_bits2[2] = 0;
602 #endif
603     }
604   else
605     {
606       ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_LITTLE : 0)
607                           | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_LITTLE : 0)
608                           | (intern->weakext ? EXT_BITS1_WEAKEXT_LITTLE : 0));
609       ext->es_bits2[0] = 0;
610 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
611       ext->es_bits2[1] = 0;
612       ext->es_bits2[2] = 0;
613 #endif
614     }
615
616 #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
617   H_PUT_S16 (abfd, intern->ifd, ext->es_ifd);
618 #endif
619 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
620   H_PUT_S32 (abfd, intern->ifd, ext->es_ifd);
621 #endif
622
623   ecoff_swap_sym_out (abfd, &intern->asym, &ext->es_asym);
624
625 #ifdef TEST
626   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
627     abort ();
628 #endif
629 }
630
631 /* Swap in a relative file descriptor.  */
632
633 static void
634 ecoff_swap_rfd_in (bfd *abfd, void * ext_ptr, RFDT *intern)
635 {
636   struct rfd_ext *ext = (struct rfd_ext *) ext_ptr;
637
638   *intern = H_GET_32 (abfd, ext->rfd);
639
640 #ifdef TEST
641   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
642     abort ();
643 #endif
644 }
645
646 /* Swap out a relative file descriptor.  */
647
648 static void
649 ecoff_swap_rfd_out (bfd *abfd, const RFDT *intern, void * ext_ptr)
650 {
651   struct rfd_ext *ext = (struct rfd_ext *) ext_ptr;
652
653   H_PUT_32 (abfd, *intern, ext->rfd);
654
655 #ifdef TEST
656   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
657     abort ();
658 #endif
659 }
660
661 /* Swap in an optimization symbol.  */
662
663 static void
664 ecoff_swap_opt_in (bfd *abfd, void * ext_copy, OPTR * intern)
665 {
666   struct opt_ext ext[1];
667
668   *ext = *(struct opt_ext *) ext_copy;
669
670   if (bfd_header_big_endian (abfd))
671     {
672       intern->ot = ext->o_bits1[0];
673       intern->value = (((unsigned int) ext->o_bits2[0]
674                         << OPT_BITS2_VALUE_SH_LEFT_BIG)
675                        | ((unsigned int) ext->o_bits3[0]
676                           << OPT_BITS2_VALUE_SH_LEFT_BIG)
677                        | ((unsigned int) ext->o_bits4[0]
678                           << OPT_BITS2_VALUE_SH_LEFT_BIG));
679     }
680   else
681     {
682       intern->ot = ext->o_bits1[0];
683       intern->value = ((ext->o_bits2[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE)
684                        | (ext->o_bits3[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE)
685                        | (ext->o_bits4[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE));
686     }
687
688   _bfd_ecoff_swap_rndx_in (bfd_header_big_endian (abfd),
689                            &ext->o_rndx, &intern->rndx);
690
691   intern->offset = H_GET_32 (abfd, ext->o_offset);
692
693 #ifdef TEST
694   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
695     abort ();
696 #endif
697 }
698
699 /* Swap out an optimization symbol.  */
700
701 static void
702 ecoff_swap_opt_out (bfd *abfd, const OPTR *intern_copy, void * ext_ptr)
703 {
704   struct opt_ext *ext = (struct opt_ext *) ext_ptr;
705   OPTR intern[1];
706
707   /* Make it reasonable to do in-place.  */
708   *intern = *intern_copy;
709
710   if (bfd_header_big_endian (abfd))
711     {
712       ext->o_bits1[0] = intern->ot;
713       ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_BIG;
714       ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_BIG;
715       ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_BIG;
716     }
717   else
718     {
719       ext->o_bits1[0] = intern->ot;
720       ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_LITTLE;
721       ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_LITTLE;
722       ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_LITTLE;
723     }
724
725   _bfd_ecoff_swap_rndx_out (bfd_header_big_endian (abfd),
726                             &intern->rndx, &ext->o_rndx);
727
728   H_PUT_32 (abfd, intern->value, ext->o_offset);
729
730 #ifdef TEST
731   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
732     abort ();
733 #endif
734 }
735
736 /* Swap in a dense number.  */
737
738 static void
739 ecoff_swap_dnr_in (bfd *abfd, void * ext_copy, DNR *intern)
740 {
741   struct dnr_ext ext[1];
742
743   *ext = *(struct dnr_ext *) ext_copy;
744
745   intern->rfd = H_GET_32 (abfd, ext->d_rfd);
746   intern->index = H_GET_32 (abfd, ext->d_index);
747
748 #ifdef TEST
749   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
750     abort ();
751 #endif
752 }
753
754 /* Swap out a dense number.  */
755
756 static void
757 ecoff_swap_dnr_out (bfd *abfd, const DNR *intern_copy, void * ext_ptr)
758 {
759   struct dnr_ext *ext = (struct dnr_ext *) ext_ptr;
760   DNR intern[1];
761
762   /* Make it reasonable to do in-place.  */
763   *intern = *intern_copy;
764
765   H_PUT_32 (abfd, intern->rfd, ext->d_rfd);
766   H_PUT_32 (abfd, intern->index, ext->d_index);
767
768 #ifdef TEST
769   if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
770     abort ();
771 #endif
772 }