libctf: allow the header to change between versions
[deliverable/binutils-gdb.git] / include / coff / alpha.h
index f39cd982f33bfbabe50a78f7fe10532fbe1fe696..cad0885216e284a359f7c42b85d968fed0b007f3 100644 (file)
@@ -1,9 +1,27 @@
 /* ECOFF support on Alpha machines.
-   coff/ecoff.h must be included before this file.  */
-
+   coff/ecoff.h must be included before this file.
+
+   Copyright (C) 2001-2019 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   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., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+   
 /********************** FILE HEADER **********************/
 
-struct external_filehdr {
+struct external_filehdr
+{
   unsigned char f_magic[2];    /* magic number                 */
   unsigned char f_nscns[2];    /* number of sections           */
   unsigned char f_timdat[4];   /* time & date stamp            */
@@ -14,37 +32,50 @@ struct external_filehdr {
 };
 
 /* Magic numbers are defined in coff/ecoff.h.  */
-#define ALPHA_ECOFF_BADMAG(x) ((x).f_magic!=ALPHA_MAGIC)
+#define ALPHA_ECOFF_BADMAG(x) \
+  ((x).f_magic != ALPHA_MAGIC && (x).f_magic != ALPHA_MAGIC_BSD)
+
+#define ALPHA_ECOFF_COMPRESSEDMAG(x) \
+  ((x).f_magic == ALPHA_MAGIC_COMPRESSED)
+
+/* The object type is encoded in the f_flags.  */
+#define F_ALPHA_OBJECT_TYPE_MASK       0x3000
+#define F_ALPHA_NO_SHARED              0x1000
+#define F_ALPHA_SHARABLE               0x2000
+#define F_ALPHA_CALL_SHARED            0x3000
 
 #define        FILHDR  struct external_filehdr
-#define        FILHSZ  sizeof(FILHDR)
+#define        FILHSZ  24
 
 /********************** AOUT "OPTIONAL HEADER" **********************/
 
-
 typedef struct external_aouthdr
 {
   unsigned char magic[2];      /* type of file                         */
   unsigned char        vstamp[2];      /* version stamp                        */
-  unsigned char        tsize[8];       /* text size in bytes, padded to FW bdry*/
+  unsigned char bldrev[2];     /* ?? */
+  unsigned char padding[2];    /* pad to quadword boundary             */
+  unsigned char        tsize[8];       /* text size in bytes                   */
   unsigned char        dsize[8];       /* initialized data "  "                */
   unsigned char        bsize[8];       /* uninitialized data "   "             */
   unsigned char        entry[8];       /* entry pt.                            */
   unsigned char text_start[8]; /* base of text used for this file */
   unsigned char data_start[8]; /* base of data used for this file */
   unsigned char bss_start[8];  /* base of bss used for this file */
-  unsigned char gprmask[4];    /* ?? */
-  unsigned char cprmask[4][8]; /* ?? */
-  unsigned char gp_value[4];   /* value for gp register */
+  unsigned char gprmask[4];    /* bitmask of general registers used */
+  unsigned char fprmask[4];    /* bitmask of floating point registers used */
+  unsigned char gp_value[8];   /* value for gp register */
 } AOUTHDR;
 
 /* compute size of a header */
 
-#define AOUTSZ (sizeof(AOUTHDR))
+#define AOUTSZ 80
+#define AOUTHDRSZ 80
 
 /********************** SECTION HEADER **********************/
 
-struct external_scnhdr {
+struct external_scnhdr
+{
   unsigned char        s_name[8];      /* section name                 */
   unsigned char        s_paddr[8];     /* physical address, aliased s_nlib */
   unsigned char        s_vaddr[8];     /* virtual address              */
@@ -58,43 +89,78 @@ struct external_scnhdr {
 };
 
 #define        SCNHDR  struct external_scnhdr
-#define        SCNHSZ  sizeof(SCNHDR)
+#define        SCNHSZ  64
 
 /********************** RELOCATION DIRECTIVES **********************/
 
-struct external_reloc {
+struct external_reloc 
+{
   unsigned char r_vaddr[8];
+  unsigned char r_symndx[4];
   unsigned char r_bits[4];
 };
 
 #define RELOC struct external_reloc
-#define RELSZ 8
-
-/* MIPS ECOFF uses a packed 8 byte format for relocs.  These constants
-   are used to unpack the r_bits field.  */
-
-#define RELOC_BITS0_SYMNDX_SH_LEFT_BIG         16
-#define RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE      0
-
-#define RELOC_BITS1_SYMNDX_SH_LEFT_BIG         8
-#define RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE      8
-
-#define RELOC_BITS2_SYMNDX_SH_LEFT_BIG         0
-#define RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE      16
-
-#define RELOC_BITS3_TYPE_BIG                   0x1E
-#define RELOC_BITS3_TYPE_SH_BIG                        1
-#define RELOC_BITS3_TYPE_LITTLE                        0x78
-#define RELOC_BITS3_TYPE_SH_LITTLE             3
-
-#define RELOC_BITS3_EXTERN_BIG                 0x01
-#define RELOC_BITS3_EXTERN_LITTLE              0x80
-
-#define DEFAULT_DATA_SECTION_ALIGNMENT 16
-#define DEFAULT_BSS_SECTION_ALIGNMENT 16
-#define DEFAULT_TEXT_SECTION_ALIGNMENT 16
-/* For new sections we havn't heard of before */
-#define DEFAULT_SECTION_ALIGNMENT 16
+#define RELSZ 16
+
+/* Constants to unpack the r_bits field.  The Alpha seems to always be
+   little endian, so I haven't bothered to define big endian variants
+   of these.  */
+
+#define RELOC_BITS0_TYPE_LITTLE                        0xff
+#define RELOC_BITS0_TYPE_SH_LITTLE             0
+
+#define RELOC_BITS1_EXTERN_LITTLE              0x01
+
+#define RELOC_BITS1_OFFSET_LITTLE              0x7e
+#define RELOC_BITS1_OFFSET_SH_LITTLE           1
+
+#define RELOC_BITS1_RESERVED_LITTLE            0x80
+#define RELOC_BITS1_RESERVED_SH_LITTLE         7
+#define RELOC_BITS2_RESERVED_LITTLE            0xff
+#define RELOC_BITS2_RESERVED_SH_LEFT_LITTLE    1
+#define RELOC_BITS3_RESERVED_LITTLE            0x03
+#define RELOC_BITS3_RESERVED_SH_LEFT_LITTLE    9
+
+#define RELOC_BITS3_SIZE_LITTLE                        0xfc
+#define RELOC_BITS3_SIZE_SH_LITTLE             2
+
+/* The r_type field in a reloc is one of the following values.  */
+#define ALPHA_R_IGNORE         0
+#define ALPHA_R_REFLONG                1
+#define ALPHA_R_REFQUAD                2
+#define ALPHA_R_GPREL32                3
+#define ALPHA_R_LITERAL                4
+#define ALPHA_R_LITUSE         5
+#define ALPHA_R_GPDISP         6
+#define ALPHA_R_BRADDR         7
+#define ALPHA_R_HINT           8
+#define ALPHA_R_SREL16         9
+#define ALPHA_R_SREL32        10
+#define ALPHA_R_SREL64        11
+#define ALPHA_R_OP_PUSH               12
+#define ALPHA_R_OP_STORE       13
+#define ALPHA_R_OP_PSUB               14
+#define ALPHA_R_OP_PRSHIFT     15
+#define ALPHA_R_GPVALUE               16
+#define ALPHA_R_GPRELHIGH      17
+#define ALPHA_R_GPRELLOW       18
+#define ALPHA_R_IMMED          19
+
+/* Overloaded reloc value used by Net- and OpenBSD.  */
+#define ALPHA_R_LITERALSLEAZY  17
+
+/* With ALPHA_R_LITUSE, the r_size field is one of the following values.  */
+#define ALPHA_R_LU_BASE         1
+#define ALPHA_R_LU_BYTOFF       2
+#define ALPHA_R_LU_JSR          3
+
+/* With ALPHA_R_IMMED, the r_size field is one of the following values.  */
+#define ALPHA_R_IMMED_GP_16     1
+#define ALPHA_R_IMMED_GP_HI32   2
+#define ALPHA_R_IMMED_SCN_HI32  3
+#define ALPHA_R_IMMED_BR_HI32   4
+#define ALPHA_R_IMMED_LO32      5
 
 /********************** SYMBOLIC INFORMATION **********************/
 
@@ -106,57 +172,60 @@ struct external_reloc {
 
 /* File header as a set of bytes */
 
-struct hdr_ext {
+struct hdr_ext
+{
        unsigned char   h_magic[2];
        unsigned char   h_vstamp[2];
        unsigned char   h_ilineMax[4];
-       unsigned char   h_cbLine[4];
-       unsigned char   h_cbLineOffset[4];
        unsigned char   h_idnMax[4];
-       unsigned char   h_cbDnOffset[4];
        unsigned char   h_ipdMax[4];
-       unsigned char   h_cbPdOffset[4];
        unsigned char   h_isymMax[4];
-       unsigned char   h_cbSymOffset[4];
        unsigned char   h_ioptMax[4];
-       unsigned char   h_cbOptOffset[4];
        unsigned char   h_iauxMax[4];
-       unsigned char   h_cbAuxOffset[4];
        unsigned char   h_issMax[4];
-       unsigned char   h_cbSsOffset[4];
        unsigned char   h_issExtMax[4];
-       unsigned char   h_cbSsExtOffset[4];
        unsigned char   h_ifdMax[4];
-       unsigned char   h_cbFdOffset[4];
        unsigned char   h_crfd[4];
-       unsigned char   h_cbRfdOffset[4];
        unsigned char   h_iextMax[4];
-       unsigned char   h_cbExtOffset[4];
+       unsigned char   h_cbLine[8];
+       unsigned char   h_cbLineOffset[8];
+       unsigned char   h_cbDnOffset[8];
+       unsigned char   h_cbPdOffset[8];
+       unsigned char   h_cbSymOffset[8];
+       unsigned char   h_cbOptOffset[8];
+       unsigned char   h_cbAuxOffset[8];
+       unsigned char   h_cbSsOffset[8];
+       unsigned char   h_cbSsExtOffset[8];
+       unsigned char   h_cbFdOffset[8];
+       unsigned char   h_cbRfdOffset[8];
+       unsigned char   h_cbExtOffset[8];
 };
 
 /* File descriptor external record */
 
-struct fdr_ext {
-       unsigned char   f_adr[4];
+struct fdr_ext
+{
+       unsigned char   f_adr[8];
+       unsigned char   f_cbLineOffset[8];
+       unsigned char   f_cbLine[8];
+       unsigned char   f_cbSs[8];
        unsigned char   f_rss[4];
        unsigned char   f_issBase[4];
-       unsigned char   f_cbSs[4];
        unsigned char   f_isymBase[4];
        unsigned char   f_csym[4];
        unsigned char   f_ilineBase[4];
        unsigned char   f_cline[4];
        unsigned char   f_ioptBase[4];
        unsigned char   f_copt[4];
-       unsigned char   f_ipdFirst[2];
-       unsigned char   f_cpd[2];
+       unsigned char   f_ipdFirst[4];
+       unsigned char   f_cpd[4];
        unsigned char   f_iauxBase[4];
        unsigned char   f_caux[4];
        unsigned char   f_rfdBase[4];
        unsigned char   f_crfd[4];
        unsigned char   f_bits1[1];
        unsigned char   f_bits2[3];
-       unsigned char   f_cbLineOffset[4];
-       unsigned char   f_cbLine[4];
+       unsigned char   f_padding[4];
 };
 
 #define        FDR_BITS1_LANG_BIG              0xF8
@@ -183,7 +252,8 @@ struct fdr_ext {
 /* Procedure descriptor external record */
 
 struct pdr_ext {
-       unsigned char   p_adr[4];
+       unsigned char   p_adr[8];
+       unsigned char   p_cbLineOffset[8];
        unsigned char   p_isym[4];
        unsigned char   p_iline[4];
        unsigned char   p_regmask[4];
@@ -192,13 +262,32 @@ struct pdr_ext {
        unsigned char   p_fregmask[4];
        unsigned char   p_fregoffset[4];
        unsigned char   p_frameoffset[4];
-       unsigned char   p_framereg[2];
-       unsigned char   p_pcreg[2];
        unsigned char   p_lnLow[4];
        unsigned char   p_lnHigh[4];
-       unsigned char   p_cbLineOffset[4];
+       unsigned char   p_gp_prologue[1];
+       unsigned char   p_bits1[1];
+       unsigned char   p_bits2[1];
+       unsigned char   p_localoff[1];
+       unsigned char   p_framereg[2];
+       unsigned char   p_pcreg[2];
 };
 
+#define PDR_BITS1_GP_USED_BIG          0x80
+#define PDR_BITS1_REG_FRAME_BIG                0x40
+#define PDR_BITS1_PROF_BIG             0x20
+#define PDR_BITS1_RESERVED_BIG         0x1f
+#define PDR_BITS1_RESERVED_SH_LEFT_BIG 8
+#define PDR_BITS2_RESERVED_BIG         0xff
+#define PDR_BITS2_RESERVED_SH_BIG      0
+
+#define PDR_BITS1_GP_USED_LITTLE       0x01
+#define PDR_BITS1_REG_FRAME_LITTLE     0x02
+#define PDR_BITS1_PROF_LITTLE          0x04
+#define PDR_BITS1_RESERVED_LITTLE      0xf8
+#define PDR_BITS1_RESERVED_SH_LITTLE   3
+#define PDR_BITS2_RESERVED_LITTLE      0xff
+#define PDR_BITS2_RESERVED_SH_LEFT_LITTLE 5
+
 /* Line numbers */
 
 struct line_ext {
@@ -208,8 +297,8 @@ struct line_ext {
 /* Symbol external record */
 
 struct sym_ext {
+       unsigned char   s_value[8];
        unsigned char   s_iss[4];
-       unsigned char   s_value[4];
        unsigned char   s_bits1[1];
        unsigned char   s_bits2[1];
        unsigned char   s_bits3[1];
@@ -248,10 +337,10 @@ struct sym_ext {
 /* External symbol external record */
 
 struct ext_ext {
-       unsigned char   es_bits1[1];
-       unsigned char   es_bits2[1];
-       unsigned char   es_ifd[2];
        struct  sym_ext es_asym;
+       unsigned char   es_bits1[1];
+       unsigned char   es_bits2[3];
+       unsigned char   es_ifd[4];
 };
 
 #define        EXT_BITS1_JMPTBL_BIG            0x80
This page took 0.034937 seconds and 4 git commands to generate.