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