diff options
-rw-r--r-- | include/coff/ChangeLog | 30 | ||||
-rw-r--r-- | include/coff/ecoff.h | 137 |
2 files changed, 164 insertions, 3 deletions
diff --git a/include/coff/ChangeLog b/include/coff/ChangeLog index 5911dfe..5830a14 100644 --- a/include/coff/ChangeLog +++ b/include/coff/ChangeLog @@ -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. diff --git a/include/coff/ecoff.h b/include/coff/ecoff.h index 81bb818..2b3acdd 100644 --- a/include/coff/ecoff.h +++ b/include/coff/ecoff.h @@ -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) */ |