* mips.h (struct ecoff_debug_info): Define.
This commit is contained in:
parent
c96451db27
commit
777bb8e2e4
2 changed files with 164 additions and 3 deletions
|
@ -1,3 +1,33 @@
|
|||
Wed Nov 17 17:18:16 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
|
||||
|
||||
* mips.h (struct ecoff_debug_info): Define.
|
||||
|
||||
Tue Nov 2 17:56:57 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
|
||||
|
||||
* ecoff.h (struct ecoff_debug_swap): Define.
|
||||
|
||||
Thu Oct 28 17:07:50 1993 Stan Shebs (shebs@rtl.cygnus.com)
|
||||
|
||||
* i386.h (I386LYNXMAGIC): Rename to LYNXCOFFMAGIC.
|
||||
* m68k.h (LYNXCOFFMAGIC): Define.
|
||||
* sparc.h: New file.
|
||||
|
||||
Tue Oct 19 15:34:50 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
|
||||
|
||||
* alpha.h (external_aouthdr): Split four byte padding field into
|
||||
two byte bldrev field and two byte padding field.
|
||||
|
||||
* ecoff.h (_LITA, _PDATA, _XDATA, STYP_LITA): Defined.
|
||||
|
||||
Wed Oct 13 15:52:34 1993 Ken Raeburn (raeburn@cygnus.com)
|
||||
|
||||
Sun Oct 10 17:27:10 1993 Troy Rollo (troy@cbme.unsw.edu.au)
|
||||
|
||||
* coff/internal.h: Added o_sri, o_inlib and o_vid for Apollos
|
||||
as well as R_DIR16.
|
||||
|
||||
* coff/apollo.h: New file
|
||||
|
||||
Mon Oct 11 17:16:48 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
|
||||
|
||||
* ecoff.h (REGINFO, struct ecoff_reginfo): Define.
|
||||
|
|
|
@ -12,6 +12,16 @@
|
|||
#define MIPS_MAGIC_LITTLE 0x0162
|
||||
#define MIPS_MAGIC_BIG 0x0160
|
||||
|
||||
/* These are the magic numbers used for MIPS code compiled at ISA
|
||||
level 2. */
|
||||
#define MIPS_MAGIC_LITTLE2 0x0166
|
||||
#define MIPS_MAGIC_BIG2 0x0163
|
||||
|
||||
/* These are the magic numbers used for MIPS code compiled at ISA
|
||||
level 3. */
|
||||
#define MIPS_MAGIC_LITTLE3 0x142
|
||||
#define MIPS_MAGIC_BIG3 0x140
|
||||
|
||||
/* Alpha magic numbers used in filehdr. */
|
||||
#define ALPHA_MAGIC 0x183
|
||||
|
||||
|
@ -26,19 +36,25 @@
|
|||
#define _RDATA ".rdata"
|
||||
#define _SDATA ".sdata"
|
||||
#define _SBSS ".sbss"
|
||||
#define _LITA ".lita"
|
||||
#define _LIT4 ".lit4"
|
||||
#define _LIT8 ".lit8"
|
||||
#define _LIB ".lib"
|
||||
#define _INIT ".init"
|
||||
#define _FINI ".fini"
|
||||
#define _PDATA ".pdata"
|
||||
#define _XDATA ".xdata"
|
||||
|
||||
/* ECOFF uses some additional section flags. */
|
||||
#define STYP_RDATA 0x100
|
||||
#define STYP_SDATA 0x200
|
||||
#define STYP_SBSS 0x400
|
||||
#define STYP_ECOFF_FINI 0x1000000
|
||||
#define STYP_LITA 0x4000000
|
||||
#define STYP_LIT8 0x8000000
|
||||
#define STYP_LIT4 0x10000000
|
||||
#define STYP_ECOFF_INIT 0x80000000
|
||||
#define STYP_OTHER_LOAD STYP_ECOFF_INIT
|
||||
#define STYP_OTHER_LOAD (STYP_ECOFF_INIT | STYP_ECOFF_FINI)
|
||||
|
||||
/* The linker needs a section to hold small common variables while
|
||||
linking. There is no convenient way to create it when the linker
|
||||
|
@ -46,6 +62,34 @@
|
|||
writing it out. */
|
||||
#define SCOMMON ".scommon"
|
||||
|
||||
/* The ECOFF a.out header carries information about register masks and
|
||||
the gp value. The assembler needs to be able to write out this
|
||||
information, and objcopy needs to be able to copy it from one file
|
||||
to another. To handle this in BFD, we use a dummy section to hold
|
||||
the information. We call this section .reginfo, since MIPS ELF has
|
||||
a .reginfo section which serves a similar purpose. When BFD
|
||||
recognizes an ECOFF object, it copies the information into a
|
||||
private data structure. When the .reginfo section is read, the
|
||||
information is retrieved from the private data structure. When the
|
||||
.reginfo section is written, the information in the private data
|
||||
structure is updated. The contents of the .reginfo section, as
|
||||
seen by programs outside BFD, is a ecoff_reginfo structure. The
|
||||
contents of the structure are as seen on the host, so no swapping
|
||||
issues arise.
|
||||
|
||||
The assembler used to update the private BFD data structures
|
||||
directly. With this approach, it instead just creates a .reginfo
|
||||
section and updates that. The real advantage of this approach is
|
||||
that objcopy works automatically. */
|
||||
#define REGINFO ".reginfo"
|
||||
struct ecoff_reginfo
|
||||
{
|
||||
bfd_vma gp_value; /* GP register value. */
|
||||
unsigned long gprmask; /* General registers used. */
|
||||
unsigned long cprmask[4]; /* Coprocessor registers used. */
|
||||
unsigned long fprmask; /* Floating pointer registers used. */
|
||||
};
|
||||
|
||||
/* If the extern bit in a reloc is 1, then r_symndx is an index into
|
||||
the external symbol table. If the extern bit is 0, then r_symndx
|
||||
indicates a section, and is one of the following values. */
|
||||
|
@ -193,8 +237,8 @@ union aux_ext {
|
|||
|
||||
#define AUX_PUT_ANY(bigend, val, ax, field) \
|
||||
((bigend) \
|
||||
? (bfd_putb32 ((val), (ax)->field), 0) \
|
||||
: (bfd_putl32 ((val), (ax)->field), 0))
|
||||
? (bfd_putb32 ((bfd_vma) (val), (ax)->field), 0) \
|
||||
: (bfd_putl32 ((bfd_vma) (val), (ax)->field), 0))
|
||||
|
||||
#define AUX_PUT_DNLOW(bigend, val, ax) \
|
||||
AUX_PUT_ANY ((bigend), (val), (ax), a_dnLow)
|
||||
|
@ -219,4 +263,91 @@ extern void ecoff_swap_rndx_in PARAMS ((int bigend, struct rndx_ext *,
|
|||
extern void ecoff_swap_rndx_out PARAMS ((int bigend, RNDXR *,
|
||||
struct rndx_ext *));
|
||||
|
||||
/********************** SWAPPING **********************/
|
||||
|
||||
/* The generic ECOFF code needs to be able to swap debugging
|
||||
information in and out in the specific format used by a particular
|
||||
ECOFF implementation. This structure provides the information
|
||||
needed to do this. */
|
||||
|
||||
struct ecoff_debug_swap
|
||||
{
|
||||
/* Symbol table magic number. */
|
||||
int sym_magic;
|
||||
/* Alignment of debugging information. E.g., 4. */
|
||||
bfd_size_type debug_align;
|
||||
/* Sizes of external symbolic information. */
|
||||
bfd_size_type external_hdr_size;
|
||||
bfd_size_type external_dnr_size;
|
||||
bfd_size_type external_pdr_size;
|
||||
bfd_size_type external_sym_size;
|
||||
bfd_size_type external_opt_size;
|
||||
bfd_size_type external_fdr_size;
|
||||
bfd_size_type external_rfd_size;
|
||||
bfd_size_type external_ext_size;
|
||||
/* Functions to swap in external symbolic data. */
|
||||
void (*swap_hdr_in) PARAMS ((bfd *, PTR, HDRR *));
|
||||
void (*swap_dnr_in) PARAMS ((bfd *, PTR, DNR *));
|
||||
void (*swap_pdr_in) PARAMS ((bfd *, PTR, PDR *));
|
||||
void (*swap_sym_in) PARAMS ((bfd *, PTR, SYMR *));
|
||||
void (*swap_opt_in) PARAMS ((bfd *, PTR, OPTR *));
|
||||
void (*swap_fdr_in) PARAMS ((bfd *, PTR, FDR *));
|
||||
void (*swap_rfd_in) PARAMS ((bfd *, PTR, RFDT *));
|
||||
void (*swap_ext_in) PARAMS ((bfd *, PTR, EXTR *));
|
||||
/* Functions to swap out external symbolic data. */
|
||||
void (*swap_hdr_out) PARAMS ((bfd *, const HDRR *, PTR));
|
||||
void (*swap_dnr_out) PARAMS ((bfd *, const DNR *, PTR));
|
||||
void (*swap_pdr_out) PARAMS ((bfd *, const PDR *, PTR));
|
||||
void (*swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR));
|
||||
void (*swap_opt_out) PARAMS ((bfd *, const OPTR *, PTR));
|
||||
void (*swap_fdr_out) PARAMS ((bfd *, const FDR *, PTR));
|
||||
void (*swap_rfd_out) PARAMS ((bfd *, const RFDT *, PTR));
|
||||
void (*swap_ext_out) PARAMS ((bfd *, const EXTR *, PTR));
|
||||
/* As noted above, it so happens that the auxiliary type information
|
||||
has the same type and format for all known ECOFF targets. I don't
|
||||
see any reason that that should change, so at least for now the
|
||||
auxiliary swapping information is not in this table. */
|
||||
};
|
||||
|
||||
/********************** SYMBOLS **********************/
|
||||
|
||||
/* For efficiency, gdb deals directly with the unswapped symbolic
|
||||
information (that way it only takes the time to swap information
|
||||
that it really needs to read). gdb originally retrieved the
|
||||
information directly from the BFD backend information, but that
|
||||
strategy, besides being sort of ugly, does not work for MIPS ELF,
|
||||
which also uses ECOFF debugging information. This structure holds
|
||||
pointers to the (mostly) unswapped symbolic information. */
|
||||
|
||||
struct ecoff_debug_info
|
||||
{
|
||||
/* The swapped ECOFF symbolic header. */
|
||||
HDRR symbolic_header;
|
||||
|
||||
/* Pointers to the unswapped symbolic information. Note that the
|
||||
pointers to external structures point to different sorts of
|
||||
information on different ECOFF targets. The ecoff_debug_swap
|
||||
structure provides the sizes of the structures and the functions
|
||||
needed to swap the information in and out. These pointers are
|
||||
all pointers to arrays, not single structures. They will be NULL
|
||||
if there are no instances of the relevant structure. */
|
||||
unsigned char *line;
|
||||
PTR external_dnr; /* struct dnr_ext */
|
||||
PTR external_pdr; /* struct pdr_ext */
|
||||
PTR external_sym; /* struct sym_ext */
|
||||
PTR external_opt; /* struct opt_ext */
|
||||
union aux_ext *external_aux;
|
||||
char *ss;
|
||||
char *ssext;
|
||||
PTR external_fdr; /* struct fdr_ext */
|
||||
PTR external_rfd; /* struct rfd_ext */
|
||||
PTR external_ext; /* struct ext_ext */
|
||||
|
||||
/* The swapped FDR information. Currently this is never NULL, but
|
||||
code using this structure should probably double-check in case
|
||||
this changes in the future. This is a pointer to an array, not a
|
||||
single structure. */
|
||||
FDR *fdr;
|
||||
};
|
||||
|
||||
#endif /* ! defined (ECOFF_H) */
|
||||
|
|
Loading…
Reference in a new issue