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.
This commit is contained in:
Ian Lance Taylor 1993-01-15 23:39:05 +00:00
parent 9dcfbb6781
commit 8fa0d3a012
3 changed files with 1774 additions and 134 deletions

View File

@ -1,3 +1,15 @@
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.
Thu Jan 14 15:51:58 1993 Steve Chamberlain (sac@thepub.cygnus.com)
* libcoff.h, coffgen.c (coff_count_linenumbers), coffcode.h

File diff suppressed because it is too large Load Diff

View File

@ -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
}