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