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