1 /* Generic ECOFF swapping routines, for BFD.
2 Copyright 1992, 1993, 1994, 1995, 1996, 2000 Free Software Foundation, Inc.
3 Written by Cygnus Support.
5 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
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.
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.
30 Before including this header file, one of ECOFF_32, ECOFF_64,
31 ECOFF_SIGNED_32 or ECOFF_SIGNED_64 must be defined. These are
32 checked when swapping information that depends upon the target
33 size. This code works for 32 bit and 64 bit ECOFF, but may need to
34 be generalized in the future.
36 Some header file which defines the external forms of these
37 structures must also be included before including this header file.
38 Currently this is either coff/mips.h or coff/alpha.h.
40 If the symbol TEST is defined when this file is compiled, a
41 comparison is made to ensure that, in fact, the output is
42 bit-for-bit the same as the input. Of course, this symbol should
43 only be defined when deliberately testing the code on a machine
44 with the proper byte sex and such. */
47 #define ecoff_get_off bfd_h_get_32
48 #define ecoff_put_off bfd_h_put_32
51 #define ecoff_get_off bfd_h_get_64
52 #define ecoff_put_off bfd_h_put_64
54 #ifdef ECOFF_SIGNED_32
55 #define ecoff_get_off bfd_h_get_signed_32
56 #define ecoff_put_off bfd_h_put_signed_32
58 #ifdef ECOFF_SIGNED_64
59 #define ecoff_get_off bfd_h_get_signed_64
60 #define ecoff_put_off bfd_h_put_signed_64
63 /* ECOFF auxiliary information swapping routines. These are the same
64 for all ECOFF targets, so they are defined in ecofflink.c. */
66 extern void _bfd_ecoff_swap_tir_in
67 PARAMS ((int, const struct tir_ext
*, TIR
*));
68 extern void _bfd_ecoff_swap_tir_out
69 PARAMS ((int, const TIR
*, struct tir_ext
*));
70 extern void _bfd_ecoff_swap_rndx_in
71 PARAMS ((int, const struct rndx_ext
*, RNDXR
*));
72 extern void _bfd_ecoff_swap_rndx_out
73 PARAMS ((int, const RNDXR
*, struct rndx_ext
*));
75 /* Prototypes for functions defined in this file. */
77 static void ecoff_swap_hdr_in
PARAMS ((bfd
*, PTR
, HDRR
*));
78 static void ecoff_swap_hdr_out
PARAMS ((bfd
*, const HDRR
*, PTR
));
79 static void ecoff_swap_fdr_in
PARAMS ((bfd
*, PTR
, FDR
*));
80 static void ecoff_swap_fdr_out
PARAMS ((bfd
*, const FDR
*, PTR
));
81 static void ecoff_swap_pdr_in
PARAMS ((bfd
*, PTR
, PDR
*));
82 static void ecoff_swap_pdr_out
PARAMS ((bfd
*, const PDR
*, PTR
));
83 static void ecoff_swap_sym_in
PARAMS ((bfd
*, PTR
, SYMR
*));
84 static void ecoff_swap_sym_out
PARAMS ((bfd
*, const SYMR
*, PTR
));
85 static void ecoff_swap_ext_in
PARAMS ((bfd
*, PTR
, EXTR
*));
86 static void ecoff_swap_ext_out
PARAMS ((bfd
*, const EXTR
*, PTR
));
87 static void ecoff_swap_rfd_in
PARAMS ((bfd
*, PTR
, RFDT
*));
88 static void ecoff_swap_rfd_out
PARAMS ((bfd
*, const RFDT
*, PTR
));
89 static void ecoff_swap_opt_in
PARAMS ((bfd
*, PTR
, OPTR
*));
90 static void ecoff_swap_opt_out
PARAMS ((bfd
*, const OPTR
*, PTR
));
91 static void ecoff_swap_dnr_in
PARAMS ((bfd
*, PTR
, DNR
*));
92 static void ecoff_swap_dnr_out
PARAMS ((bfd
*, const DNR
*, PTR
));
94 /* Swap in the symbolic header. */
97 ecoff_swap_hdr_in (abfd
, ext_copy
, intern
)
102 struct hdr_ext ext
[1];
104 *ext
= *(struct hdr_ext
*) ext_copy
;
106 intern
->magic
= bfd_h_get_signed_16 (abfd
, (bfd_byte
*)ext
->h_magic
);
107 intern
->vstamp
= bfd_h_get_signed_16 (abfd
, (bfd_byte
*)ext
->h_vstamp
);
108 intern
->ilineMax
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->h_ilineMax
);
109 intern
->cbLine
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbLine
);
110 intern
->cbLineOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbLineOffset
);
111 intern
->idnMax
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->h_idnMax
);
112 intern
->cbDnOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbDnOffset
);
113 intern
->ipdMax
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->h_ipdMax
);
114 intern
->cbPdOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbPdOffset
);
115 intern
->isymMax
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->h_isymMax
);
116 intern
->cbSymOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbSymOffset
);
117 intern
->ioptMax
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->h_ioptMax
);
118 intern
->cbOptOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbOptOffset
);
119 intern
->iauxMax
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->h_iauxMax
);
120 intern
->cbAuxOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbAuxOffset
);
121 intern
->issMax
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->h_issMax
);
122 intern
->cbSsOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbSsOffset
);
123 intern
->issExtMax
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->h_issExtMax
);
124 intern
->cbSsExtOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbSsExtOffset
);
125 intern
->ifdMax
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->h_ifdMax
);
126 intern
->cbFdOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbFdOffset
);
127 intern
->crfd
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->h_crfd
);
128 intern
->cbRfdOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbRfdOffset
);
129 intern
->iextMax
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->h_iextMax
);
130 intern
->cbExtOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->h_cbExtOffset
);
133 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
138 /* Swap out the symbolic header. */
141 ecoff_swap_hdr_out (abfd
, intern_copy
, ext_ptr
)
143 const HDRR
*intern_copy
;
146 struct hdr_ext
*ext
= (struct hdr_ext
*) ext_ptr
;
149 *intern
= *intern_copy
;
151 bfd_h_put_signed_16 (abfd
, intern
->magic
, (bfd_byte
*)ext
->h_magic
);
152 bfd_h_put_signed_16 (abfd
, intern
->vstamp
, (bfd_byte
*)ext
->h_vstamp
);
153 bfd_h_put_32 (abfd
, intern
->ilineMax
, (bfd_byte
*)ext
->h_ilineMax
);
154 ecoff_put_off (abfd
, intern
->cbLine
, (bfd_byte
*)ext
->h_cbLine
);
155 ecoff_put_off (abfd
, intern
->cbLineOffset
, (bfd_byte
*)ext
->h_cbLineOffset
);
156 bfd_h_put_32 (abfd
, intern
->idnMax
, (bfd_byte
*)ext
->h_idnMax
);
157 ecoff_put_off (abfd
, intern
->cbDnOffset
, (bfd_byte
*)ext
->h_cbDnOffset
);
158 bfd_h_put_32 (abfd
, intern
->ipdMax
, (bfd_byte
*)ext
->h_ipdMax
);
159 ecoff_put_off (abfd
, intern
->cbPdOffset
, (bfd_byte
*)ext
->h_cbPdOffset
);
160 bfd_h_put_32 (abfd
, intern
->isymMax
, (bfd_byte
*)ext
->h_isymMax
);
161 ecoff_put_off (abfd
, intern
->cbSymOffset
, (bfd_byte
*)ext
->h_cbSymOffset
);
162 bfd_h_put_32 (abfd
, intern
->ioptMax
, (bfd_byte
*)ext
->h_ioptMax
);
163 ecoff_put_off (abfd
, intern
->cbOptOffset
, (bfd_byte
*)ext
->h_cbOptOffset
);
164 bfd_h_put_32 (abfd
, intern
->iauxMax
, (bfd_byte
*)ext
->h_iauxMax
);
165 ecoff_put_off (abfd
, intern
->cbAuxOffset
, (bfd_byte
*)ext
->h_cbAuxOffset
);
166 bfd_h_put_32 (abfd
, intern
->issMax
, (bfd_byte
*)ext
->h_issMax
);
167 ecoff_put_off (abfd
, intern
->cbSsOffset
, (bfd_byte
*)ext
->h_cbSsOffset
);
168 bfd_h_put_32 (abfd
, intern
->issExtMax
, (bfd_byte
*)ext
->h_issExtMax
);
169 ecoff_put_off (abfd
, intern
->cbSsExtOffset
, (bfd_byte
*)ext
->h_cbSsExtOffset
);
170 bfd_h_put_32 (abfd
, intern
->ifdMax
, (bfd_byte
*)ext
->h_ifdMax
);
171 ecoff_put_off (abfd
, intern
->cbFdOffset
, (bfd_byte
*)ext
->h_cbFdOffset
);
172 bfd_h_put_32 (abfd
, intern
->crfd
, (bfd_byte
*)ext
->h_crfd
);
173 ecoff_put_off (abfd
, intern
->cbRfdOffset
, (bfd_byte
*)ext
->h_cbRfdOffset
);
174 bfd_h_put_32 (abfd
, intern
->iextMax
, (bfd_byte
*)ext
->h_iextMax
);
175 ecoff_put_off (abfd
, intern
->cbExtOffset
, (bfd_byte
*)ext
->h_cbExtOffset
);
178 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
183 /* Swap in the file descriptor record. */
186 ecoff_swap_fdr_in (abfd
, ext_copy
, intern
)
191 struct fdr_ext ext
[1];
193 *ext
= *(struct fdr_ext
*) ext_copy
;
195 intern
->adr
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->f_adr
);
196 intern
->rss
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_rss
);
197 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
198 if (intern
->rss
== 0xffffffff)
201 intern
->issBase
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_issBase
);
202 intern
->cbSs
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->f_cbSs
);
203 intern
->isymBase
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_isymBase
);
204 intern
->csym
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_csym
);
205 intern
->ilineBase
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_ilineBase
);
206 intern
->cline
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_cline
);
207 intern
->ioptBase
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_ioptBase
);
208 intern
->copt
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_copt
);
209 #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
210 intern
->ipdFirst
= bfd_h_get_16 (abfd
, (bfd_byte
*)ext
->f_ipdFirst
);
211 intern
->cpd
= bfd_h_get_16 (abfd
, (bfd_byte
*)ext
->f_cpd
);
213 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
214 intern
->ipdFirst
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_ipdFirst
);
215 intern
->cpd
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_cpd
);
217 intern
->iauxBase
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_iauxBase
);
218 intern
->caux
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_caux
);
219 intern
->rfdBase
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_rfdBase
);
220 intern
->crfd
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->f_crfd
);
222 /* now the fun stuff... */
223 if (bfd_header_big_endian (abfd
)) {
224 intern
->lang
= (ext
->f_bits1
[0] & FDR_BITS1_LANG_BIG
)
225 >> FDR_BITS1_LANG_SH_BIG
;
226 intern
->fMerge
= 0 != (ext
->f_bits1
[0] & FDR_BITS1_FMERGE_BIG
);
227 intern
->fReadin
= 0 != (ext
->f_bits1
[0] & FDR_BITS1_FREADIN_BIG
);
228 intern
->fBigendian
= 0 != (ext
->f_bits1
[0] & FDR_BITS1_FBIGENDIAN_BIG
);
229 intern
->glevel
= (ext
->f_bits2
[0] & FDR_BITS2_GLEVEL_BIG
)
230 >> FDR_BITS2_GLEVEL_SH_BIG
;
232 intern
->lang
= (ext
->f_bits1
[0] & FDR_BITS1_LANG_LITTLE
)
233 >> FDR_BITS1_LANG_SH_LITTLE
;
234 intern
->fMerge
= 0 != (ext
->f_bits1
[0] & FDR_BITS1_FMERGE_LITTLE
);
235 intern
->fReadin
= 0 != (ext
->f_bits1
[0] & FDR_BITS1_FREADIN_LITTLE
);
236 intern
->fBigendian
= 0 != (ext
->f_bits1
[0] & FDR_BITS1_FBIGENDIAN_LITTLE
);
237 intern
->glevel
= (ext
->f_bits2
[0] & FDR_BITS2_GLEVEL_LITTLE
)
238 >> FDR_BITS2_GLEVEL_SH_LITTLE
;
240 intern
->reserved
= 0;
242 intern
->cbLineOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->f_cbLineOffset
);
243 intern
->cbLine
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->f_cbLine
);
246 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
251 /* Swap out the file descriptor record. */
254 ecoff_swap_fdr_out (abfd
, intern_copy
, ext_ptr
)
256 const FDR
*intern_copy
;
259 struct fdr_ext
*ext
= (struct fdr_ext
*) ext_ptr
;
262 *intern
= *intern_copy
; /* Make it reasonable to do in-place. */
264 ecoff_put_off (abfd
, intern
->adr
, (bfd_byte
*)ext
->f_adr
);
265 bfd_h_put_32 (abfd
, intern
->rss
, (bfd_byte
*)ext
->f_rss
);
266 bfd_h_put_32 (abfd
, intern
->issBase
, (bfd_byte
*)ext
->f_issBase
);
267 ecoff_put_off (abfd
, intern
->cbSs
, (bfd_byte
*)ext
->f_cbSs
);
268 bfd_h_put_32 (abfd
, intern
->isymBase
, (bfd_byte
*)ext
->f_isymBase
);
269 bfd_h_put_32 (abfd
, intern
->csym
, (bfd_byte
*)ext
->f_csym
);
270 bfd_h_put_32 (abfd
, intern
->ilineBase
, (bfd_byte
*)ext
->f_ilineBase
);
271 bfd_h_put_32 (abfd
, intern
->cline
, (bfd_byte
*)ext
->f_cline
);
272 bfd_h_put_32 (abfd
, intern
->ioptBase
, (bfd_byte
*)ext
->f_ioptBase
);
273 bfd_h_put_32 (abfd
, intern
->copt
, (bfd_byte
*)ext
->f_copt
);
274 #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
275 bfd_h_put_16 (abfd
, intern
->ipdFirst
, (bfd_byte
*)ext
->f_ipdFirst
);
276 bfd_h_put_16 (abfd
, intern
->cpd
, (bfd_byte
*)ext
->f_cpd
);
278 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
279 bfd_h_put_32 (abfd
, intern
->ipdFirst
, (bfd_byte
*)ext
->f_ipdFirst
);
280 bfd_h_put_32 (abfd
, intern
->cpd
, (bfd_byte
*)ext
->f_cpd
);
282 bfd_h_put_32 (abfd
, intern
->iauxBase
, (bfd_byte
*)ext
->f_iauxBase
);
283 bfd_h_put_32 (abfd
, intern
->caux
, (bfd_byte
*)ext
->f_caux
);
284 bfd_h_put_32 (abfd
, intern
->rfdBase
, (bfd_byte
*)ext
->f_rfdBase
);
285 bfd_h_put_32 (abfd
, intern
->crfd
, (bfd_byte
*)ext
->f_crfd
);
287 /* now the fun stuff... */
288 if (bfd_header_big_endian (abfd
)) {
289 ext
->f_bits1
[0] = (((intern
->lang
<< FDR_BITS1_LANG_SH_BIG
)
290 & FDR_BITS1_LANG_BIG
)
291 | (intern
->fMerge
? FDR_BITS1_FMERGE_BIG
: 0)
292 | (intern
->fReadin
? FDR_BITS1_FREADIN_BIG
: 0)
293 | (intern
->fBigendian
? FDR_BITS1_FBIGENDIAN_BIG
: 0));
294 ext
->f_bits2
[0] = ((intern
->glevel
<< FDR_BITS2_GLEVEL_SH_BIG
)
295 & FDR_BITS2_GLEVEL_BIG
);
299 ext
->f_bits1
[0] = (((intern
->lang
<< FDR_BITS1_LANG_SH_LITTLE
)
300 & FDR_BITS1_LANG_LITTLE
)
301 | (intern
->fMerge
? FDR_BITS1_FMERGE_LITTLE
: 0)
302 | (intern
->fReadin
? FDR_BITS1_FREADIN_LITTLE
: 0)
303 | (intern
->fBigendian
? FDR_BITS1_FBIGENDIAN_LITTLE
: 0));
304 ext
->f_bits2
[0] = ((intern
->glevel
<< FDR_BITS2_GLEVEL_SH_LITTLE
)
305 & FDR_BITS2_GLEVEL_LITTLE
);
310 ecoff_put_off (abfd
, intern
->cbLineOffset
, (bfd_byte
*)ext
->f_cbLineOffset
);
311 ecoff_put_off (abfd
, intern
->cbLine
, (bfd_byte
*)ext
->f_cbLine
);
314 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
321 /* Swap in the procedure descriptor record. */
324 ecoff_swap_pdr_in (abfd
, ext_copy
, intern
)
329 struct pdr_ext ext
[1];
331 *ext
= *(struct pdr_ext
*) ext_copy
;
333 memset ((PTR
) intern
, 0, sizeof (*intern
));
335 intern
->adr
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->p_adr
);
336 intern
->isym
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_isym
);
337 intern
->iline
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_iline
);
338 intern
->regmask
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_regmask
);
339 intern
->regoffset
= bfd_h_get_signed_32 (abfd
,
340 (bfd_byte
*)ext
->p_regoffset
);
341 intern
->iopt
= bfd_h_get_signed_32 (abfd
, (bfd_byte
*)ext
->p_iopt
);
342 intern
->fregmask
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_fregmask
);
343 intern
->fregoffset
= bfd_h_get_signed_32 (abfd
,
344 (bfd_byte
*)ext
->p_fregoffset
);
345 intern
->frameoffset
= bfd_h_get_signed_32 (abfd
,
346 (bfd_byte
*)ext
->p_frameoffset
);
347 intern
->framereg
= bfd_h_get_16 (abfd
, (bfd_byte
*)ext
->p_framereg
);
348 intern
->pcreg
= bfd_h_get_16 (abfd
, (bfd_byte
*)ext
->p_pcreg
);
349 intern
->lnLow
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_lnLow
);
350 intern
->lnHigh
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_lnHigh
);
351 intern
->cbLineOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->p_cbLineOffset
);
353 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
354 intern
->gp_prologue
= bfd_h_get_8 (abfd
, (bfd_byte
*) ext
->p_gp_prologue
);
355 if (bfd_header_big_endian (abfd
))
357 intern
->gp_used
= 0 != (ext
->p_bits1
[0] & PDR_BITS1_GP_USED_BIG
);
358 intern
->reg_frame
= 0 != (ext
->p_bits1
[0] & PDR_BITS1_REG_FRAME_BIG
);
359 intern
->prof
= 0 != (ext
->p_bits1
[0] & PDR_BITS1_PROF_BIG
);
360 intern
->reserved
= (((ext
->p_bits1
[0] & PDR_BITS1_RESERVED_BIG
)
361 << PDR_BITS1_RESERVED_SH_LEFT_BIG
)
362 | ((ext
->p_bits2
[0] & PDR_BITS2_RESERVED_BIG
)
363 >> PDR_BITS2_RESERVED_SH_BIG
));
367 intern
->gp_used
= 0 != (ext
->p_bits1
[0] & PDR_BITS1_GP_USED_LITTLE
);
368 intern
->reg_frame
= 0 != (ext
->p_bits1
[0] & PDR_BITS1_REG_FRAME_LITTLE
);
369 intern
->prof
= 0 != (ext
->p_bits1
[0] & PDR_BITS1_PROF_LITTLE
);
370 intern
->reserved
= (((ext
->p_bits1
[0] & PDR_BITS1_RESERVED_LITTLE
)
371 >> PDR_BITS1_RESERVED_SH_LITTLE
)
372 | ((ext
->p_bits2
[0] & PDR_BITS2_RESERVED_LITTLE
)
373 << PDR_BITS2_RESERVED_SH_LEFT_LITTLE
));
375 intern
->localoff
= bfd_h_get_8 (abfd
, (bfd_byte
*) ext
->p_localoff
);
379 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
384 /* Swap out the procedure descriptor record. */
387 ecoff_swap_pdr_out (abfd
, intern_copy
, ext_ptr
)
389 const PDR
*intern_copy
;
392 struct pdr_ext
*ext
= (struct pdr_ext
*) ext_ptr
;
395 *intern
= *intern_copy
; /* Make it reasonable to do in-place. */
397 ecoff_put_off (abfd
, intern
->adr
, (bfd_byte
*)ext
->p_adr
);
398 bfd_h_put_32 (abfd
, intern
->isym
, (bfd_byte
*)ext
->p_isym
);
399 bfd_h_put_32 (abfd
, intern
->iline
, (bfd_byte
*)ext
->p_iline
);
400 bfd_h_put_32 (abfd
, intern
->regmask
, (bfd_byte
*)ext
->p_regmask
);
401 bfd_h_put_32 (abfd
, intern
->regoffset
, (bfd_byte
*)ext
->p_regoffset
);
402 bfd_h_put_32 (abfd
, intern
->iopt
, (bfd_byte
*)ext
->p_iopt
);
403 bfd_h_put_32 (abfd
, intern
->fregmask
, (bfd_byte
*)ext
->p_fregmask
);
404 bfd_h_put_32 (abfd
, intern
->fregoffset
, (bfd_byte
*)ext
->p_fregoffset
);
405 bfd_h_put_32 (abfd
, intern
->frameoffset
, (bfd_byte
*)ext
->p_frameoffset
);
406 bfd_h_put_16 (abfd
, intern
->framereg
, (bfd_byte
*)ext
->p_framereg
);
407 bfd_h_put_16 (abfd
, intern
->pcreg
, (bfd_byte
*)ext
->p_pcreg
);
408 bfd_h_put_32 (abfd
, intern
->lnLow
, (bfd_byte
*)ext
->p_lnLow
);
409 bfd_h_put_32 (abfd
, intern
->lnHigh
, (bfd_byte
*)ext
->p_lnHigh
);
410 ecoff_put_off (abfd
, intern
->cbLineOffset
, (bfd_byte
*)ext
->p_cbLineOffset
);
412 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
413 bfd_h_put_8 (abfd
, intern
->gp_prologue
, (bfd_byte
*) ext
->p_gp_prologue
);
414 if (bfd_header_big_endian (abfd
))
416 ext
->p_bits1
[0] = ((intern
->gp_used
? PDR_BITS1_GP_USED_BIG
: 0)
417 | (intern
->reg_frame
? PDR_BITS1_REG_FRAME_BIG
: 0)
418 | (intern
->prof
? PDR_BITS1_PROF_BIG
: 0)
420 >> PDR_BITS1_RESERVED_SH_LEFT_BIG
)
421 & PDR_BITS1_RESERVED_BIG
));
422 ext
->p_bits2
[0] = ((intern
->reserved
<< PDR_BITS2_RESERVED_SH_BIG
)
423 & PDR_BITS2_RESERVED_BIG
);
427 ext
->p_bits1
[0] = ((intern
->gp_used
? PDR_BITS1_GP_USED_LITTLE
: 0)
428 | (intern
->reg_frame
? PDR_BITS1_REG_FRAME_LITTLE
: 0)
429 | (intern
->prof
? PDR_BITS1_PROF_LITTLE
: 0)
430 | ((intern
->reserved
<< PDR_BITS1_RESERVED_SH_LITTLE
)
431 & PDR_BITS1_RESERVED_LITTLE
));
432 ext
->p_bits2
[0] = ((intern
->reserved
>>
433 PDR_BITS2_RESERVED_SH_LEFT_LITTLE
)
434 & PDR_BITS2_RESERVED_LITTLE
);
436 bfd_h_put_8 (abfd
, intern
->localoff
, (bfd_byte
*) ext
->p_localoff
);
440 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
446 /* Same routines, but with ECOFF_64 code removed, so ^&%$#&! MPW C doesn't
447 corrupt itself and then freak out. */
448 /* Swap in the procedure descriptor record. */
451 ecoff_swap_pdr_in (abfd
, ext_copy
, intern
)
456 struct pdr_ext ext
[1];
458 *ext
= *(struct pdr_ext
*) ext_copy
;
460 intern
->adr
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->p_adr
);
461 intern
->isym
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_isym
);
462 intern
->iline
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_iline
);
463 intern
->regmask
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_regmask
);
464 intern
->regoffset
= bfd_h_get_signed_32 (abfd
,
465 (bfd_byte
*)ext
->p_regoffset
);
466 intern
->iopt
= bfd_h_get_signed_32 (abfd
, (bfd_byte
*)ext
->p_iopt
);
467 intern
->fregmask
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_fregmask
);
468 intern
->fregoffset
= bfd_h_get_signed_32 (abfd
,
469 (bfd_byte
*)ext
->p_fregoffset
);
470 intern
->frameoffset
= bfd_h_get_signed_32 (abfd
,
471 (bfd_byte
*)ext
->p_frameoffset
);
472 intern
->framereg
= bfd_h_get_16 (abfd
, (bfd_byte
*)ext
->p_framereg
);
473 intern
->pcreg
= bfd_h_get_16 (abfd
, (bfd_byte
*)ext
->p_pcreg
);
474 intern
->lnLow
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_lnLow
);
475 intern
->lnHigh
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->p_lnHigh
);
476 intern
->cbLineOffset
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->p_cbLineOffset
);
479 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
484 /* Swap out the procedure descriptor record. */
487 ecoff_swap_pdr_out (abfd
, intern_copy
, ext_ptr
)
489 const PDR
*intern_copy
;
492 struct pdr_ext
*ext
= (struct pdr_ext
*) ext_ptr
;
495 *intern
= *intern_copy
; /* Make it reasonable to do in-place. */
497 ecoff_put_off (abfd
, intern
->adr
, (bfd_byte
*)ext
->p_adr
);
498 bfd_h_put_32 (abfd
, intern
->isym
, (bfd_byte
*)ext
->p_isym
);
499 bfd_h_put_32 (abfd
, intern
->iline
, (bfd_byte
*)ext
->p_iline
);
500 bfd_h_put_32 (abfd
, intern
->regmask
, (bfd_byte
*)ext
->p_regmask
);
501 bfd_h_put_32 (abfd
, intern
->regoffset
, (bfd_byte
*)ext
->p_regoffset
);
502 bfd_h_put_32 (abfd
, intern
->iopt
, (bfd_byte
*)ext
->p_iopt
);
503 bfd_h_put_32 (abfd
, intern
->fregmask
, (bfd_byte
*)ext
->p_fregmask
);
504 bfd_h_put_32 (abfd
, intern
->fregoffset
, (bfd_byte
*)ext
->p_fregoffset
);
505 bfd_h_put_32 (abfd
, intern
->frameoffset
, (bfd_byte
*)ext
->p_frameoffset
);
506 bfd_h_put_16 (abfd
, intern
->framereg
, (bfd_byte
*)ext
->p_framereg
);
507 bfd_h_put_16 (abfd
, intern
->pcreg
, (bfd_byte
*)ext
->p_pcreg
);
508 bfd_h_put_32 (abfd
, intern
->lnLow
, (bfd_byte
*)ext
->p_lnLow
);
509 bfd_h_put_32 (abfd
, intern
->lnHigh
, (bfd_byte
*)ext
->p_lnHigh
);
510 ecoff_put_off (abfd
, intern
->cbLineOffset
, (bfd_byte
*)ext
->p_cbLineOffset
);
513 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
519 /* Swap in a symbol record. */
522 ecoff_swap_sym_in (abfd
, ext_copy
, intern
)
527 struct sym_ext ext
[1];
529 *ext
= *(struct sym_ext
*) ext_copy
;
531 intern
->iss
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->s_iss
);
532 intern
->value
= ecoff_get_off (abfd
, (bfd_byte
*)ext
->s_value
);
534 /* now the fun stuff... */
535 if (bfd_header_big_endian (abfd
)) {
536 intern
->st
= (ext
->s_bits1
[0] & SYM_BITS1_ST_BIG
)
537 >> SYM_BITS1_ST_SH_BIG
;
538 intern
->sc
= ((ext
->s_bits1
[0] & SYM_BITS1_SC_BIG
)
539 << SYM_BITS1_SC_SH_LEFT_BIG
)
540 | ((ext
->s_bits2
[0] & SYM_BITS2_SC_BIG
)
541 >> SYM_BITS2_SC_SH_BIG
);
542 intern
->reserved
= 0 != (ext
->s_bits2
[0] & SYM_BITS2_RESERVED_BIG
);
543 intern
->index
= ((ext
->s_bits2
[0] & SYM_BITS2_INDEX_BIG
)
544 << SYM_BITS2_INDEX_SH_LEFT_BIG
)
545 | (ext
->s_bits3
[0] << SYM_BITS3_INDEX_SH_LEFT_BIG
)
546 | (ext
->s_bits4
[0] << SYM_BITS4_INDEX_SH_LEFT_BIG
);
548 intern
->st
= (ext
->s_bits1
[0] & SYM_BITS1_ST_LITTLE
)
549 >> SYM_BITS1_ST_SH_LITTLE
;
550 intern
->sc
= ((ext
->s_bits1
[0] & SYM_BITS1_SC_LITTLE
)
551 >> SYM_BITS1_SC_SH_LITTLE
)
552 | ((ext
->s_bits2
[0] & SYM_BITS2_SC_LITTLE
)
553 << SYM_BITS2_SC_SH_LEFT_LITTLE
);
554 intern
->reserved
= 0 != (ext
->s_bits2
[0] & SYM_BITS2_RESERVED_LITTLE
);
555 intern
->index
= ((ext
->s_bits2
[0] & SYM_BITS2_INDEX_LITTLE
)
556 >> SYM_BITS2_INDEX_SH_LITTLE
)
557 | (ext
->s_bits3
[0] << SYM_BITS3_INDEX_SH_LEFT_LITTLE
)
558 | ((unsigned int) ext
->s_bits4
[0]
559 << SYM_BITS4_INDEX_SH_LEFT_LITTLE
);
563 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
568 /* Swap out a symbol record. */
571 ecoff_swap_sym_out (abfd
, intern_copy
, ext_ptr
)
573 const SYMR
*intern_copy
;
576 struct sym_ext
*ext
= (struct sym_ext
*) ext_ptr
;
579 *intern
= *intern_copy
; /* Make it reasonable to do in-place. */
581 bfd_h_put_32 (abfd
, intern
->iss
, (bfd_byte
*)ext
->s_iss
);
582 ecoff_put_off (abfd
, intern
->value
, (bfd_byte
*)ext
->s_value
);
584 /* now the fun stuff... */
585 if (bfd_header_big_endian (abfd
)) {
586 ext
->s_bits1
[0] = (((intern
->st
<< SYM_BITS1_ST_SH_BIG
)
588 | ((intern
->sc
>> SYM_BITS1_SC_SH_LEFT_BIG
)
589 & SYM_BITS1_SC_BIG
));
590 ext
->s_bits2
[0] = (((intern
->sc
<< SYM_BITS2_SC_SH_BIG
)
592 | (intern
->reserved
? SYM_BITS2_RESERVED_BIG
: 0)
593 | ((intern
->index
>> SYM_BITS2_INDEX_SH_LEFT_BIG
)
594 & SYM_BITS2_INDEX_BIG
));
595 ext
->s_bits3
[0] = (intern
->index
>> SYM_BITS3_INDEX_SH_LEFT_BIG
) & 0xff;
596 ext
->s_bits4
[0] = (intern
->index
>> SYM_BITS4_INDEX_SH_LEFT_BIG
) & 0xff;
598 ext
->s_bits1
[0] = (((intern
->st
<< SYM_BITS1_ST_SH_LITTLE
)
599 & SYM_BITS1_ST_LITTLE
)
600 | ((intern
->sc
<< SYM_BITS1_SC_SH_LITTLE
)
601 & SYM_BITS1_SC_LITTLE
));
602 ext
->s_bits2
[0] = (((intern
->sc
>> SYM_BITS2_SC_SH_LEFT_LITTLE
)
603 & SYM_BITS2_SC_LITTLE
)
604 | (intern
->reserved
? SYM_BITS2_RESERVED_LITTLE
: 0)
605 | ((intern
->index
<< SYM_BITS2_INDEX_SH_LITTLE
)
606 & SYM_BITS2_INDEX_LITTLE
));
607 ext
->s_bits3
[0] = (intern
->index
>> SYM_BITS3_INDEX_SH_LEFT_LITTLE
) & 0xff;
608 ext
->s_bits4
[0] = (intern
->index
>> SYM_BITS4_INDEX_SH_LEFT_LITTLE
) & 0xff;
612 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
617 /* Swap in an external symbol record. */
620 ecoff_swap_ext_in (abfd
, ext_copy
, intern
)
625 struct ext_ext ext
[1];
627 *ext
= *(struct ext_ext
*) ext_copy
;
629 /* now the fun stuff... */
630 if (bfd_header_big_endian (abfd
)) {
631 intern
->jmptbl
= 0 != (ext
->es_bits1
[0] & EXT_BITS1_JMPTBL_BIG
);
632 intern
->cobol_main
= 0 != (ext
->es_bits1
[0] & EXT_BITS1_COBOL_MAIN_BIG
);
633 intern
->weakext
= 0 != (ext
->es_bits1
[0] & EXT_BITS1_WEAKEXT_BIG
);
635 intern
->jmptbl
= 0 != (ext
->es_bits1
[0] & EXT_BITS1_JMPTBL_LITTLE
);
636 intern
->cobol_main
= 0 != (ext
->es_bits1
[0] & EXT_BITS1_COBOL_MAIN_LITTLE
);
637 intern
->weakext
= 0 != (ext
->es_bits1
[0] & EXT_BITS1_WEAKEXT_LITTLE
);
639 intern
->reserved
= 0;
641 #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
642 intern
->ifd
= bfd_h_get_signed_16 (abfd
, (bfd_byte
*)ext
->es_ifd
);
644 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
645 intern
->ifd
= bfd_h_get_signed_32 (abfd
, (bfd_byte
*)ext
->es_ifd
);
648 ecoff_swap_sym_in (abfd
, &ext
->es_asym
, &intern
->asym
);
651 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
656 /* Swap out an external symbol record. */
659 ecoff_swap_ext_out (abfd
, intern_copy
, ext_ptr
)
661 const EXTR
*intern_copy
;
664 struct ext_ext
*ext
= (struct ext_ext
*) ext_ptr
;
667 *intern
= *intern_copy
; /* Make it reasonable to do in-place. */
669 /* now the fun stuff... */
670 if (bfd_header_big_endian (abfd
)) {
671 ext
->es_bits1
[0] = ((intern
->jmptbl
? EXT_BITS1_JMPTBL_BIG
: 0)
672 | (intern
->cobol_main
? EXT_BITS1_COBOL_MAIN_BIG
: 0)
673 | (intern
->weakext
? EXT_BITS1_WEAKEXT_BIG
: 0));
674 ext
->es_bits2
[0] = 0;
675 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
676 ext
->es_bits2
[1] = 0;
677 ext
->es_bits2
[2] = 0;
680 ext
->es_bits1
[0] = ((intern
->jmptbl
? EXT_BITS1_JMPTBL_LITTLE
: 0)
681 | (intern
->cobol_main
? EXT_BITS1_COBOL_MAIN_LITTLE
: 0)
682 | (intern
->weakext
? EXT_BITS1_WEAKEXT_LITTLE
: 0));
683 ext
->es_bits2
[0] = 0;
684 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
685 ext
->es_bits2
[1] = 0;
686 ext
->es_bits2
[2] = 0;
690 #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
691 bfd_h_put_signed_16 (abfd
, intern
->ifd
, (bfd_byte
*)ext
->es_ifd
);
693 #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
694 bfd_h_put_signed_32 (abfd
, intern
->ifd
, (bfd_byte
*)ext
->es_ifd
);
697 ecoff_swap_sym_out (abfd
, &intern
->asym
, &ext
->es_asym
);
700 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
705 /* Swap in a relative file descriptor. */
708 ecoff_swap_rfd_in (abfd
, ext_ptr
, intern
)
713 struct rfd_ext
*ext
= (struct rfd_ext
*) ext_ptr
;
715 *intern
= bfd_h_get_32 (abfd
, (bfd_byte
*)ext
->rfd
);
718 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
723 /* Swap out a relative file descriptor. */
726 ecoff_swap_rfd_out (abfd
, intern
, ext_ptr
)
731 struct rfd_ext
*ext
= (struct rfd_ext
*) ext_ptr
;
733 bfd_h_put_32 (abfd
, *intern
, (bfd_byte
*)ext
->rfd
);
736 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
741 /* Swap in an optimization symbol. */
744 ecoff_swap_opt_in (abfd
, ext_copy
, intern
)
749 struct opt_ext ext
[1];
751 *ext
= *(struct opt_ext
*) ext_copy
;
753 if (bfd_header_big_endian (abfd
))
755 intern
->ot
= ext
->o_bits1
[0];
756 intern
->value
= (((unsigned int) ext
->o_bits2
[0]
757 << OPT_BITS2_VALUE_SH_LEFT_BIG
)
758 | ((unsigned int) ext
->o_bits3
[0]
759 << OPT_BITS2_VALUE_SH_LEFT_BIG
)
760 | ((unsigned int) ext
->o_bits4
[0]
761 << OPT_BITS2_VALUE_SH_LEFT_BIG
));
765 intern
->ot
= ext
->o_bits1
[0];
766 intern
->value
= ((ext
->o_bits2
[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE
)
767 | (ext
->o_bits3
[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE
)
768 | (ext
->o_bits4
[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE
));
771 _bfd_ecoff_swap_rndx_in (bfd_header_big_endian (abfd
),
772 &ext
->o_rndx
, &intern
->rndx
);
774 intern
->offset
= bfd_h_get_32 (abfd
, (bfd_byte
*) ext
->o_offset
);
777 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
782 /* Swap out an optimization symbol. */
785 ecoff_swap_opt_out (abfd
, intern_copy
, ext_ptr
)
787 const OPTR
*intern_copy
;
790 struct opt_ext
*ext
= (struct opt_ext
*) ext_ptr
;
793 *intern
= *intern_copy
; /* Make it reasonable to do in-place. */
795 if (bfd_header_big_endian (abfd
))
797 ext
->o_bits1
[0] = intern
->ot
;
798 ext
->o_bits2
[0] = intern
->value
>> OPT_BITS2_VALUE_SH_LEFT_BIG
;
799 ext
->o_bits3
[0] = intern
->value
>> OPT_BITS3_VALUE_SH_LEFT_BIG
;
800 ext
->o_bits4
[0] = intern
->value
>> OPT_BITS4_VALUE_SH_LEFT_BIG
;
804 ext
->o_bits1
[0] = intern
->ot
;
805 ext
->o_bits2
[0] = intern
->value
>> OPT_BITS2_VALUE_SH_LEFT_LITTLE
;
806 ext
->o_bits3
[0] = intern
->value
>> OPT_BITS3_VALUE_SH_LEFT_LITTLE
;
807 ext
->o_bits4
[0] = intern
->value
>> OPT_BITS4_VALUE_SH_LEFT_LITTLE
;
810 _bfd_ecoff_swap_rndx_out (bfd_header_big_endian (abfd
),
811 &intern
->rndx
, &ext
->o_rndx
);
813 bfd_h_put_32 (abfd
, intern
->value
, (bfd_byte
*) ext
->o_offset
);
816 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
821 /* Swap in a dense number. */
824 ecoff_swap_dnr_in (abfd
, ext_copy
, intern
)
829 struct dnr_ext ext
[1];
831 *ext
= *(struct dnr_ext
*) ext_copy
;
833 intern
->rfd
= bfd_h_get_32 (abfd
, (bfd_byte
*) ext
->d_rfd
);
834 intern
->index
= bfd_h_get_32 (abfd
, (bfd_byte
*) ext
->d_index
);
837 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)
842 /* Swap out a dense number. */
845 ecoff_swap_dnr_out (abfd
, intern_copy
, ext_ptr
)
847 const DNR
*intern_copy
;
850 struct dnr_ext
*ext
= (struct dnr_ext
*) ext_ptr
;
853 *intern
= *intern_copy
; /* Make it reasonable to do in-place. */
855 bfd_h_put_32 (abfd
, intern
->rfd
, (bfd_byte
*) ext
->d_rfd
);
856 bfd_h_put_32 (abfd
, intern
->index
, (bfd_byte
*) ext
->d_index
);
859 if (memcmp ((char *)ext
, (char *)intern
, sizeof (*intern
)) != 0)