* config/obj-ecoff.c: Updated for BFD ECOFF changes. Now gets the

swapping routines and external structure sizes via the
	ecoff_backend information.  No longer includes coff/mips.h.
This commit is contained in:
Ian Lance Taylor 1993-08-03 20:25:58 +00:00
parent 045f6b66d3
commit 4573d18601
2 changed files with 109 additions and 86 deletions

View File

@ -1,3 +1,9 @@
Tue Aug 3 11:29:06 1993 Ian Lance Taylor (ian@cygnus.com)
* config/obj-ecoff.c: Updated for BFD ECOFF changes. Now gets the
swapping routines and external structure sizes via the
ecoff_backend information. No longer includes coff/mips.h.
Mon Aug 2 17:35:48 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) Mon Aug 2 17:35:48 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
* config/obj-ecoff.c (get_tag): Save tag name in permanent memory * config/obj-ecoff.c (get_tag): Save tag name in permanent memory

View File

@ -23,10 +23,9 @@
#include "as.h" #include "as.h"
#include "coff/internal.h" #include "coff/internal.h"
#include "coff/mips.h"
#include "coff/sym.h" #include "coff/sym.h"
#include "coff/symconst.h" #include "coff/symconst.h"
#include "coff/ecoff-ext.h" #include "coff/ecoff.h"
#include "aout/stab_gnu.h" #include "aout/stab_gnu.h"
#include "../bfd/libecoff.h" #include "../bfd/libecoff.h"
@ -1461,7 +1460,7 @@ static void obj_ecoff_mask PARAMS ((int));
static void mark_stabs PARAMS ((int)); static void mark_stabs PARAMS ((int));
static char *ecoff_add_bytes PARAMS ((char **buf, char **bufend, static char *ecoff_add_bytes PARAMS ((char **buf, char **bufend,
char *bufptr, long need)); char *bufptr, long need));
static long ecoff_longword_adjust PARAMS ((char **buf, char **bufend, static long ecoff_padding_adjust PARAMS ((char **buf, char **bufend,
long offset, char **bufptrptr)); long offset, char **bufptrptr));
static long ecoff_build_lineno PARAMS ((char **buf, char **bufend, static long ecoff_build_lineno PARAMS ((char **buf, char **bufend,
long offset, long *linecntptr)); long offset, long *linecntptr));
@ -1727,7 +1726,7 @@ add_ecoff_symbol (str, type, storage, sym_value, value, indx)
++vp->num_allocated; ++vp->num_allocated;
if (MIPS_IS_STAB (&psym->ecoff_sym)) if (ECOFF_IS_STAB (&psym->ecoff_sym))
return psym; return psym;
/* Save the symbol within the hash table if this is a static /* Save the symbol within the hash table if this is a static
@ -2285,7 +2284,7 @@ add_file (file_name, indx)
(void) add_ecoff_symbol (file_name, st_Nil, sc_Nil, (void) add_ecoff_symbol (file_name, st_Nil, sc_Nil,
symbol_new ("L0\001", now_seg, symbol_new ("L0\001", now_seg,
frag_now_fix (), frag_now), frag_now_fix (), frag_now),
0, MIPS_MARK_STAB (N_SOL)); 0, ECOFF_MARK_STAB (N_SOL));
return; return;
} }
@ -3305,7 +3304,7 @@ mark_stabs (ignore)
stabs_seen = 1; stabs_seen = 1;
(void) add_ecoff_symbol (stabs_symbol, stNil, scInfo, (void) add_ecoff_symbol (stabs_symbol, stNil, scInfo,
(symbolS *) NULL, (symbolS *) NULL,
(symint_t) -1, MIPS_MARK_STAB (0)); (symint_t) -1, ECOFF_MARK_STAB (0));
} }
} }
@ -3511,7 +3510,7 @@ obj_ecoff_stab (type)
} }
} }
code = MIPS_MARK_STAB (code); code = ECOFF_MARK_STAB (code);
} }
(void) add_ecoff_symbol (string, st, sc, sym, value, code); (void) add_ecoff_symbol (string, st, sc, sym, value, code);
@ -3542,20 +3541,24 @@ ecoff_add_bytes (buf, bufend, bufptr, need)
return *buf + at; return *buf + at;
} }
/* Adjust the symbolic information buffer to a longword boundary. */ /* Adjust the symbolic information buffer to the alignment required
for the ECOFF target debugging information. */
static long static long
ecoff_longword_adjust (buf, bufend, offset, bufptrptr) ecoff_padding_adjust (buf, bufend, offset, bufptrptr)
char **buf; char **buf;
char **bufend; char **bufend;
long offset; long offset;
char **bufptrptr; char **bufptrptr;
{ {
if ((offset & 3) != 0) bfd_size_type align;
align = ecoff_backend (stdoutput)->debug_align;
if ((offset & (align - 1)) != 0)
{ {
long add; long add;
add = 4 - (offset & 3); add = align - (offset & (align - 1));
if (*bufend - (*buf + offset) < add) if (*bufend - (*buf + offset) < add)
(void) ecoff_add_bytes (buf, bufend, *buf + offset, add); (void) ecoff_add_bytes (buf, bufend, *buf + offset, add);
memset (*buf + offset, 0, add); memset (*buf + offset, 0, add);
@ -3753,7 +3756,7 @@ ecoff_build_lineno (buf, bufend, offset, linecntptr)
if (linecntptr != (long *) NULL) if (linecntptr != (long *) NULL)
*linecntptr += totcount; *linecntptr += totcount;
c = ecoff_longword_adjust (buf, bufend, c, &bufptr); c = ecoff_padding_adjust (buf, bufend, c, &bufptr);
return c; return c;
} }
@ -3778,14 +3781,22 @@ ecoff_build_symbols (buf,
varray_t *ext_strings; varray_t *ext_strings;
struct hash_control *ext_str_hash; struct hash_control *ext_str_hash;
{ {
struct sym_ext *sym_out; const bfd_size_type external_sym_size =
struct ext_ext *ext_out; ecoff_backend (stdoutput)->external_sym_size;
const bfd_size_type external_ext_size =
ecoff_backend (stdoutput)->external_ext_size;
void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR))
= ecoff_backend (stdoutput)->swap_sym_out;
void (* const swap_ext_out) PARAMS ((bfd *, const EXTR *, PTR))
= ecoff_backend (stdoutput)->swap_ext_out;
char *sym_out;
char *ext_out;
long isym; long isym;
long iext; long iext;
vlinks_t *file_link; vlinks_t *file_link;
sym_out = (struct sym_ext *) (*buf + offset); sym_out = *buf + offset;
ext_out = (struct ext_ext *) (*extbuf + *extoffset); ext_out = *extbuf + *extoffset;
isym = 0; isym = 0;
iext = 0; iext = 0;
@ -3885,9 +3896,9 @@ ecoff_build_symbols (buf,
indx = sym_ptr->ecoff_sym.index; indx = sym_ptr->ecoff_sym.index;
if (sym_ptr->ecoff_sym.st == st_Nil if (sym_ptr->ecoff_sym.st == st_Nil
&& sym_ptr->ecoff_sym.sc == sc_Nil && sym_ptr->ecoff_sym.sc == sc_Nil
&& (! MIPS_IS_STAB (&sym_ptr->ecoff_sym) && (! ECOFF_IS_STAB (&sym_ptr->ecoff_sym)
|| ((MIPS_UNMARK_STAB (indx) != N_LBRAC) || ((ECOFF_UNMARK_STAB (indx) != N_LBRAC)
&& (MIPS_UNMARK_STAB (indx) != N_RBRAC)))) && (ECOFF_UNMARK_STAB (indx) != N_RBRAC))))
{ {
segT seg; segT seg;
const char *segname; const char *segname;
@ -3955,7 +3966,7 @@ ecoff_build_symbols (buf,
|| ! S_IS_DEFINED (as_sym)) || ! S_IS_DEFINED (as_sym))
&& sym_ptr->proc_ptr == (proc_t *) NULL && sym_ptr->proc_ptr == (proc_t *) NULL
&& sym_ptr->ecoff_sym.st != (int) st_Nil && sym_ptr->ecoff_sym.st != (int) st_Nil
&& ! MIPS_IS_STAB (&sym_ptr->ecoff_sym)) && ! ECOFF_IS_STAB (&sym_ptr->ecoff_sym))
local = 0; local = 0;
/* If an st_end symbol has an associated gas /* If an st_end symbol has an associated gas
@ -3992,11 +4003,12 @@ ecoff_build_symbols (buf,
|| begin_type == st_Block) || begin_type == st_Block)
{ {
begin_ptr->ecoff_sym.index = isym - ifilesym + 1; begin_ptr->ecoff_sym.index = isym - ifilesym + 1;
ecoff_swap_sym_out (stdoutput, (*swap_sym_out) (stdoutput,
&begin_ptr->ecoff_sym, &begin_ptr->ecoff_sym,
(((struct sym_ext *) (*buf
(*buf + offset)) + offset
+ begin_ptr->sym_index)); + (begin_ptr->sym_index
* external_sym_size)));
} }
else else
{ {
@ -4048,14 +4060,13 @@ ecoff_build_symbols (buf,
if (local) if (local)
{ {
if (*bufend - (char *) sym_out < sizeof (struct sym_ext)) if (*bufend - sym_out < external_sym_size)
sym_out = ((struct sym_ext *) sym_out = ecoff_add_bytes (buf, bufend,
ecoff_add_bytes (buf, bufend, sym_out,
(char *) sym_out, external_sym_size);
sizeof (struct sym_ext))); (*swap_sym_out) (stdoutput, &sym_ptr->ecoff_sym,
ecoff_swap_sym_out (stdoutput, &sym_ptr->ecoff_sym, sym_out);
sym_out); sym_out += external_sym_size;
++sym_out;
sym_ptr->sym_index = isym; sym_ptr->sym_index = isym;
@ -4070,7 +4081,7 @@ ecoff_build_symbols (buf,
if (as_sym != (symbolS *) NULL if (as_sym != (symbolS *) NULL
&& (S_IS_EXTERNAL (as_sym) && (S_IS_EXTERNAL (as_sym)
|| ! S_IS_DEFINED (as_sym)) || ! S_IS_DEFINED (as_sym))
&& ! MIPS_IS_STAB (&sym_ptr->ecoff_sym)) && ! ECOFF_IS_STAB (&sym_ptr->ecoff_sym))
{ {
EXTR ext; EXTR ext;
@ -4087,15 +4098,13 @@ ecoff_build_symbols (buf,
ext_str_hash, ext_str_hash,
S_GET_NAME (as_sym), S_GET_NAME (as_sym),
(shash_t **) NULL); (shash_t **) NULL);
if (*extbufend - (char *) ext_out if (*extbufend - ext_out < external_ext_size)
< sizeof (struct ext_ext)) ext_out = ecoff_add_bytes (extbuf, extbufend,
ext_out = ((struct ext_ext *) ext_out,
ecoff_add_bytes (extbuf, extbufend, external_ext_size);
(char *) ext_out, (*swap_ext_out) (stdoutput, &ext, ext_out);
sizeof (struct ext_ext)));
ecoff_swap_ext_out (stdoutput, &ext, ext_out);
ecoff_set_sym_index (as_sym->bsym, iext); ecoff_set_sym_index (as_sym->bsym, iext);
++ext_out; ext_out += external_ext_size;
++iext; ++iext;
} }
} }
@ -4104,8 +4113,8 @@ ecoff_build_symbols (buf,
} }
} }
*extoffset += iext * sizeof (struct ext_ext); *extoffset += iext * external_ext_size;
return offset + isym * sizeof (struct sym_ext); return offset + isym * external_sym_size;
} }
/* Swap out the procedure information. */ /* Swap out the procedure information. */
@ -4116,12 +4125,16 @@ ecoff_build_procs (buf, bufend, offset)
char **bufend; char **bufend;
long offset; long offset;
{ {
struct pdr_ext *pdr_out; const bfd_size_type external_pdr_size
= ecoff_backend (stdoutput)->external_pdr_size;
void (* const swap_pdr_out) PARAMS ((bfd *, const PDR *, PTR))
= ecoff_backend (stdoutput)->swap_pdr_out;
char *pdr_out;
int first_fil; int first_fil;
long iproc; long iproc;
vlinks_t *file_link; vlinks_t *file_link;
pdr_out = (struct pdr_ext *) (*buf + offset); pdr_out = *buf + offset;
first_fil = 1; first_fil = 1;
iproc = 0; iproc = 0;
@ -4180,13 +4193,12 @@ ecoff_build_procs (buf, bufend, offset)
first = 0; first = 0;
} }
proc_ptr->pdr.adr = adr - fil_ptr->fdr.adr; proc_ptr->pdr.adr = adr - fil_ptr->fdr.adr;
if (*bufend - (char *) pdr_out < sizeof (struct pdr_ext)) if (*bufend - pdr_out < external_pdr_size)
pdr_out = ((struct pdr_ext *) pdr_out = ecoff_add_bytes (buf, bufend,
ecoff_add_bytes (buf, bufend, pdr_out,
(char *) pdr_out, external_pdr_size);
sizeof (struct pdr_ext))); (*swap_pdr_out) (stdoutput, &proc_ptr->pdr, pdr_out);
ecoff_swap_pdr_out (stdoutput, &proc_ptr->pdr, pdr_out); pdr_out += external_pdr_size;
++pdr_out;
++iproc; ++iproc;
} }
} }
@ -4194,7 +4206,7 @@ ecoff_build_procs (buf, bufend, offset)
} }
} }
return offset + iproc * sizeof (struct pdr_ext); return offset + iproc * external_pdr_size;
} }
/* Swap out the aux information. */ /* Swap out the aux information. */
@ -4384,7 +4396,7 @@ ecoff_build_ss (buf, bufend, offset)
} }
} }
return ecoff_longword_adjust (buf, bufend, offset + iss, (char **) NULL); return ecoff_padding_adjust (buf, bufend, offset + iss, (char **) NULL);
} }
/* Swap out the file descriptors. */ /* Swap out the file descriptors. */
@ -4395,13 +4407,17 @@ ecoff_build_fdr (buf, bufend, offset)
char **bufend; char **bufend;
long offset; long offset;
{ {
const bfd_size_type external_fdr_size
= ecoff_backend (stdoutput)->external_fdr_size;
void (* const swap_fdr_out) PARAMS ((bfd *, const FDR *, PTR))
= ecoff_backend (stdoutput)->swap_fdr_out;
long ifile; long ifile;
struct fdr_ext *fdr_out; char *fdr_out;
vlinks_t *file_link; vlinks_t *file_link;
ifile = 0; ifile = 0;
fdr_out = (struct fdr_ext *) (*buf + offset); fdr_out = *buf + offset;
for (file_link = file_desc.first; for (file_link = file_desc.first;
file_link != (vlinks_t *) NULL; file_link != (vlinks_t *) NULL;
@ -4419,17 +4435,16 @@ ecoff_build_fdr (buf, bufend, offset)
fil_end = fil_ptr + fil_cnt; fil_end = fil_ptr + fil_cnt;
for (; fil_ptr < fil_end; fil_ptr++) for (; fil_ptr < fil_end; fil_ptr++)
{ {
if (*bufend - (char *) fdr_out < sizeof (struct fdr_ext)) if (*bufend - fdr_out < external_fdr_size)
fdr_out = ((struct fdr_ext *) fdr_out = ecoff_add_bytes (buf, bufend, fdr_out,
ecoff_add_bytes (buf, bufend, (char *) fdr_out, external_fdr_size);
sizeof (struct fdr_ext))); (*swap_fdr_out) (stdoutput, &fil_ptr->fdr, fdr_out);
ecoff_swap_fdr_out (stdoutput, &fil_ptr->fdr, fdr_out); fdr_out += external_fdr_size;
++fdr_out;
++ifile; ++ifile;
} }
} }
return offset + ifile * sizeof (struct fdr_ext); return offset + ifile * external_fdr_size;
} }
/* Swap out the symbols and debugging information for BFD. */ /* Swap out the symbols and debugging information for BFD. */
@ -4437,6 +4452,8 @@ ecoff_build_fdr (buf, bufend, offset)
void void
ecoff_frob_file () ecoff_frob_file ()
{ {
const struct ecoff_backend_data * const backend = ecoff_backend (stdoutput);
const bfd_size_type external_pdr_size = backend->external_pdr_size;
tag_t *ptag; tag_t *ptag;
tag_t *ptag_next; tag_t *ptag_next;
efdr_t *fil_ptr; efdr_t *fil_ptr;
@ -4549,10 +4566,10 @@ ecoff_frob_file ()
space at this point. */ space at this point. */
hdr->ipdMax = proc_cnt; hdr->ipdMax = proc_cnt;
hdr->cbPdOffset = offset; hdr->cbPdOffset = offset;
if (bufend - (buf + offset) < proc_cnt * sizeof (struct pdr_ext)) if (bufend - (buf + offset) < proc_cnt * external_pdr_size)
(void) ecoff_add_bytes (&buf, &bufend, buf + offset, (void) ecoff_add_bytes (&buf, &bufend, buf + offset,
proc_cnt * sizeof (struct pdr_ext)); proc_cnt * external_pdr_size);
offset += proc_cnt * sizeof (struct pdr_ext); offset += proc_cnt * external_pdr_size;
/* Build the symbols. It's convenient to build both the local and /* Build the symbols. It's convenient to build both the local and
external symbols at the same time. We can put the local symbols external symbols at the same time. We can put the local symbols
@ -4567,7 +4584,7 @@ ecoff_frob_file ()
offset = ecoff_build_symbols (&buf, &bufend, offset, offset = ecoff_build_symbols (&buf, &bufend, offset,
&extbuf, &extbufend, &extoffset, &extbuf, &extbufend, &extoffset,
&ext_strings, ext_str_hash); &ext_strings, ext_str_hash);
hdr->isymMax = (offset - hdr->cbSymOffset) / sizeof (struct sym_ext); hdr->isymMax = (offset - hdr->cbSymOffset) / backend->external_sym_size;
/* Building the symbols initializes the symbol index in the PDR's. /* Building the symbols initializes the symbol index in the PDR's.
Now we can swap out the PDR's. */ Now we can swap out the PDR's. */
@ -4590,7 +4607,7 @@ ecoff_frob_file ()
/* Copy out the external strings. */ /* Copy out the external strings. */
hdr->cbSsExtOffset = offset; hdr->cbSsExtOffset = offset;
offset += ecoff_build_strings (&buf, &bufend, offset, &ext_strings); offset += ecoff_build_strings (&buf, &bufend, offset, &ext_strings);
offset = ecoff_longword_adjust (&buf, &bufend, offset, (char **) NULL); offset = ecoff_padding_adjust (&buf, &bufend, offset, (char **) NULL);
hdr->issExtMax = offset - hdr->cbSsExtOffset; hdr->issExtMax = offset - hdr->cbSsExtOffset;
/* We don't use relative file descriptors. */ /* We don't use relative file descriptors. */
@ -4600,7 +4617,7 @@ ecoff_frob_file ()
/* Swap out the file descriptors. */ /* Swap out the file descriptors. */
hdr->cbFdOffset = offset; hdr->cbFdOffset = offset;
offset = ecoff_build_fdr (&buf, &bufend, offset); offset = ecoff_build_fdr (&buf, &bufend, offset);
hdr->ifdMax = (offset - hdr->cbFdOffset) / sizeof (struct fdr_ext); hdr->ifdMax = (offset - hdr->cbFdOffset) / backend->external_fdr_size;
/* Copy out the external symbols. */ /* Copy out the external symbols. */
hdr->cbExtOffset = offset; hdr->cbExtOffset = offset;
@ -4608,28 +4625,28 @@ ecoff_frob_file ()
(void) ecoff_add_bytes (&buf, &bufend, buf + offset, extoffset); (void) ecoff_add_bytes (&buf, &bufend, buf + offset, extoffset);
memcpy (buf + offset, extbuf, extoffset); memcpy (buf + offset, extbuf, extoffset);
offset += extoffset; offset += extoffset;
hdr->iextMax = (offset - hdr->cbExtOffset) / sizeof (struct ext_ext); hdr->iextMax = (offset - hdr->cbExtOffset) / backend->external_ext_size;
know ((offset & 3) == 0); know ((offset & (backend->debug_align - 1)) == 0);
/* That completes the symbolic debugging information. We must now /* That completes the symbolic debugging information. We must now
finish up the symbolic header and the ecoff_tdata structure. */ finish up the symbolic header and the ecoff_tdata structure. */
set = buf; set = buf;
#define SET(ptr, count, type) \ #define SET(ptr, count, type, size) \
ecoff_data (stdoutput)->ptr = (type *) set; \ ecoff_data (stdoutput)->ptr = (type) set; \
set += hdr->count * sizeof (type) set += hdr->count * size
SET (line, cbLine, unsigned char); SET (line, cbLine, unsigned char *, sizeof (unsigned char));
SET (external_dnr, idnMax, struct dnr_ext); SET (external_dnr, idnMax, PTR, backend->external_dnr_size);
SET (external_pdr, ipdMax, struct pdr_ext); SET (external_pdr, ipdMax, PTR, backend->external_pdr_size);
SET (external_sym, isymMax, struct sym_ext); SET (external_sym, isymMax, PTR, backend->external_sym_size);
SET (external_opt, ioptMax, struct opt_ext); SET (external_opt, ioptMax, PTR, backend->external_opt_size);
SET (external_aux, iauxMax, union aux_ext); SET (external_aux, iauxMax, union aux_ext *, sizeof (union aux_ext));
SET (ss, issMax, char); SET (ss, issMax, char *, sizeof (char));
SET (ssext, issExtMax, char); SET (ssext, issExtMax, char *, sizeof (char));
SET (external_rfd, crfd, struct rfd_ext); SET (external_rfd, crfd, PTR, backend->external_rfd_size);
SET (external_fdr, ifdMax, struct fdr_ext); SET (external_fdr, ifdMax, PTR, backend->external_fdr_size);
SET (external_ext, iextMax, struct ext_ext); SET (external_ext, iextMax, PTR, backend->external_ext_size);
#undef SET #undef SET