diff options
author | Ian Lance Taylor <ian@airs.com> | 1993-01-15 23:39:05 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1993-01-15 23:39:05 +0000 |
commit | 8fa0d3a01237d349f21803df735deedc01c1bd3b (patch) | |
tree | 665e1139ec86a552e657eeb309c5115be78d9f3d /bfd/coff-msym.c | |
parent | 9dcfbb6781c465fa4bc3800265977c051229f432 (diff) | |
download | gdb-8fa0d3a01237d349f21803df735deedc01c1bd3b.zip gdb-8fa0d3a01237d349f21803df735deedc01c1bd3b.tar.gz gdb-8fa0d3a01237d349f21803df735deedc01c1bd3b.tar.bz2 |
Basically a checkpoint for coff-mips.c.
Fri Jan 15 18:13:17 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
* coff-msym.c (ecoff_swap_hdr_out, ecoff_swap_fdr_out,
ecoff_swap_pdr_out, ecoff_swap_sym_out, ecoff_swap_ext_out,
ecoff_swap_rndx_out, ecoff_swap_rfd_out, ecoff_swap_opt_in,
ecoff_swap_opt_out, ecoff_swap_dnr_in, ecoff_swap_dnr_out): New
functions.
* coffswap.h: If NO_COFF_RELOCS is defined, don't define
bfd_swap_reloc_in or coff_swap_reloc_out.
* coff-mips.c: Added code to link and write out symbolic debugging
information, and to swap relocs in and out.
Diffstat (limited to 'bfd/coff-msym.c')
-rw-r--r-- | bfd/coff-msym.c | 397 |
1 files changed, 391 insertions, 6 deletions
diff --git a/bfd/coff-msym.c b/bfd/coff-msym.c index 4929cff..0a746c1 100644 --- a/bfd/coff-msym.c +++ b/bfd/coff-msym.c @@ -17,12 +17,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* These routines are not yet called from BFD. They are called from - the MIPS symbol reading code in GDB. However, they are in the BFD - library because they will eventually be useful if and when BFD - supports reading or writing of MIPS symbol tables. - - The routines in this file convert the external representation of +/* The routines in this file convert the external representation of ECOFF symbol tables to the internal (usual struct) representation. On a machine with the same byte-order and the same basic type sizes and alignments as a MIPS machine, this is a no-op. @@ -37,6 +32,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "coff/symconst.h" /* MIPS symbols */ #include "coff/ecoff-ext.h" /* ECOFF external struct defns */ +/* Swap in the symbolic header. */ + void DEFUN (ecoff_swap_hdr_in, (abfd, ext_copy, intern), bfd *abfd AND @@ -79,6 +76,50 @@ DEFUN (ecoff_swap_hdr_in, (abfd, ext_copy, intern), #endif } +/* Swap out the symbolic header. */ + +void +DEFUN (ecoff_swap_hdr_out, (abfd, intern_copy, ext), + bfd *abfd AND + HDRR *intern_copy AND + struct hdr_ext *ext) +{ + HDRR intern[1]; + + *intern = *intern_copy; + + bfd_h_put_16 (abfd, intern->magic, (bfd_byte *)ext->h_magic); + bfd_h_put_16 (abfd, intern->vstamp, (bfd_byte *)ext->h_vstamp); + bfd_h_put_32 (abfd, intern->ilineMax, (bfd_byte *)ext->h_ilineMax); + bfd_h_put_32 (abfd, intern->cbLine, (bfd_byte *)ext->h_cbLine); + bfd_h_put_32 (abfd, intern->cbLineOffset, (bfd_byte *)ext->h_cbLineOffset); + bfd_h_put_32 (abfd, intern->idnMax, (bfd_byte *)ext->h_idnMax); + bfd_h_put_32 (abfd, intern->cbDnOffset, (bfd_byte *)ext->h_cbDnOffset); + bfd_h_put_32 (abfd, intern->ipdMax, (bfd_byte *)ext->h_ipdMax); + bfd_h_put_32 (abfd, intern->cbPdOffset, (bfd_byte *)ext->h_cbPdOffset); + bfd_h_put_32 (abfd, intern->isymMax, (bfd_byte *)ext->h_isymMax); + bfd_h_put_32 (abfd, intern->cbSymOffset, (bfd_byte *)ext->h_cbSymOffset); + bfd_h_put_32 (abfd, intern->ioptMax, (bfd_byte *)ext->h_ioptMax); + bfd_h_put_32 (abfd, intern->cbOptOffset, (bfd_byte *)ext->h_cbOptOffset); + bfd_h_put_32 (abfd, intern->iauxMax, (bfd_byte *)ext->h_iauxMax); + bfd_h_put_32 (abfd, intern->cbAuxOffset, (bfd_byte *)ext->h_cbAuxOffset); + bfd_h_put_32 (abfd, intern->issMax, (bfd_byte *)ext->h_issMax); + bfd_h_put_32 (abfd, intern->cbSsOffset, (bfd_byte *)ext->h_cbSsOffset); + bfd_h_put_32 (abfd, intern->issExtMax, (bfd_byte *)ext->h_issExtMax); + bfd_h_put_32 (abfd, intern->cbSsExtOffset, (bfd_byte *)ext->h_cbSsExtOffset); + bfd_h_put_32 (abfd, intern->ifdMax, (bfd_byte *)ext->h_ifdMax); + bfd_h_put_32 (abfd, intern->cbFdOffset, (bfd_byte *)ext->h_cbFdOffset); + bfd_h_put_32 (abfd, intern->crfd, (bfd_byte *)ext->h_crfd); + bfd_h_put_32 (abfd, intern->cbRfdOffset, (bfd_byte *)ext->h_cbRfdOffset); + bfd_h_put_32 (abfd, intern->iextMax, (bfd_byte *)ext->h_iextMax); + bfd_h_put_32 (abfd, intern->cbExtOffset, (bfd_byte *)ext->h_cbExtOffset); + +#ifdef TEST + if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) + abort(); +#endif +} + /* Swap in the file descriptor record. */ void @@ -138,7 +179,66 @@ DEFUN (ecoff_swap_fdr_in, (abfd, ext_copy, intern), #endif } +/* Swap out the file descriptor record. */ + +void +DEFUN (ecoff_swap_fdr_out, (abfd, intern_copy, ext), + bfd *abfd AND + FDR *intern_copy AND + struct fdr_ext *ext) +{ + FDR intern[1]; + + *intern = *intern_copy; /* Make it reasonable to do in-place. */ + + bfd_h_put_32 (abfd, intern->adr, (bfd_byte *)ext->f_adr); + bfd_h_put_32 (abfd, intern->rss, (bfd_byte *)ext->f_rss); + bfd_h_put_32 (abfd, intern->issBase, (bfd_byte *)ext->f_issBase); + bfd_h_put_32 (abfd, intern->cbSs, (bfd_byte *)ext->f_cbSs); + bfd_h_put_32 (abfd, intern->isymBase, (bfd_byte *)ext->f_isymBase); + bfd_h_put_32 (abfd, intern->csym, (bfd_byte *)ext->f_csym); + bfd_h_put_32 (abfd, intern->ilineBase, (bfd_byte *)ext->f_ilineBase); + bfd_h_put_32 (abfd, intern->cline, (bfd_byte *)ext->f_cline); + bfd_h_put_32 (abfd, intern->ioptBase, (bfd_byte *)ext->f_ioptBase); + bfd_h_put_32 (abfd, intern->copt, (bfd_byte *)ext->f_copt); + bfd_h_put_16 (abfd, intern->ipdFirst, (bfd_byte *)ext->f_ipdFirst); + bfd_h_put_16 (abfd, intern->cpd, (bfd_byte *)ext->f_cpd); + bfd_h_put_32 (abfd, intern->iauxBase, (bfd_byte *)ext->f_iauxBase); + bfd_h_put_32 (abfd, intern->caux, (bfd_byte *)ext->f_caux); + bfd_h_put_32 (abfd, intern->rfdBase, (bfd_byte *)ext->f_rfdBase); + bfd_h_put_32 (abfd, intern->crfd, (bfd_byte *)ext->f_crfd); + + /* now the fun stuff... */ + if (abfd->xvec->header_byteorder_big_p != false) { + ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_BIG) + & FDR_BITS1_LANG_BIG) + | (intern->fMerge ? FDR_BITS1_FMERGE_BIG : 0) + | (intern->fReadin ? FDR_BITS1_FREADIN_BIG : 0) + | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_BIG : 0)); + ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_BIG) + & FDR_BITS2_GLEVEL_BIG); + ext->f_bits2[1] = 0; + ext->f_bits2[2] = 0; + } else { + ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_LITTLE) + & FDR_BITS1_LANG_LITTLE) + | (intern->fMerge ? FDR_BITS1_FMERGE_LITTLE : 0) + | (intern->fReadin ? FDR_BITS1_FREADIN_LITTLE : 0) + | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_LITTLE : 0)); + ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_LITTLE) + & FDR_BITS2_GLEVEL_LITTLE); + ext->f_bits2[1] = 0; + ext->f_bits2[2] = 0; + } + + bfd_h_put_32 (abfd, intern->cbLineOffset, (bfd_byte *)ext->f_cbLineOffset); + bfd_h_put_32 (abfd, intern->cbLine, (bfd_byte *)ext->f_cbLine); +#ifdef TEST + if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) + abort(); +#endif +} /* Swap in the procedure descriptor record. */ @@ -173,6 +273,38 @@ DEFUN (ecoff_swap_pdr_in, (abfd, ext_copy, intern), #endif } +/* Swap out the procedure descriptor record. */ + +void +DEFUN (ecoff_swap_pdr_out, (abfd, intern_copy, ext), + bfd *abfd AND + PDR *intern_copy AND + struct pdr_ext *ext) +{ + PDR intern[1]; + + *intern = *intern_copy; /* Make it reasonable to do in-place. */ + + bfd_h_put_32 (abfd, intern->adr, (bfd_byte *)ext->p_adr); + bfd_h_put_32 (abfd, intern->isym, (bfd_byte *)ext->p_isym); + bfd_h_put_32 (abfd, intern->iline, (bfd_byte *)ext->p_iline); + bfd_h_put_32 (abfd, intern->regmask, (bfd_byte *)ext->p_regmask); + bfd_h_put_32 (abfd, intern->regoffset, (bfd_byte *)ext->p_regoffset); + bfd_h_put_32 (abfd, intern->iopt, (bfd_byte *)ext->p_iopt); + bfd_h_put_32 (abfd, intern->fregmask, (bfd_byte *)ext->p_fregmask); + bfd_h_put_32 (abfd, intern->fregoffset, (bfd_byte *)ext->p_fregoffset); + bfd_h_put_32 (abfd, intern->frameoffset, (bfd_byte *)ext->p_frameoffset); + bfd_h_put_16 (abfd, intern->framereg, (bfd_byte *)ext->p_framereg); + bfd_h_put_16 (abfd, intern->pcreg, (bfd_byte *)ext->p_pcreg); + bfd_h_put_32 (abfd, intern->lnLow, (bfd_byte *)ext->p_lnLow); + bfd_h_put_32 (abfd, intern->lnHigh, (bfd_byte *)ext->p_lnHigh); + bfd_h_put_32 (abfd, intern->cbLineOffset, (bfd_byte *)ext->p_cbLineOffset); + +#ifdef TEST + if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) + abort(); +#endif +} /* Swap in a symbol record. */ @@ -222,6 +354,53 @@ DEFUN (ecoff_swap_sym_in, (abfd, ext_copy, intern), #endif } +/* Swap out a symbol record. */ + +void +DEFUN (ecoff_swap_sym_out, (abfd, intern_copy, ext), + bfd *abfd AND + SYMR *intern_copy AND + struct sym_ext *ext) +{ + SYMR intern[1]; + + *intern = *intern_copy; /* Make it reasonable to do in-place. */ + + bfd_h_put_32 (abfd, intern->iss, (bfd_byte *)ext->s_iss); + bfd_h_put_32 (abfd, intern->value, (bfd_byte *)ext->s_value); + + /* now the fun stuff... */ + if (abfd->xvec->header_byteorder_big_p != false) { + ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_BIG) + & SYM_BITS1_ST_BIG) + | ((intern->sc >> SYM_BITS1_SC_SH_LEFT_BIG) + & SYM_BITS1_SC_BIG)); + ext->s_bits2[0] = (((intern->sc << SYM_BITS2_SC_SH_BIG) + & SYM_BITS2_SC_BIG) + | (intern->reserved ? SYM_BITS2_RESERVED_BIG : 0) + | ((intern->index >> SYM_BITS2_INDEX_SH_LEFT_BIG) + & SYM_BITS2_INDEX_BIG)); + ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_BIG) & 0xff; + ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_BIG) & 0xff; + } else { + ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_LITTLE) + & SYM_BITS1_ST_LITTLE) + | ((intern->sc << SYM_BITS1_SC_SH_LITTLE) + & SYM_BITS1_SC_LITTLE)); + ext->s_bits2[0] = (((intern->sc >> SYM_BITS2_SC_SH_LEFT_LITTLE) + & SYM_BITS2_SC_LITTLE) + | (intern->reserved ? SYM_BITS2_RESERVED_LITTLE : 0) + | ((intern->index << SYM_BITS2_INDEX_SH_LITTLE) + & SYM_BITS2_INDEX_LITTLE)); + ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_LITTLE) & 0xff; + ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_LITTLE) & 0xff; + } + +#ifdef TEST + if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) + abort(); +#endif +} /* Swap in an external symbol record. */ @@ -255,6 +434,40 @@ DEFUN (ecoff_swap_ext_in, (abfd, ext_copy, intern), #endif } +/* Swap out an external symbol record. */ + +void +DEFUN (ecoff_swap_ext_out, (abfd, intern_copy, ext), + bfd *abfd AND + EXTR *intern_copy AND + struct ext_ext *ext) +{ + EXTR intern[1]; + + *intern = *intern_copy; /* Make it reasonable to do in-place. */ + + /* now the fun stuff... */ + if (abfd->xvec->header_byteorder_big_p != false) { + ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_BIG : 0) + | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_BIG : 0) + | (intern->weakext ? EXT_BITS1_WEAKEXT_BIG : 0)); + ext->es_bits2[0] = 0; + } else { + ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_LITTLE : 0) + | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_LITTLE : 0) + | (intern->weakext ? EXT_BITS1_WEAKEXT_LITTLE : 0)); + ext->es_bits2[0] = 0; + } + + bfd_h_put_16 (abfd, intern->ifd, (bfd_byte *)ext->es_ifd); + ecoff_swap_sym_out (abfd, &intern->asym, &ext->es_asym); + +#ifdef TEST + if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) + abort(); +#endif +} + /* Swap in a type information record. BIGEND says whether AUX symbols are big-endian or little-endian; this info comes from the file header record (fh-fBigendian). */ @@ -350,6 +563,44 @@ DEFUN (ecoff_swap_rndx_in, (bigend, ext_copy, intern), #endif } +/* Swap out a relative symbol record. BIGEND says whether it is in + big-endian or little-endian format.*/ + +void +DEFUN (ecoff_swap_rndx_out, (bigend, intern_copy, ext), + int bigend AND + RNDXR *intern_copy AND + struct rndx_ext *ext) +{ + RNDXR intern[1]; + + *intern = *intern_copy; /* Make it reasonable to do in-place. */ + + /* now the fun stuff... */ + if (bigend) { + ext->r_bits[0] = intern->rfd >> RNDX_BITS0_RFD_SH_LEFT_BIG; + ext->r_bits[1] = (((intern->rfd << RNDX_BITS1_RFD_SH_BIG) + & RNDX_BITS1_RFD_BIG) + | ((intern->index >> RNDX_BITS1_INDEX_SH_LEFT_BIG) + & RNDX_BITS1_INDEX_BIG)); + ext->r_bits[2] = intern->index >> RNDX_BITS2_INDEX_SH_LEFT_BIG; + ext->r_bits[3] = intern->index >> RNDX_BITS3_INDEX_SH_LEFT_BIG; + } else { + ext->r_bits[0] = intern->rfd >> RNDX_BITS0_RFD_SH_LEFT_LITTLE; + ext->r_bits[1] = (((intern->rfd >> RNDX_BITS1_RFD_SH_LEFT_LITTLE) + & RNDX_BITS1_RFD_LITTLE) + | ((intern->index << RNDX_BITS1_INDEX_SH_LITTLE) + & RNDX_BITS1_INDEX_LITTLE)); + ext->r_bits[2] = intern->index >> RNDX_BITS2_INDEX_SH_LEFT_LITTLE; + ext->r_bits[3] = intern->index >> RNDX_BITS3_INDEX_SH_LEFT_LITTLE; + } + +#ifdef TEST + if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) + abort(); +#endif +} + /* Swap in a relative file descriptor. */ void @@ -366,3 +617,137 @@ DEFUN (ecoff_swap_rfd_in, (abfd, ext, intern), abort(); #endif } + +/* Swap out a relative file descriptor. */ + +void +DEFUN (ecoff_swap_rfd_out, (abfd, intern, ext), + bfd *abfd AND + RFDT *intern AND + struct rfd_ext *ext) +{ + bfd_h_put_32 (abfd, *intern, (bfd_byte *)ext->rfd); + +#ifdef TEST + if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) + abort(); +#endif +} + +/* Swap in an optimization symbol. */ + +void +DEFUN (ecoff_swap_opt_in, (abfd, ext_copy, intern), + bfd *abfd AND + struct opt_ext *ext_copy AND + OPTR *intern) +{ + struct opt_ext ext[1]; + + *ext = *ext_copy; /* Make it reasonable to do in-place. */ + + if (abfd->xvec->header_byteorder_big_p != false) + { + intern->ot = ext->o_bits1[0]; + intern->value = ((ext->o_bits2[0] << OPT_BITS2_VALUE_SH_LEFT_BIG) + | (ext->o_bits3[0] << OPT_BITS2_VALUE_SH_LEFT_BIG) + | (ext->o_bits4[0] << OPT_BITS2_VALUE_SH_LEFT_BIG)); + } + else + { + intern->ot = ext->o_bits1[0]; + intern->value = ((ext->o_bits2[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE) + | (ext->o_bits3[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE) + | (ext->o_bits4[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE)); + } + + ecoff_swap_rndx_in (abfd->xvec->header_byteorder_big_p != false, + &ext->o_rndx, &intern->rndx); + + intern->offset = bfd_h_get_32 (abfd, (bfd_byte *) ext->o_offset); + +#ifdef TEST + if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) + abort(); +#endif +} + +/* Swap out an optimization symbol. */ + +void +DEFUN (ecoff_swap_opt_out, (abfd, intern_copy, ext), + bfd *abfd AND + OPTR *intern_copy AND + struct opt_ext *ext) +{ + OPTR intern[1]; + + *intern = *intern_copy; /* Make it reasonable to do in-place. */ + + if (abfd->xvec->header_byteorder_big_p != false) + { + ext->o_bits1[0] = intern->ot; + ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_BIG; + ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_BIG; + ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_BIG; + } + else + { + ext->o_bits1[0] = intern->ot; + ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_LITTLE; + ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_LITTLE; + ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_LITTLE; + } + + ecoff_swap_rndx_out (abfd->xvec->header_byteorder_big_p != false, + &intern->rndx, &ext->o_rndx); + + bfd_h_put_32 (abfd, intern->value, (bfd_byte *) ext->o_offset); + +#ifdef TEST + if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) + abort(); +#endif +} + +/* Swap in a dense number. */ + +void +DEFUN (ecoff_swap_dnr_in, (abfd, ext_copy, intern), + bfd *abfd AND + struct dnr_ext *ext_copy AND + DNR *intern) +{ + struct dnr_ext ext[1]; + + *ext = *ext_copy; /* Make it reasonable to do in-place. */ + + intern->rfd = bfd_h_get_32 (abfd, (bfd_byte *) ext->d_rfd); + intern->index = bfd_h_get_32 (abfd, (bfd_byte *) ext->d_index); + +#ifdef TEST + if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) + abort(); +#endif +} + +/* Swap out a dense number. */ + +void +DEFUN (ecoff_swap_dnr_out, (abfd, intern_copy, ext), + bfd *abfd AND + DNR *intern_copy AND + struct dnr_ext *ext) +{ + DNR intern[1]; + + *intern = *intern_copy; /* Make it reasonable to do in-place. */ + + bfd_h_put_32 (abfd, intern->rfd, (bfd_byte *) ext->d_rfd); + bfd_h_put_32 (abfd, intern->index, (bfd_byte *) ext->d_index); + +#ifdef TEST + if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) + abort(); +#endif +} |