1 /* coff-msym.c: Byte-swap a symbol table in MIPS' format (Third-Eye, `ecoff').
2 Copyright 1992 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20 /* These routines are not yet called from BFD. They are called from
21 the MIPS symbol reading code in GDB. However, they are in the BFD
22 library because they will eventually be useful if and when BFD
23 supports reading or writing of MIPS symbol tables.
25 The routines in this file convert the external representation of
26 ECOFF symbol tables to the internal (usual struct) representation.
27 On a machine with the same byte-order and the same basic type
28 sizes and alignments as a MIPS machine, this is a no-op.
29 If the symbol TEST is defined when this file is compiled, a comparison
30 is made to ensure that, in fact, the output is bit-for-bit the same as
31 the input. Of course, this symbol should only be defined when
32 deliberately testing the code on a machine with the proper byte sex
36 #include "coff/sym.h" /* MIPS symbols */
37 #include "coff/symconst.h" /* MIPS symbols */
38 #include "coff/ecoff-ext.h" /* ECOFF external struct defns */
41 ecoff_swap_hdr_in (abfd, ext_copy, intern)
43 struct hdr_ext *ext_copy;
46 struct hdr_ext ext[1];
50 intern->magic = bfd_h_get_16 (abfd, (bfd_byte *)ext->h_magic);
51 intern->vstamp = bfd_h_get_16 (abfd, (bfd_byte *)ext->h_vstamp);
52 intern->ilineMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ilineMax);
53 intern->cbLine = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbLine);
54 intern->cbLineOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbLineOffset);
55 intern->idnMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_idnMax);
56 intern->cbDnOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbDnOffset);
57 intern->ipdMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ipdMax);
58 intern->cbPdOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbPdOffset);
59 intern->isymMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_isymMax);
60 intern->cbSymOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbSymOffset);
61 intern->ioptMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ioptMax);
62 intern->cbOptOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbOptOffset);
63 intern->iauxMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_iauxMax);
64 intern->cbAuxOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbAuxOffset);
65 intern->issMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_issMax);
66 intern->cbSsOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbSsOffset);
67 intern->issExtMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_issExtMax);
68 intern->cbSsExtOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbSsExtOffset);
69 intern->ifdMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ifdMax);
70 intern->cbFdOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbFdOffset);
71 intern->crfd = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_crfd);
72 intern->cbRfdOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbRfdOffset);
73 intern->iextMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_iextMax);
74 intern->cbExtOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_cbExtOffset);
77 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
82 /* Swap in the file descriptor record. */
85 ecoff_swap_fdr_in (abfd, ext_copy, intern)
87 struct fdr_ext *ext_copy;
90 struct fdr_ext ext[1];
92 *ext = *ext_copy; /* Make it reasonable to do in-place. */
94 intern->adr = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_adr);
95 intern->rss = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_rss);
96 intern->issBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_issBase);
97 intern->cbSs = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_cbSs);
98 intern->isymBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_isymBase);
99 intern->csym = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_csym);
100 intern->ilineBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_ilineBase);
101 intern->cline = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_cline);
102 intern->ioptBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_ioptBase);
103 intern->copt = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_copt);
104 intern->ipdFirst = bfd_h_get_16 (abfd, (bfd_byte *)ext->f_ipdFirst);
105 intern->cpd = bfd_h_get_16 (abfd, (bfd_byte *)ext->f_cpd);
106 intern->iauxBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_iauxBase);
107 intern->caux = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_caux);
108 intern->rfdBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_rfdBase);
109 intern->crfd = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_crfd);
111 /* now the fun stuff... */
112 if (abfd->xvec->header_byteorder_big_p != false) {
113 intern->lang = (ext->f_bits1[0] & FDR_BITS1_LANG_BIG)
114 >> FDR_BITS1_LANG_SH_BIG;
115 intern->fMerge = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_BIG);
116 intern->fReadin = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_BIG);
117 intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_BIG);
118 intern->glevel = (ext->f_bits2[0] & FDR_BITS2_GLEVEL_BIG)
119 >> FDR_BITS2_GLEVEL_SH_BIG;
120 /* intern->reserved we ignore. */
122 intern->lang = (ext->f_bits1[0] & FDR_BITS1_LANG_LITTLE)
123 >> FDR_BITS1_LANG_SH_LITTLE;
124 intern->fMerge = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_LITTLE);
125 intern->fReadin = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_LITTLE);
126 intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_LITTLE);
127 intern->glevel = (ext->f_bits2[0] & FDR_BITS2_GLEVEL_LITTLE)
128 >> FDR_BITS2_GLEVEL_SH_LITTLE;
129 /* intern->reserved we ignore. */
132 intern->cbLineOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_cbLineOffset);
133 intern->cbLine = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_cbLine);
136 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
143 /* Swap in the procedure descriptor record. */
146 ecoff_swap_pdr_in (abfd, ext_copy, intern)
148 struct pdr_ext *ext_copy;
151 struct pdr_ext ext[1];
153 *ext = *ext_copy; /* Make it reasonable to do in-place. */
155 intern->adr = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_adr);
156 intern->isym = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_isym);
157 intern->iline = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_iline);
158 intern->regmask = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_regmask);
159 intern->regoffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_regoffset);
160 intern->iopt = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_iopt);
161 intern->fregmask = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_fregmask);
162 intern->fregoffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_fregoffset);
163 intern->frameoffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_frameoffset);
164 intern->framereg = bfd_h_get_16 (abfd, (bfd_byte *)ext->p_framereg);
165 intern->pcreg = bfd_h_get_16 (abfd, (bfd_byte *)ext->p_pcreg);
166 intern->lnLow = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_lnLow);
167 intern->lnHigh = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_lnHigh);
168 intern->cbLineOffset = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_cbLineOffset);
171 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
177 /* Swap in a symbol record. */
180 ecoff_swap_sym_in (abfd, ext_copy, intern)
182 struct sym_ext *ext_copy;
185 struct sym_ext ext[1];
187 *ext = *ext_copy; /* Make it reasonable to do in-place. */
189 intern->iss = bfd_h_get_32 (abfd, (bfd_byte *)ext->s_iss);
190 intern->value = bfd_h_get_32 (abfd, (bfd_byte *)ext->s_value);
192 /* now the fun stuff... */
193 if (abfd->xvec->header_byteorder_big_p != false) {
194 intern->st = (ext->s_bits1[0] & SYM_BITS1_ST_BIG)
195 >> SYM_BITS1_ST_SH_BIG;
196 intern->sc = ((ext->s_bits1[0] & SYM_BITS1_SC_BIG)
197 << SYM_BITS1_SC_SH_LEFT_BIG)
198 | ((ext->s_bits2[0] & SYM_BITS2_SC_BIG)
199 >> SYM_BITS2_SC_SH_BIG);
200 intern->reserved = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_BIG);
201 intern->index = ((ext->s_bits2[0] & SYM_BITS2_INDEX_BIG)
202 << SYM_BITS2_INDEX_SH_LEFT_BIG)
203 | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_BIG)
204 | (ext->s_bits4[0] << SYM_BITS4_INDEX_SH_LEFT_BIG);
206 intern->st = (ext->s_bits1[0] & SYM_BITS1_ST_LITTLE)
207 >> SYM_BITS1_ST_SH_LITTLE;
208 intern->sc = ((ext->s_bits1[0] & SYM_BITS1_SC_LITTLE)
209 >> SYM_BITS1_SC_SH_LITTLE)
210 | ((ext->s_bits2[0] & SYM_BITS2_SC_LITTLE)
211 << SYM_BITS2_SC_SH_LEFT_LITTLE);
212 intern->reserved = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_LITTLE);
213 intern->index = ((ext->s_bits2[0] & SYM_BITS2_INDEX_LITTLE)
214 >> SYM_BITS2_INDEX_SH_LITTLE)
215 | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_LITTLE)
216 | (ext->s_bits4[0] << SYM_BITS4_INDEX_SH_LEFT_LITTLE);
220 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
226 /* Swap in an external symbol record. */
229 ecoff_swap_ext_in (abfd, ext_copy, intern)
231 struct ext_ext *ext_copy;
234 struct ext_ext ext[1];
236 *ext = *ext_copy; /* Make it reasonable to do in-place. */
238 /* now the fun stuff... */
239 if (abfd->xvec->header_byteorder_big_p != false) {
240 intern->jmptbl = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_BIG);
241 intern->cobol_main = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_BIG);
242 intern->weakext = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_BIG);
244 intern->jmptbl = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_LITTLE);
245 intern->cobol_main = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_LITTLE);
246 intern->weakext = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_LITTLE);
249 intern->ifd = bfd_h_get_16 (abfd, (bfd_byte *)ext->es_ifd);
250 ecoff_swap_sym_in (abfd, &ext->es_asym, &intern->asym);
253 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
258 /* Swap in a type information record.
259 BIGEND says whether AUX symbols are big-endian or little-endian; this
260 info comes from the file header record (fh-fBigendian). */
263 ecoff_swap_tir_in (bigend, ext_copy, intern)
265 struct tir_ext *ext_copy;
268 struct tir_ext ext[1];
270 *ext = *ext_copy; /* Make it reasonable to do in-place. */
272 /* now the fun stuff... */
274 intern->fBitfield = 0 != (ext->t_bits1[0] & TIR_BITS1_FBITFIELD_BIG);
275 intern->continued = 0 != (ext->t_bits1[0] & TIR_BITS1_CONTINUED_BIG);
276 intern->bt = (ext->t_bits1[0] & TIR_BITS1_BT_BIG)
277 >> TIR_BITS1_BT_SH_BIG;
278 intern->tq4 = (ext->t_tq45[0] & TIR_BITS_TQ4_BIG)
279 >> TIR_BITS_TQ4_SH_BIG;
280 intern->tq5 = (ext->t_tq45[0] & TIR_BITS_TQ5_BIG)
281 >> TIR_BITS_TQ5_SH_BIG;
282 intern->tq0 = (ext->t_tq01[0] & TIR_BITS_TQ0_BIG)
283 >> TIR_BITS_TQ0_SH_BIG;
284 intern->tq1 = (ext->t_tq01[0] & TIR_BITS_TQ1_BIG)
285 >> TIR_BITS_TQ1_SH_BIG;
286 intern->tq2 = (ext->t_tq23[0] & TIR_BITS_TQ2_BIG)
287 >> TIR_BITS_TQ2_SH_BIG;
288 intern->tq3 = (ext->t_tq23[0] & TIR_BITS_TQ3_BIG)
289 >> TIR_BITS_TQ3_SH_BIG;
291 intern->fBitfield = 0 != (ext->t_bits1[0] & TIR_BITS1_FBITFIELD_LITTLE);
292 intern->continued = 0 != (ext->t_bits1[0] & TIR_BITS1_CONTINUED_LITTLE);
293 intern->bt = (ext->t_bits1[0] & TIR_BITS1_BT_LITTLE)
294 >> TIR_BITS1_BT_SH_LITTLE;
295 intern->tq4 = (ext->t_tq45[0] & TIR_BITS_TQ4_LITTLE)
296 >> TIR_BITS_TQ4_SH_LITTLE;
297 intern->tq5 = (ext->t_tq45[0] & TIR_BITS_TQ5_LITTLE)
298 >> TIR_BITS_TQ5_SH_LITTLE;
299 intern->tq0 = (ext->t_tq01[0] & TIR_BITS_TQ0_LITTLE)
300 >> TIR_BITS_TQ0_SH_LITTLE;
301 intern->tq1 = (ext->t_tq01[0] & TIR_BITS_TQ1_LITTLE)
302 >> TIR_BITS_TQ1_SH_LITTLE;
303 intern->tq2 = (ext->t_tq23[0] & TIR_BITS_TQ2_LITTLE)
304 >> TIR_BITS_TQ2_SH_LITTLE;
305 intern->tq3 = (ext->t_tq23[0] & TIR_BITS_TQ3_LITTLE)
306 >> TIR_BITS_TQ3_SH_LITTLE;
310 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
315 /* Swap in a relative symbol record. BIGEND says whether it is in
316 big-endian or little-endian format.*/
319 ecoff_swap_rndx_in (bigend, ext_copy, intern)
321 struct rndx_ext *ext_copy;
324 struct rndx_ext ext[1];
326 *ext = *ext_copy; /* Make it reasonable to do in-place. */
328 /* now the fun stuff... */
330 intern->rfd = (ext->r_bits[0] << RNDX_BITS0_RFD_SH_LEFT_BIG)
331 | ((ext->r_bits[1] & RNDX_BITS1_RFD_BIG)
332 >> RNDX_BITS1_RFD_SH_BIG);
333 intern->index = ((ext->r_bits[1] & RNDX_BITS1_INDEX_BIG)
334 << RNDX_BITS1_INDEX_SH_LEFT_BIG)
335 | (ext->r_bits[2] << RNDX_BITS2_INDEX_SH_LEFT_BIG)
336 | (ext->r_bits[3] << RNDX_BITS3_INDEX_SH_LEFT_BIG);
338 intern->rfd = (ext->r_bits[0] << RNDX_BITS0_RFD_SH_LEFT_LITTLE)
339 | ((ext->r_bits[1] & RNDX_BITS1_RFD_LITTLE)
340 << RNDX_BITS1_RFD_SH_LEFT_LITTLE);
341 intern->index = ((ext->r_bits[1] & RNDX_BITS1_INDEX_LITTLE)
342 >> RNDX_BITS1_INDEX_SH_LITTLE)
343 | (ext->r_bits[2] << RNDX_BITS2_INDEX_SH_LEFT_LITTLE)
344 | (ext->r_bits[3] << RNDX_BITS3_INDEX_SH_LEFT_LITTLE);
348 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
353 /* Swap in a relative file descriptor. */
356 ecoff_swap_rfd_in (abfd, ext, intern)
362 *intern = bfd_h_get_32 (abfd, (bfd_byte *)ext->rfd);
365 if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)