home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gdb-4.16-base.tgz / gdb-4.16-base.tar / fsf / gdb / include / coff / sh.h < prev    next >
C/C++ Source or Header  |  1995-10-04  |  7KB  |  254 lines

  1. /*** coff information for Hitachi SH */
  2.  
  3. /********************** FILE HEADER **********************/
  4.  
  5. struct external_filehdr {
  6.     char f_magic[2];    /* magic number            */
  7.     char f_nscns[2];    /* number of sections        */
  8.     char f_timdat[4];    /* time & date stamp        */
  9.     char f_symptr[4];    /* file pointer to symtab    */
  10.     char f_nsyms[4];    /* number of symtab entries    */
  11.     char f_opthdr[2];    /* sizeof(optional hdr)        */
  12.     char f_flags[2];    /* flags            */
  13. };
  14.  
  15.  
  16.  
  17. #define    SH_ARCH_MAGIC_BIG    0x0500
  18. #define    SH_ARCH_MAGIC_LITTLE    0x0550  /* Little endian SH */
  19.  
  20.  
  21. #define SHBADMAG(x) \
  22.  (((x).f_magic!=SH_ARCH_MAGIC_BIG) && \
  23.   ((x).f_magic!=SH_ARCH_MAGIC_LITTLE))
  24.  
  25. #define    FILHDR    struct external_filehdr
  26. #define    FILHSZ    sizeof(FILHDR)
  27.  
  28.  
  29. /********************** AOUT "OPTIONAL HEADER" **********************/
  30.  
  31.  
  32. typedef struct 
  33. {
  34.   char     magic[2];        /* type of file                */
  35.   char    vstamp[2];        /* version stamp            */
  36.   char    tsize[4];        /* text size in bytes, padded to FW bdry*/
  37.   char    dsize[4];        /* initialized data "  "        */
  38.   char    bsize[4];        /* uninitialized data "   "        */
  39.   char    entry[4];        /* entry pt.                */
  40.   char     text_start[4];        /* base of text used for this file */
  41.   char     data_start[4];        /* base of data used for this file */
  42. }
  43. AOUTHDR;
  44.  
  45.  
  46. #define AOUTHDRSZ (sizeof(AOUTHDR))
  47. #define AOUTSZ (sizeof(AOUTHDR))
  48.  
  49.  
  50.  
  51.  
  52. /********************** SECTION HEADER **********************/
  53.  
  54.  
  55. struct external_scnhdr {
  56.     char        s_name[8];    /* section name            */
  57.     char        s_paddr[4];    /* physical address, aliased s_nlib */
  58.     char        s_vaddr[4];    /* virtual address        */
  59.     char        s_size[4];    /* section size            */
  60.     char        s_scnptr[4];    /* file ptr to raw data for section */
  61.     char        s_relptr[4];    /* file ptr to relocation    */
  62.     char        s_lnnoptr[4];    /* file ptr to line numbers    */
  63.     char        s_nreloc[2];    /* number of relocation entries    */
  64.     char        s_nlnno[2];    /* number of line number entries*/
  65.     char        s_flags[4];    /* flags            */
  66. };
  67.  
  68. /*
  69.  * names of "special" sections
  70.  */
  71. #define _TEXT    ".text"
  72. #define _DATA    ".data"
  73. #define _BSS    ".bss"
  74.  
  75.  
  76. #define    SCNHDR    struct external_scnhdr
  77. #define    SCNHSZ    sizeof(SCNHDR)
  78.  
  79.  
  80. /********************** LINE NUMBERS **********************/
  81.  
  82. /* 1 line number entry for every "breakpointable" source line in a section.
  83.  * Line numbers are grouped on a per function basis; first entry in a function
  84.  * grouping will have l_lnno = 0 and in place of physical address will be the
  85.  * symbol table index of the function name.
  86.  */
  87. struct external_lineno {
  88.     union {
  89.         char l_symndx[4];    /* function name symbol index, iff l_lnno == 0*/
  90.         char l_paddr[4];    /* (physical) address of line number    */
  91.     } l_addr;
  92.     char l_lnno[4];    /* line number        */
  93. };
  94.  
  95. #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) (ext->l_lnno));
  96. #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_32(abfd,val,  (bfd_byte *) (ext->l_lnno));
  97.  
  98. #define    LINENO    struct external_lineno
  99. #define    LINESZ    sizeof(LINENO) 
  100.  
  101.  
  102. /********************** SYMBOLS **********************/
  103.  
  104. #define E_SYMNMLEN    8    /* # characters in a symbol name    */
  105. #define E_FILNMLEN    14    /* # characters in a file name        */
  106. #define E_DIMNUM    4    /* # array dimensions in auxiliary entry */
  107.  
  108. struct external_syment 
  109. {
  110.   union {
  111.     char e_name[E_SYMNMLEN];
  112.     struct {
  113.       char e_zeroes[4];
  114.       char e_offset[4];
  115.     } e;
  116.   } e;
  117.   char e_value[4];
  118.   char e_scnum[2];
  119.   char e_type[2];
  120.   char e_sclass[1];
  121.   char e_numaux[1];
  122. };
  123.  
  124.  
  125.  
  126. #define N_BTMASK    (017)
  127. #define N_TMASK        (060)
  128. #define N_BTSHFT    (4)
  129. #define N_TSHIFT    (2)
  130.   
  131.  
  132. union external_auxent {
  133.     struct {
  134.         char x_tagndx[4];    /* str, un, or enum tag indx */
  135.         union {
  136.             struct {
  137.                 char  x_lnno[2]; /* declaration line number */
  138.                 char  x_size[2]; /* str/union/array size */
  139.             } x_lnsz;
  140.             char x_fsize[4];    /* size of function */
  141.         } x_misc;
  142.         union {
  143.             struct {        /* if ISFCN, tag, or .bb */
  144.                 char x_lnnoptr[4];    /* ptr to fcn line # */
  145.                 char x_endndx[4];    /* entry ndx past block end */
  146.             } x_fcn;
  147.             struct {        /* if ISARY, up to 4 dimen. */
  148.                 char x_dimen[E_DIMNUM][2];
  149.             } x_ary;
  150.         } x_fcnary;
  151.         char x_tvndx[2];        /* tv index */
  152.     } x_sym;
  153.  
  154.     union {
  155.         char x_fname[E_FILNMLEN];
  156.         struct {
  157.             char x_zeroes[4];
  158.             char x_offset[4];
  159.         } x_n;
  160.     } x_file;
  161.  
  162.     struct {
  163.         char x_scnlen[4];            /* section length */
  164.         char x_nreloc[2];    /* # relocation entries */
  165.         char x_nlinno[2];    /* # line numbers */
  166.     } x_scn;
  167.  
  168.         struct {
  169.         char x_tvfill[4];    /* tv fill value */
  170.         char x_tvlen[2];    /* length of .tv */
  171.         char x_tvran[2][2];    /* tv range */
  172.     } x_tv;        /* info about .tv section (in auxent of symbol .tv)) */
  173.  
  174.  
  175. };
  176.  
  177. #define    SYMENT    struct external_syment
  178. #define    SYMESZ    18    
  179. #define    AUXENT    union external_auxent
  180. #define    AUXESZ    18
  181.  
  182.  
  183.  
  184. /********************** RELOCATION DIRECTIVES **********************/
  185.  
  186. /* The external reloc has an offset field, because some of the reloc
  187.    types on the h8 don't have room in the instruction for the entire
  188.    offset - eg the strange jump and high page addressing modes */
  189.  
  190. struct external_reloc {
  191.   char r_vaddr[4];
  192.   char r_symndx[4];
  193.   char r_offset[4];
  194.   char r_type[2];
  195.   char r_stuff[2];
  196. };
  197.  
  198.  
  199. #define RELOC struct external_reloc
  200. #define RELSZ 16
  201.  
  202. /* SH relocation types.  Not all of these are actually used.  */
  203.  
  204. #define R_SH_UNUSED    0        /* only used internally */
  205. #define R_SH_PCREL8     3        /*  8 bit pcrel     */
  206. #define R_SH_PCREL16     4        /* 16 bit pcrel     */
  207. #define R_SH_HIGH8      5        /* high 8 bits of 24 bit address */
  208. #define R_SH_LOW16     7        /* low 16 bits of 24 bit immediate */
  209. #define R_SH_IMM24    6        /* 24 bit immediate */
  210. #define R_SH_PCDISP8BY4    9          /* PC rel 8 bits *4 +ve */
  211. #define R_SH_PCDISP8BY2    10          /* PC rel 8 bits *2 +ve */
  212. #define R_SH_PCDISP8    11          /* 8 bit branch */
  213. #define R_SH_PCDISP     12          /* 12 bit branch */
  214. #define R_SH_IMM32      14            /* 32 bit immediate */
  215. #define R_SH_IMM8       16        /* 8 bit immediate */
  216. #define R_SH_IMM8BY2    17        /* 8 bit immediate *2 */
  217. #define R_SH_IMM8BY4    18        /* 8 bit immediate *4 */
  218. #define R_SH_IMM4       19        /* 4 bit immediate */
  219. #define R_SH_IMM4BY2    20        /* 4 bit immediate *2 */
  220. #define R_SH_IMM4BY4    21        /* 4 bit immediate *4 */
  221. #define R_SH_PCRELIMM8BY2   22        /* PC rel 8 bits *2 unsigned */
  222. #define R_SH_PCRELIMM8BY4   23        /* PC rel 8 bits *4 unsigned */
  223. #define R_SH_IMM16      24            /* 16 bit immediate */
  224.  
  225. /* The switch table reloc types are used for relaxing.  They are
  226.    generated for expressions such as
  227.      .word L1 - L2
  228.    The r_offset field holds the difference between the reloc address
  229.    and L2.  */
  230. #define R_SH_SWITCH16    25        /* 16 bit switch table entry */
  231. #define R_SH_SWITCH32    26        /* 16 bit switch table entry */
  232.  
  233. /* The USES reloc type is used for relaxing.  The compiler will
  234.    generate .uses pseudo-ops when it finds a function call which it
  235.    can relax.  The r_offset field of the USES reloc holds the PC
  236.    relative offset to the instruction which loads the register used in
  237.    the function call.  */
  238. #define R_SH_USES    27        /* .uses pseudo-op */
  239.  
  240. /* The COUNT reloc type is used for relaxing.  The assembler will
  241.    generate COUNT relocs for addresses referred to by the register
  242.    loads associated with USES relocs.  The r_offset field of the COUNT
  243.    reloc holds the number of times the address is references in the
  244.    object file.  */
  245. #define R_SH_COUNT    28        /* Count of constant pool uses */
  246.  
  247. /* The ALIGN reloc type is used for relaxing.  The r_offset field is
  248.    the power of two to which subsequent portions of the object file
  249.    must be aligned.  */
  250. #define R_SH_ALIGN    29        /* .align pseudo-op */
  251.  
  252.  
  253.  
  254.