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