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