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