* bfd-in2.h: Regenerate.
[deliverable/binutils-gdb.git] / bfd / ecoffswap.h
CommitLineData
252b5132 1/* Generic ECOFF swapping routines, for BFD.
1c59ba3f 2 Copyright 1992, 1993, 1994, 1995, 1996, 2000, 2001, 2002
7898deda 3 Free Software Foundation, Inc.
252b5132
RH
4 Written by Cygnus Support.
5
1c59ba3f 6 This file is part of BFD, the Binary File Descriptor library.
252b5132 7
1c59ba3f
NC
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.
252b5132 12
1c59ba3f
NC
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.
252b5132 17
1c59ba3f
NC
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. */
252b5132
RH
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
23e2c83b
AC
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.
252b5132
RH
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
dc810e39
AM
48#define ECOFF_GET_OFF H_GET_32
49#define ECOFF_PUT_OFF H_PUT_32
252b5132
RH
50#endif
51#ifdef ECOFF_64
dc810e39
AM
52#define ECOFF_GET_OFF H_GET_64
53#define ECOFF_PUT_OFF H_PUT_64
252b5132 54#endif
23e2c83b 55#ifdef ECOFF_SIGNED_32
dc810e39
AM
56#define ECOFF_GET_OFF H_GET_S32
57#define ECOFF_PUT_OFF H_PUT_S32
23e2c83b
AC
58#endif
59#ifdef ECOFF_SIGNED_64
dc810e39
AM
60#define ECOFF_GET_OFF H_GET_S64
61#define ECOFF_PUT_OFF H_PUT_S64
23e2c83b 62#endif
252b5132
RH
63
64/* ECOFF auxiliary information swapping routines. These are the same
65 for all ECOFF targets, so they are defined in ecofflink.c. */
66
67extern void _bfd_ecoff_swap_tir_in
68 PARAMS ((int, const struct tir_ext *, TIR *));
69extern void _bfd_ecoff_swap_tir_out
70 PARAMS ((int, const TIR *, struct tir_ext *));
71extern void _bfd_ecoff_swap_rndx_in
72 PARAMS ((int, const struct rndx_ext *, RNDXR *));
73extern void _bfd_ecoff_swap_rndx_out
74 PARAMS ((int, const RNDXR *, struct rndx_ext *));
75
76/* Prototypes for functions defined in this file. */
77
78static void ecoff_swap_hdr_in PARAMS ((bfd *, PTR, HDRR *));
79static void ecoff_swap_hdr_out PARAMS ((bfd *, const HDRR *, PTR));
80static void ecoff_swap_fdr_in PARAMS ((bfd *, PTR, FDR *));
81static void ecoff_swap_fdr_out PARAMS ((bfd *, const FDR *, PTR));
82static void ecoff_swap_pdr_in PARAMS ((bfd *, PTR, PDR *));
83static void ecoff_swap_pdr_out PARAMS ((bfd *, const PDR *, PTR));
84static void ecoff_swap_sym_in PARAMS ((bfd *, PTR, SYMR *));
85static void ecoff_swap_sym_out PARAMS ((bfd *, const SYMR *, PTR));
86static void ecoff_swap_ext_in PARAMS ((bfd *, PTR, EXTR *));
87static void ecoff_swap_ext_out PARAMS ((bfd *, const EXTR *, PTR));
88static void ecoff_swap_rfd_in PARAMS ((bfd *, PTR, RFDT *));
89static void ecoff_swap_rfd_out PARAMS ((bfd *, const RFDT *, PTR));
90static void ecoff_swap_opt_in PARAMS ((bfd *, PTR, OPTR *));
91static void ecoff_swap_opt_out PARAMS ((bfd *, const OPTR *, PTR));
92static void ecoff_swap_dnr_in PARAMS ((bfd *, PTR, DNR *));
93static void ecoff_swap_dnr_out PARAMS ((bfd *, const DNR *, PTR));
94
95/* Swap in the symbolic header. */
96
97static void
98ecoff_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
dc810e39
AM
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);
252b5132
RH
132
133#ifdef TEST
134 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 135 abort ();
252b5132
RH
136#endif
137}
138
139/* Swap out the symbolic header. */
140
141static void
142ecoff_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
dc810e39
AM
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);
252b5132
RH
177
178#ifdef TEST
dc810e39 179 if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
3e932841 180 abort ();
252b5132
RH
181#endif
182}
183
184/* Swap in the file descriptor record. */
185
186static void
187ecoff_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;
3e932841 195
dc810e39
AM
196 intern->adr = ECOFF_GET_OFF (abfd, ext->f_adr);
197 intern->rss = H_GET_32 (abfd, ext->f_rss);
23e2c83b 198#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
062e2358 199 if (intern->rss == (signed long) 0xffffffff)
252b5132
RH
200 intern->rss = -1;
201#endif
dc810e39
AM
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);
23e2c83b 210#if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
dc810e39
AM
211 intern->ipdFirst = H_GET_16 (abfd, ext->f_ipdFirst);
212 intern->cpd = H_GET_16 (abfd, ext->f_cpd);
252b5132 213#endif
23e2c83b 214#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
dc810e39
AM
215 intern->ipdFirst = H_GET_32 (abfd, ext->f_ipdFirst);
216 intern->cpd = H_GET_32 (abfd, ext->f_cpd);
252b5132 217#endif
dc810e39
AM
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);
252b5132 222
1c59ba3f 223 /* Now the fun stuff... */
dc810e39
AM
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 }
252b5132
RH
244 intern->reserved = 0;
245
dc810e39
AM
246 intern->cbLineOffset = ECOFF_GET_OFF (abfd, ext->f_cbLineOffset);
247 intern->cbLine = ECOFF_GET_OFF (abfd, ext->f_cbLine);
252b5132
RH
248
249#ifdef TEST
250 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 251 abort ();
252b5132
RH
252#endif
253}
254
255/* Swap out the file descriptor record. */
256
257static void
258ecoff_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
1c59ba3f
NC
266 /* Make it reasonable to do in-place. */
267 *intern = *intern_copy;
3e932841 268
dc810e39
AM
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);
23e2c83b 279#if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
dc810e39
AM
280 H_PUT_16 (abfd, intern->ipdFirst, ext->f_ipdFirst);
281 H_PUT_16 (abfd, intern->cpd, ext->f_cpd);
252b5132 282#endif
23e2c83b 283#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
dc810e39
AM
284 H_PUT_32 (abfd, intern->ipdFirst, ext->f_ipdFirst);
285 H_PUT_32 (abfd, intern->cpd, ext->f_cpd);
252b5132 286#endif
dc810e39
AM
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);
252b5132 291
1c59ba3f 292 /* Now the fun stuff... */
dc810e39
AM
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 }
252b5132 317
dc810e39
AM
318 ECOFF_PUT_OFF (abfd, intern->cbLineOffset, ext->f_cbLineOffset);
319 ECOFF_PUT_OFF (abfd, intern->cbLine, ext->f_cbLine);
252b5132
RH
320
321#ifdef TEST
322 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 323 abort ();
252b5132
RH
324#endif
325}
326
327#ifndef MPW_C
328
329/* Swap in the procedure descriptor record. */
330
331static void
332ecoff_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
dc810e39
AM
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);
252b5132 357
23e2c83b 358#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
1c59ba3f
NC
359 if (intern->isym == (signed long) 0xffffffff)
360 intern->isym = -1;
361 if (intern->iline == (signed long) 0xffffffff)
362 intern->iline = -1;
363
dc810e39 364 intern->gp_prologue = H_GET_8 (abfd, ext->p_gp_prologue);
252b5132
RH
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 }
dc810e39 385 intern->localoff = H_GET_8 (abfd, ext->p_localoff);
3e932841 386#endif
252b5132
RH
387
388#ifdef TEST
389 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 390 abort ();
252b5132
RH
391#endif
392}
393
394/* Swap out the procedure descriptor record. */
395
396static void
397ecoff_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
1c59ba3f
NC
405 /* Make it reasonable to do in-place. */
406 *intern = *intern_copy;
3e932841 407
dc810e39
AM
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);
252b5132 422
23e2c83b 423#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
dc810e39
AM
424 H_PUT_8 (abfd, intern->gp_prologue, ext->p_gp_prologue);
425
252b5132
RH
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 }
dc810e39 448 H_PUT_8 (abfd, intern->localoff, ext->p_localoff);
3e932841 449#endif
252b5132
RH
450
451#ifdef TEST
452 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 453 abort ();
252b5132
RH
454#endif
455}
456
457#else /* MPW_C */
458/* Same routines, but with ECOFF_64 code removed, so ^&%$#&! MPW C doesn't
3e932841 459 corrupt itself and then freak out. */
252b5132
RH
460/* Swap in the procedure descriptor record. */
461
462static void
463ecoff_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;
3e932841 471
dc810e39
AM
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);
252b5132
RH
486
487#ifdef TEST
488 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 489 abort ();
252b5132
RH
490#endif
491}
492
493/* Swap out the procedure descriptor record. */
494
495static void
496ecoff_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
1c59ba3f
NC
504 /* Make it reasonable to do in-place. */
505 *intern = *intern_copy;
3e932841 506
dc810e39
AM
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);
252b5132
RH
521
522#ifdef TEST
523 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 524 abort ();
252b5132
RH
525#endif
526}
527#endif /* MPW_C */
528
529/* Swap in a symbol record. */
530
531static void
532ecoff_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;
3e932841 540
dc810e39
AM
541 intern->iss = H_GET_32 (abfd, ext->s_iss);
542 intern->value = ECOFF_GET_OFF (abfd, ext->s_value);
252b5132 543
1c59ba3f
NC
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 }
252b5132
RH
579
580#ifdef TEST
581 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 582 abort ();
252b5132
RH
583#endif
584}
585
586/* Swap out a symbol record. */
587
588static void
589ecoff_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
1c59ba3f
NC
597 /* Make it reasonable to do in-place. */
598 *intern = *intern_copy;
3e932841 599
dc810e39
AM
600 H_PUT_32 (abfd, intern->iss, ext->s_iss);
601 ECOFF_PUT_OFF (abfd, intern->value, ext->s_value);
252b5132 602
1c59ba3f
NC
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 }
252b5132
RH
632
633#ifdef TEST
634 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 635 abort ();
252b5132
RH
636#endif
637}
638
639/* Swap in an external symbol record. */
640
641static void
642ecoff_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;
3e932841 650
1c59ba3f
NC
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 }
252b5132
RH
664 intern->reserved = 0;
665
23e2c83b 666#if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
1c59ba3f 667 intern->ifd = H_GET_S16 (abfd, ext->es_ifd);
252b5132 668#endif
23e2c83b 669#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
1c59ba3f 670 intern->ifd = H_GET_S32 (abfd, ext->es_ifd);
252b5132
RH
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)
3e932841 677 abort ();
252b5132
RH
678#endif
679}
680
681/* Swap out an external symbol record. */
682
683static void
684ecoff_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
1c59ba3f
NC
692 /* Make it reasonable to do in-place. */
693 *intern = *intern_copy;
3e932841 694
1c59ba3f
NC
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;
23e2c83b 702#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
1c59ba3f
NC
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;
23e2c83b 713#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
1c59ba3f
NC
714 ext->es_bits2[1] = 0;
715 ext->es_bits2[2] = 0;
252b5132 716#endif
1c59ba3f 717 }
252b5132 718
23e2c83b 719#if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
dc810e39 720 H_PUT_S16 (abfd, intern->ifd, ext->es_ifd);
252b5132 721#endif
23e2c83b 722#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
dc810e39 723 H_PUT_S32 (abfd, intern->ifd, ext->es_ifd);
252b5132
RH
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)
3e932841 730 abort ();
252b5132
RH
731#endif
732}
733
734/* Swap in a relative file descriptor. */
735
736static void
737ecoff_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
dc810e39 744 *intern = H_GET_32 (abfd, ext->rfd);
252b5132
RH
745
746#ifdef TEST
747 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 748 abort ();
252b5132
RH
749#endif
750}
751
752/* Swap out a relative file descriptor. */
753
754static void
755ecoff_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
dc810e39 762 H_PUT_32 (abfd, *intern, ext->rfd);
252b5132
RH
763
764#ifdef TEST
765 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 766 abort ();
252b5132
RH
767#endif
768}
769
770/* Swap in an optimization symbol. */
771
772static void
773ecoff_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
dc810e39 803 intern->offset = H_GET_32 (abfd, ext->o_offset);
252b5132
RH
804
805#ifdef TEST
806 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 807 abort ();
252b5132
RH
808#endif
809}
810
811/* Swap out an optimization symbol. */
812
813static void
814ecoff_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
1c59ba3f
NC
822 /* Make it reasonable to do in-place. */
823 *intern = *intern_copy;
252b5132
RH
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
dc810e39 843 H_PUT_32 (abfd, intern->value, ext->o_offset);
252b5132
RH
844
845#ifdef TEST
846 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 847 abort ();
252b5132
RH
848#endif
849}
850
851/* Swap in a dense number. */
852
853static void
854ecoff_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
dc810e39
AM
863 intern->rfd = H_GET_32 (abfd, ext->d_rfd);
864 intern->index = H_GET_32 (abfd, ext->d_index);
252b5132
RH
865
866#ifdef TEST
867 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 868 abort ();
252b5132
RH
869#endif
870}
871
872/* Swap out a dense number. */
873
874static void
875ecoff_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
1c59ba3f
NC
883 /* Make it reasonable to do in-place. */
884 *intern = *intern_copy;
252b5132 885
dc810e39
AM
886 H_PUT_32 (abfd, intern->rfd, ext->d_rfd);
887 H_PUT_32 (abfd, intern->index, ext->d_index);
252b5132
RH
888
889#ifdef TEST
890 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
3e932841 891 abort ();
252b5132
RH
892#endif
893}
This page took 0.220429 seconds and 4 git commands to generate.