* ecoffswap.h (ecoff_swap_{hdr,ext}_{in,out}): Use signed
[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., 675 Mass Ave, Cambridge, MA 02139, 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 /* Swap in the symbolic header. */
55
56 static void
57 ecoff_swap_hdr_in (abfd, ext_copy, intern)
58 bfd *abfd;
59 PTR ext_copy;
60 HDRR *intern;
61 {
62 struct hdr_ext ext[1];
63
64 *ext = *(struct hdr_ext *) ext_copy;
65
66 intern->magic = bfd_h_get_signed_16 (abfd, (bfd_byte *)ext->h_magic);
67 intern->vstamp = bfd_h_get_signed_16 (abfd, (bfd_byte *)ext->h_vstamp);
68 intern->ilineMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ilineMax);
69 intern->cbLine = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbLine);
70 intern->cbLineOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbLineOffset);
71 intern->idnMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_idnMax);
72 intern->cbDnOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbDnOffset);
73 intern->ipdMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ipdMax);
74 intern->cbPdOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbPdOffset);
75 intern->isymMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_isymMax);
76 intern->cbSymOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbSymOffset);
77 intern->ioptMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ioptMax);
78 intern->cbOptOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbOptOffset);
79 intern->iauxMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_iauxMax);
80 intern->cbAuxOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbAuxOffset);
81 intern->issMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_issMax);
82 intern->cbSsOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbSsOffset);
83 intern->issExtMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_issExtMax);
84 intern->cbSsExtOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbSsExtOffset);
85 intern->ifdMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ifdMax);
86 intern->cbFdOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbFdOffset);
87 intern->crfd = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_crfd);
88 intern->cbRfdOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbRfdOffset);
89 intern->iextMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_iextMax);
90 intern->cbExtOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbExtOffset);
91
92 #ifdef TEST
93 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
94 abort();
95 #endif
96 }
97
98 /* Swap out the symbolic header. */
99
100 static void
101 ecoff_swap_hdr_out (abfd, intern_copy, ext_ptr)
102 bfd *abfd;
103 const HDRR *intern_copy;
104 PTR ext_ptr;
105 {
106 struct hdr_ext *ext = (struct hdr_ext *) ext_ptr;
107 HDRR intern[1];
108
109 *intern = *intern_copy;
110
111 bfd_h_put_signed_16 (abfd, intern->magic, (bfd_byte *)ext->h_magic);
112 bfd_h_put_signed_16 (abfd, intern->vstamp, (bfd_byte *)ext->h_vstamp);
113 bfd_h_put_32 (abfd, intern->ilineMax, (bfd_byte *)ext->h_ilineMax);
114 ecoff_put_off (abfd, intern->cbLine, (bfd_byte *)ext->h_cbLine);
115 ecoff_put_off (abfd, intern->cbLineOffset, (bfd_byte *)ext->h_cbLineOffset);
116 bfd_h_put_32 (abfd, intern->idnMax, (bfd_byte *)ext->h_idnMax);
117 ecoff_put_off (abfd, intern->cbDnOffset, (bfd_byte *)ext->h_cbDnOffset);
118 bfd_h_put_32 (abfd, intern->ipdMax, (bfd_byte *)ext->h_ipdMax);
119 ecoff_put_off (abfd, intern->cbPdOffset, (bfd_byte *)ext->h_cbPdOffset);
120 bfd_h_put_32 (abfd, intern->isymMax, (bfd_byte *)ext->h_isymMax);
121 ecoff_put_off (abfd, intern->cbSymOffset, (bfd_byte *)ext->h_cbSymOffset);
122 bfd_h_put_32 (abfd, intern->ioptMax, (bfd_byte *)ext->h_ioptMax);
123 ecoff_put_off (abfd, intern->cbOptOffset, (bfd_byte *)ext->h_cbOptOffset);
124 bfd_h_put_32 (abfd, intern->iauxMax, (bfd_byte *)ext->h_iauxMax);
125 ecoff_put_off (abfd, intern->cbAuxOffset, (bfd_byte *)ext->h_cbAuxOffset);
126 bfd_h_put_32 (abfd, intern->issMax, (bfd_byte *)ext->h_issMax);
127 ecoff_put_off (abfd, intern->cbSsOffset, (bfd_byte *)ext->h_cbSsOffset);
128 bfd_h_put_32 (abfd, intern->issExtMax, (bfd_byte *)ext->h_issExtMax);
129 ecoff_put_off (abfd, intern->cbSsExtOffset, (bfd_byte *)ext->h_cbSsExtOffset);
130 bfd_h_put_32 (abfd, intern->ifdMax, (bfd_byte *)ext->h_ifdMax);
131 ecoff_put_off (abfd, intern->cbFdOffset, (bfd_byte *)ext->h_cbFdOffset);
132 bfd_h_put_32 (abfd, intern->crfd, (bfd_byte *)ext->h_crfd);
133 ecoff_put_off (abfd, intern->cbRfdOffset, (bfd_byte *)ext->h_cbRfdOffset);
134 bfd_h_put_32 (abfd, intern->iextMax, (bfd_byte *)ext->h_iextMax);
135 ecoff_put_off (abfd, intern->cbExtOffset, (bfd_byte *)ext->h_cbExtOffset);
136
137 #ifdef TEST
138 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
139 abort();
140 #endif
141 }
142
143 /* Swap in the file descriptor record. */
144
145 static void
146 ecoff_swap_fdr_in (abfd, ext_copy, intern)
147 bfd *abfd;
148 PTR ext_copy;
149 FDR *intern;
150 {
151 struct fdr_ext ext[1];
152
153 *ext = *(struct fdr_ext *) ext_copy;
154
155 intern->adr = ecoff_get_off (abfd, (bfd_byte *)ext->f_adr);
156 intern->rss = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_rss);
157 intern->issBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_issBase);
158 intern->cbSs = ecoff_get_off (abfd, (bfd_byte *)ext->f_cbSs);
159 intern->isymBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_isymBase);
160 intern->csym = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_csym);
161 intern->ilineBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_ilineBase);
162 intern->cline = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_cline);
163 intern->ioptBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_ioptBase);
164 intern->copt = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_copt);
165 #ifdef ECOFF_32
166 intern->ipdFirst = bfd_h_get_16 (abfd, (bfd_byte *)ext->f_ipdFirst);
167 intern->cpd = bfd_h_get_16 (abfd, (bfd_byte *)ext->f_cpd);
168 #endif
169 #ifdef ECOFF_64
170 intern->ipdFirst = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_ipdFirst);
171 intern->cpd = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_cpd);
172 #endif
173 intern->iauxBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_iauxBase);
174 intern->caux = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_caux);
175 intern->rfdBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_rfdBase);
176 intern->crfd = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_crfd);
177
178 /* now the fun stuff... */
179 if (abfd->xvec->header_byteorder_big_p != false) {
180 intern->lang = (ext->f_bits1[0] & FDR_BITS1_LANG_BIG)
181 >> FDR_BITS1_LANG_SH_BIG;
182 intern->fMerge = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_BIG);
183 intern->fReadin = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_BIG);
184 intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_BIG);
185 intern->glevel = (ext->f_bits2[0] & FDR_BITS2_GLEVEL_BIG)
186 >> FDR_BITS2_GLEVEL_SH_BIG;
187 } else {
188 intern->lang = (ext->f_bits1[0] & FDR_BITS1_LANG_LITTLE)
189 >> FDR_BITS1_LANG_SH_LITTLE;
190 intern->fMerge = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_LITTLE);
191 intern->fReadin = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_LITTLE);
192 intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_LITTLE);
193 intern->glevel = (ext->f_bits2[0] & FDR_BITS2_GLEVEL_LITTLE)
194 >> FDR_BITS2_GLEVEL_SH_LITTLE;
195 }
196 intern->reserved = 0;
197
198 intern->cbLineOffset = ecoff_get_off (abfd, (bfd_byte *)ext->f_cbLineOffset);
199 intern->cbLine = ecoff_get_off (abfd, (bfd_byte *)ext->f_cbLine);
200
201 #ifdef TEST
202 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
203 abort();
204 #endif
205 }
206
207 /* Swap out the file descriptor record. */
208
209 static void
210 ecoff_swap_fdr_out (abfd, intern_copy, ext_ptr)
211 bfd *abfd;
212 FDR *intern_copy;
213 PTR ext_ptr;
214 {
215 struct fdr_ext *ext = (struct fdr_ext *) ext_ptr;
216 FDR intern[1];
217
218 *intern = *intern_copy; /* Make it reasonable to do in-place. */
219
220 ecoff_put_off (abfd, intern->adr, (bfd_byte *)ext->f_adr);
221 bfd_h_put_32 (abfd, intern->rss, (bfd_byte *)ext->f_rss);
222 bfd_h_put_32 (abfd, intern->issBase, (bfd_byte *)ext->f_issBase);
223 ecoff_put_off (abfd, intern->cbSs, (bfd_byte *)ext->f_cbSs);
224 bfd_h_put_32 (abfd, intern->isymBase, (bfd_byte *)ext->f_isymBase);
225 bfd_h_put_32 (abfd, intern->csym, (bfd_byte *)ext->f_csym);
226 bfd_h_put_32 (abfd, intern->ilineBase, (bfd_byte *)ext->f_ilineBase);
227 bfd_h_put_32 (abfd, intern->cline, (bfd_byte *)ext->f_cline);
228 bfd_h_put_32 (abfd, intern->ioptBase, (bfd_byte *)ext->f_ioptBase);
229 bfd_h_put_32 (abfd, intern->copt, (bfd_byte *)ext->f_copt);
230 #ifdef ECOFF_32
231 bfd_h_put_16 (abfd, intern->ipdFirst, (bfd_byte *)ext->f_ipdFirst);
232 bfd_h_put_16 (abfd, intern->cpd, (bfd_byte *)ext->f_cpd);
233 #endif
234 #ifdef ECOFF_64
235 bfd_h_put_32 (abfd, intern->ipdFirst, (bfd_byte *)ext->f_ipdFirst);
236 bfd_h_put_32 (abfd, intern->cpd, (bfd_byte *)ext->f_cpd);
237 #endif
238 bfd_h_put_32 (abfd, intern->iauxBase, (bfd_byte *)ext->f_iauxBase);
239 bfd_h_put_32 (abfd, intern->caux, (bfd_byte *)ext->f_caux);
240 bfd_h_put_32 (abfd, intern->rfdBase, (bfd_byte *)ext->f_rfdBase);
241 bfd_h_put_32 (abfd, intern->crfd, (bfd_byte *)ext->f_crfd);
242
243 /* now the fun stuff... */
244 if (abfd->xvec->header_byteorder_big_p != false) {
245 ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_BIG)
246 & FDR_BITS1_LANG_BIG)
247 | (intern->fMerge ? FDR_BITS1_FMERGE_BIG : 0)
248 | (intern->fReadin ? FDR_BITS1_FREADIN_BIG : 0)
249 | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_BIG : 0));
250 ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_BIG)
251 & FDR_BITS2_GLEVEL_BIG);
252 ext->f_bits2[1] = 0;
253 ext->f_bits2[2] = 0;
254 } else {
255 ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_LITTLE)
256 & FDR_BITS1_LANG_LITTLE)
257 | (intern->fMerge ? FDR_BITS1_FMERGE_LITTLE : 0)
258 | (intern->fReadin ? FDR_BITS1_FREADIN_LITTLE : 0)
259 | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_LITTLE : 0));
260 ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_LITTLE)
261 & FDR_BITS2_GLEVEL_LITTLE);
262 ext->f_bits2[1] = 0;
263 ext->f_bits2[2] = 0;
264 }
265
266 ecoff_put_off (abfd, intern->cbLineOffset, (bfd_byte *)ext->f_cbLineOffset);
267 ecoff_put_off (abfd, intern->cbLine, (bfd_byte *)ext->f_cbLine);
268
269 #ifdef TEST
270 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
271 abort();
272 #endif
273 }
274
275 /* Swap in the procedure descriptor record. */
276
277 static void
278 ecoff_swap_pdr_in (abfd, ext_copy, intern)
279 bfd *abfd;
280 PTR ext_copy;
281 PDR *intern;
282 {
283 struct pdr_ext ext[1];
284
285 *ext = *(struct pdr_ext *) ext_copy;
286
287 intern->adr = ecoff_get_off (abfd, (bfd_byte *)ext->p_adr);
288 intern->isym = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_isym);
289 intern->iline = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_iline);
290 intern->regmask = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_regmask);
291 intern->regoffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_regoffset);
292 intern->iopt = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_iopt);
293 intern->fregmask = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_fregmask);
294 intern->fregoffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_fregoffset);
295 intern->frameoffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_frameoffset);
296 intern->framereg = bfd_h_get_16 (abfd, (bfd_byte *)ext->p_framereg);
297 intern->pcreg = bfd_h_get_16 (abfd, (bfd_byte *)ext->p_pcreg);
298 intern->lnLow = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_lnLow);
299 intern->lnHigh = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_lnHigh);
300 intern->cbLineOffset = ecoff_get_off (abfd, (bfd_byte *)ext->p_cbLineOffset);
301
302 #ifdef TEST
303 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
304 abort();
305 #endif
306 }
307
308 /* Swap out the procedure descriptor record. */
309
310 static void
311 ecoff_swap_pdr_out (abfd, intern_copy, ext_ptr)
312 bfd *abfd;
313 PDR *intern_copy;
314 PTR ext_ptr;
315 {
316 struct pdr_ext *ext = (struct pdr_ext *) ext_ptr;
317 PDR intern[1];
318
319 *intern = *intern_copy; /* Make it reasonable to do in-place. */
320
321 ecoff_put_off (abfd, intern->adr, (bfd_byte *)ext->p_adr);
322 bfd_h_put_32 (abfd, intern->isym, (bfd_byte *)ext->p_isym);
323 bfd_h_put_32 (abfd, intern->iline, (bfd_byte *)ext->p_iline);
324 bfd_h_put_32 (abfd, intern->regmask, (bfd_byte *)ext->p_regmask);
325 bfd_h_put_32 (abfd, intern->regoffset, (bfd_byte *)ext->p_regoffset);
326 bfd_h_put_32 (abfd, intern->iopt, (bfd_byte *)ext->p_iopt);
327 bfd_h_put_32 (abfd, intern->fregmask, (bfd_byte *)ext->p_fregmask);
328 bfd_h_put_32 (abfd, intern->fregoffset, (bfd_byte *)ext->p_fregoffset);
329 bfd_h_put_32 (abfd, intern->frameoffset, (bfd_byte *)ext->p_frameoffset);
330 bfd_h_put_16 (abfd, intern->framereg, (bfd_byte *)ext->p_framereg);
331 bfd_h_put_16 (abfd, intern->pcreg, (bfd_byte *)ext->p_pcreg);
332 bfd_h_put_32 (abfd, intern->lnLow, (bfd_byte *)ext->p_lnLow);
333 bfd_h_put_32 (abfd, intern->lnHigh, (bfd_byte *)ext->p_lnHigh);
334 ecoff_put_off (abfd, intern->cbLineOffset, (bfd_byte *)ext->p_cbLineOffset);
335
336 #ifdef TEST
337 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
338 abort();
339 #endif
340 }
341
342 /* Swap in a symbol record. */
343
344 static void
345 ecoff_swap_sym_in (abfd, ext_copy, intern)
346 bfd *abfd;
347 PTR ext_copy;
348 SYMR *intern;
349 {
350 struct sym_ext ext[1];
351
352 *ext = *(struct sym_ext *) ext_copy;
353
354 intern->iss = bfd_h_get_32 (abfd, (bfd_byte *)ext->s_iss);
355 intern->value = ecoff_get_off (abfd, (bfd_byte *)ext->s_value);
356
357 /* now the fun stuff... */
358 if (abfd->xvec->header_byteorder_big_p != false) {
359 intern->st = (ext->s_bits1[0] & SYM_BITS1_ST_BIG)
360 >> SYM_BITS1_ST_SH_BIG;
361 intern->sc = ((ext->s_bits1[0] & SYM_BITS1_SC_BIG)
362 << SYM_BITS1_SC_SH_LEFT_BIG)
363 | ((ext->s_bits2[0] & SYM_BITS2_SC_BIG)
364 >> SYM_BITS2_SC_SH_BIG);
365 intern->reserved = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_BIG);
366 intern->index = ((ext->s_bits2[0] & SYM_BITS2_INDEX_BIG)
367 << SYM_BITS2_INDEX_SH_LEFT_BIG)
368 | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_BIG)
369 | (ext->s_bits4[0] << SYM_BITS4_INDEX_SH_LEFT_BIG);
370 } else {
371 intern->st = (ext->s_bits1[0] & SYM_BITS1_ST_LITTLE)
372 >> SYM_BITS1_ST_SH_LITTLE;
373 intern->sc = ((ext->s_bits1[0] & SYM_BITS1_SC_LITTLE)
374 >> SYM_BITS1_SC_SH_LITTLE)
375 | ((ext->s_bits2[0] & SYM_BITS2_SC_LITTLE)
376 << SYM_BITS2_SC_SH_LEFT_LITTLE);
377 intern->reserved = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_LITTLE);
378 intern->index = ((ext->s_bits2[0] & SYM_BITS2_INDEX_LITTLE)
379 >> SYM_BITS2_INDEX_SH_LITTLE)
380 | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_LITTLE)
381 | (ext->s_bits4[0] << SYM_BITS4_INDEX_SH_LEFT_LITTLE);
382 }
383
384 #ifdef TEST
385 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
386 abort();
387 #endif
388 }
389
390 /* Swap out a symbol record. */
391
392 static void
393 ecoff_swap_sym_out (abfd, intern_copy, ext_ptr)
394 bfd *abfd;
395 SYMR *intern_copy;
396 PTR ext_ptr;
397 {
398 struct sym_ext *ext = (struct sym_ext *) ext_ptr;
399 SYMR intern[1];
400
401 *intern = *intern_copy; /* Make it reasonable to do in-place. */
402
403 bfd_h_put_32 (abfd, intern->iss, (bfd_byte *)ext->s_iss);
404 ecoff_put_off (abfd, intern->value, (bfd_byte *)ext->s_value);
405
406 /* now the fun stuff... */
407 if (abfd->xvec->header_byteorder_big_p != false) {
408 ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_BIG)
409 & SYM_BITS1_ST_BIG)
410 | ((intern->sc >> SYM_BITS1_SC_SH_LEFT_BIG)
411 & SYM_BITS1_SC_BIG));
412 ext->s_bits2[0] = (((intern->sc << SYM_BITS2_SC_SH_BIG)
413 & SYM_BITS2_SC_BIG)
414 | (intern->reserved ? SYM_BITS2_RESERVED_BIG : 0)
415 | ((intern->index >> SYM_BITS2_INDEX_SH_LEFT_BIG)
416 & SYM_BITS2_INDEX_BIG));
417 ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_BIG) & 0xff;
418 ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_BIG) & 0xff;
419 } else {
420 ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_LITTLE)
421 & SYM_BITS1_ST_LITTLE)
422 | ((intern->sc << SYM_BITS1_SC_SH_LITTLE)
423 & SYM_BITS1_SC_LITTLE));
424 ext->s_bits2[0] = (((intern->sc >> SYM_BITS2_SC_SH_LEFT_LITTLE)
425 & SYM_BITS2_SC_LITTLE)
426 | (intern->reserved ? SYM_BITS2_RESERVED_LITTLE : 0)
427 | ((intern->index << SYM_BITS2_INDEX_SH_LITTLE)
428 & SYM_BITS2_INDEX_LITTLE));
429 ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_LITTLE) & 0xff;
430 ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_LITTLE) & 0xff;
431 }
432
433 #ifdef TEST
434 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
435 abort();
436 #endif
437 }
438
439 /* Swap in an external symbol record. */
440
441 static void
442 ecoff_swap_ext_in (abfd, ext_copy, intern)
443 bfd *abfd;
444 PTR ext_copy;
445 EXTR *intern;
446 {
447 struct ext_ext ext[1];
448
449 *ext = *(struct ext_ext *) ext_copy;
450
451 /* now the fun stuff... */
452 if (abfd->xvec->header_byteorder_big_p != false) {
453 intern->jmptbl = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_BIG);
454 intern->cobol_main = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_BIG);
455 intern->weakext = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_BIG);
456 } else {
457 intern->jmptbl = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_LITTLE);
458 intern->cobol_main = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_LITTLE);
459 intern->weakext = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_LITTLE);
460 }
461 intern->reserved = 0;
462
463 #ifdef ECOFF_32
464 intern->ifd = bfd_h_get_signed_16 (abfd, (bfd_byte *)ext->es_ifd);
465 #endif
466 #ifdef ECOFF_64
467 intern->ifd = bfd_h_get_signed_32 (abfd, (bfd_byte *)ext->es_ifd);
468 #endif
469
470 ecoff_swap_sym_in (abfd, &ext->es_asym, &intern->asym);
471
472 #ifdef TEST
473 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
474 abort();
475 #endif
476 }
477
478 /* Swap out an external symbol record. */
479
480 static void
481 ecoff_swap_ext_out (abfd, intern_copy, ext_ptr)
482 bfd *abfd;
483 EXTR *intern_copy;
484 PTR ext_ptr;
485 {
486 struct ext_ext *ext = (struct ext_ext *) ext_ptr;
487 EXTR intern[1];
488
489 *intern = *intern_copy; /* Make it reasonable to do in-place. */
490
491 /* now the fun stuff... */
492 if (abfd->xvec->header_byteorder_big_p != false) {
493 ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_BIG : 0)
494 | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_BIG : 0)
495 | (intern->weakext ? EXT_BITS1_WEAKEXT_BIG : 0));
496 ext->es_bits2[0] = 0;
497 } else {
498 ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_LITTLE : 0)
499 | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_LITTLE : 0)
500 | (intern->weakext ? EXT_BITS1_WEAKEXT_LITTLE : 0));
501 ext->es_bits2[0] = 0;
502 }
503
504 #ifdef ECOFF_32
505 bfd_h_put_signed_16 (abfd, intern->ifd, (bfd_byte *)ext->es_ifd);
506 #endif
507 #ifdef ECOFF_64
508 bfd_h_put_signed_32 (abfd, intern->ifd, (bfd_byte *)ext->es_ifd);
509 #endif
510
511 ecoff_swap_sym_out (abfd, &intern->asym, &ext->es_asym);
512
513 #ifdef TEST
514 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
515 abort();
516 #endif
517 }
518
519 /* Swap in a relative file descriptor. */
520
521 static void
522 ecoff_swap_rfd_in (abfd, ext_ptr, intern)
523 bfd *abfd;
524 PTR ext_ptr;
525 RFDT *intern;
526 {
527 struct rfd_ext *ext = (struct rfd_ext *) ext_ptr;
528
529 *intern = bfd_h_get_32 (abfd, (bfd_byte *)ext->rfd);
530
531 #ifdef TEST
532 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
533 abort();
534 #endif
535 }
536
537 /* Swap out a relative file descriptor. */
538
539 static void
540 ecoff_swap_rfd_out (abfd, intern, ext_ptr)
541 bfd *abfd;
542 RFDT *intern;
543 PTR ext_ptr;
544 {
545 struct rfd_ext *ext = (struct rfd_ext *) ext_ptr;
546
547 bfd_h_put_32 (abfd, *intern, (bfd_byte *)ext->rfd);
548
549 #ifdef TEST
550 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
551 abort();
552 #endif
553 }
554
555 /* Swap in an optimization symbol. */
556
557 static void
558 ecoff_swap_opt_in (abfd, ext_copy, intern)
559 bfd *abfd;
560 PTR ext_copy;
561 OPTR *intern;
562 {
563 struct opt_ext ext[1];
564
565 *ext = *(struct opt_ext *) ext_copy;
566
567 if (abfd->xvec->header_byteorder_big_p != false)
568 {
569 intern->ot = ext->o_bits1[0];
570 intern->value = ((ext->o_bits2[0] << OPT_BITS2_VALUE_SH_LEFT_BIG)
571 | (ext->o_bits3[0] << OPT_BITS2_VALUE_SH_LEFT_BIG)
572 | (ext->o_bits4[0] << OPT_BITS2_VALUE_SH_LEFT_BIG));
573 }
574 else
575 {
576 intern->ot = ext->o_bits1[0];
577 intern->value = ((ext->o_bits2[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE)
578 | (ext->o_bits3[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE)
579 | (ext->o_bits4[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE));
580 }
581
582 ecoff_swap_rndx_in (abfd->xvec->header_byteorder_big_p != false,
583 &ext->o_rndx, &intern->rndx);
584
585 intern->offset = bfd_h_get_32 (abfd, (bfd_byte *) ext->o_offset);
586
587 #ifdef TEST
588 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
589 abort();
590 #endif
591 }
592
593 /* Swap out an optimization symbol. */
594
595 static void
596 ecoff_swap_opt_out (abfd, intern_copy, ext_ptr)
597 bfd *abfd;
598 OPTR *intern_copy;
599 PTR ext_ptr;
600 {
601 struct opt_ext *ext = (struct opt_ext *) ext_ptr;
602 OPTR intern[1];
603
604 *intern = *intern_copy; /* Make it reasonable to do in-place. */
605
606 if (abfd->xvec->header_byteorder_big_p != false)
607 {
608 ext->o_bits1[0] = intern->ot;
609 ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_BIG;
610 ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_BIG;
611 ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_BIG;
612 }
613 else
614 {
615 ext->o_bits1[0] = intern->ot;
616 ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_LITTLE;
617 ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_LITTLE;
618 ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_LITTLE;
619 }
620
621 ecoff_swap_rndx_out (abfd->xvec->header_byteorder_big_p != false,
622 &intern->rndx, &ext->o_rndx);
623
624 bfd_h_put_32 (abfd, intern->value, (bfd_byte *) ext->o_offset);
625
626 #ifdef TEST
627 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
628 abort();
629 #endif
630 }
631
632 /* Swap in a dense number. */
633
634 static void
635 ecoff_swap_dnr_in (abfd, ext_copy, intern)
636 bfd *abfd;
637 PTR ext_copy;
638 DNR *intern;
639 {
640 struct dnr_ext ext[1];
641
642 *ext = *(struct dnr_ext *) ext_copy;
643
644 intern->rfd = bfd_h_get_32 (abfd, (bfd_byte *) ext->d_rfd);
645 intern->index = bfd_h_get_32 (abfd, (bfd_byte *) ext->d_index);
646
647 #ifdef TEST
648 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
649 abort();
650 #endif
651 }
652
653 /* Swap out a dense number. */
654
655 static void
656 ecoff_swap_dnr_out (abfd, intern_copy, ext_ptr)
657 bfd *abfd;
658 DNR *intern_copy;
659 PTR ext_ptr;
660 {
661 struct dnr_ext *ext = (struct dnr_ext *) ext_ptr;
662 DNR intern[1];
663
664 *intern = *intern_copy; /* Make it reasonable to do in-place. */
665
666 bfd_h_put_32 (abfd, intern->rfd, (bfd_byte *) ext->d_rfd);
667 bfd_h_put_32 (abfd, intern->index, (bfd_byte *) ext->d_index);
668
669 #ifdef TEST
670 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
671 abort();
672 #endif
673 }
This page took 0.046728 seconds and 5 git commands to generate.