Blame include/coff/mips.h

Packit bbfece
/* ECOFF support on MIPS machines.
Packit bbfece
   coff/ecoff.h must be included before this file.
Packit bbfece
   
Packit bbfece
   Copyright (C) 1999-2018 Free Software Foundation, Inc.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify
Packit bbfece
   it under the terms of the GNU General Public License as published by
Packit bbfece
   the Free Software Foundation; either version 3 of the License, or
Packit bbfece
   (at your option) any later version.
Packit bbfece
   
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
   GNU General Public License for more details.
Packit bbfece
   
Packit bbfece
   You should have received a copy of the GNU General Public License
Packit bbfece
   along with this program; if not, write to the Free Software
Packit bbfece
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
Packit bbfece
   MA 02110-1301, USA.  */
Packit bbfece
Packit bbfece
#define DO_NOT_DEFINE_AOUTHDR
Packit bbfece
#define L_LNNO_SIZE 4
Packit bbfece
#include "coff/external.h"
Packit bbfece
Packit bbfece
/* Magic numbers are defined in coff/ecoff.h.  */
Packit bbfece
#define MIPS_ECOFF_BADMAG(x) (((x).f_magic!=MIPS_MAGIC_1) && \
Packit bbfece
			      ((x).f_magic!=MIPS_MAGIC_LITTLE) &&\
Packit bbfece
			      ((x).f_magic!=MIPS_MAGIC_BIG) && \
Packit bbfece
			      ((x).f_magic!=MIPS_MAGIC_LITTLE2) && \
Packit bbfece
			      ((x).f_magic!=MIPS_MAGIC_BIG2) && \
Packit bbfece
			      ((x).f_magic!=MIPS_MAGIC_LITTLE3) && \
Packit bbfece
			      ((x).f_magic!=MIPS_MAGIC_BIG3))
Packit bbfece
Packit bbfece
Packit bbfece
/********************** AOUT "OPTIONAL HEADER" **********************/
Packit bbfece
Packit bbfece
typedef struct external_aouthdr
Packit bbfece
{
Packit bbfece
  unsigned char magic[2];	/* type of file				*/
Packit bbfece
  unsigned char	vstamp[2];	/* version stamp			*/
Packit bbfece
  unsigned char	tsize[4];	/* text size in bytes, padded to FW bdry*/
Packit bbfece
  unsigned char	dsize[4];	/* initialized data "  "		*/
Packit bbfece
  unsigned char	bsize[4];	/* uninitialized data "   "		*/
Packit bbfece
  unsigned char	entry[4];	/* entry pt.				*/
Packit bbfece
  unsigned char text_start[4];	/* base of text used for this file */
Packit bbfece
  unsigned char data_start[4];	/* base of data used for this file */
Packit bbfece
  unsigned char bss_start[4];	/* base of bss used for this file */
Packit bbfece
  unsigned char gprmask[4];	/* ?? */
Packit bbfece
  unsigned char cprmask[4][4];	/* ?? */
Packit bbfece
  unsigned char gp_value[4];	/* value for gp register */
Packit bbfece
} AOUTHDR;
Packit bbfece
Packit bbfece
/* compute size of a header */
Packit bbfece
Packit bbfece
#define AOUTSZ 56
Packit bbfece
#define AOUTHDRSZ 56
Packit bbfece
Packit bbfece
/********************** RELOCATION DIRECTIVES **********************/
Packit bbfece
Packit bbfece
struct external_reloc
Packit bbfece
  {
Packit bbfece
    unsigned char r_vaddr[4];
Packit bbfece
    unsigned char r_bits[4];
Packit bbfece
  };
Packit bbfece
Packit bbfece
#define RELOC struct external_reloc
Packit bbfece
#define RELSZ 8
Packit bbfece
Packit bbfece
/* MIPS ECOFF uses a packed 8 byte format for relocs.  These constants
Packit bbfece
   are used to unpack the r_bits field.  */
Packit bbfece
Packit bbfece
#define RELOC_BITS0_SYMNDX_SH_LEFT_BIG		16
Packit bbfece
#define RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE	0
Packit bbfece
Packit bbfece
#define RELOC_BITS1_SYMNDX_SH_LEFT_BIG		8
Packit bbfece
#define RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE	8
Packit bbfece
Packit bbfece
#define RELOC_BITS2_SYMNDX_SH_LEFT_BIG		0
Packit bbfece
#define RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE	16
Packit bbfece
Packit bbfece
/* Originally, ECOFF used four bits for the reloc type and had three
Packit bbfece
   reserved bits.  Irix 4 added another bit for the reloc type, which
Packit bbfece
   was easy because it was big endian and one of the spare bits became
Packit bbfece
   the new most significant bit.  To make this also work for little
Packit bbfece
   endian ECOFF, we need to wrap one of the reserved bits around to
Packit bbfece
   become the most significant bit of the reloc type.  */
Packit bbfece
#define RELOC_BITS3_TYPE_BIG			0x3E
Packit bbfece
#define RELOC_BITS3_TYPE_SH_BIG			1
Packit bbfece
#define RELOC_BITS3_TYPE_LITTLE			0x78
Packit bbfece
#define RELOC_BITS3_TYPE_SH_LITTLE		3
Packit bbfece
#define RELOC_BITS3_TYPEHI_LITTLE		0x04
Packit bbfece
#define RELOC_BITS3_TYPEHI_SH_LITTLE		2
Packit bbfece
Packit bbfece
#define RELOC_BITS3_EXTERN_BIG			0x01
Packit bbfece
#define RELOC_BITS3_EXTERN_LITTLE		0x80
Packit bbfece
Packit bbfece
/* The r_type field in a reloc is one of the following values.  I
Packit bbfece
   don't know if any other values can appear.  These seem to be all
Packit bbfece
   that occur in the Ultrix 4.2 libraries.  */
Packit bbfece
#define MIPS_R_IGNORE	0
Packit bbfece
#define MIPS_R_REFHALF	1
Packit bbfece
#define MIPS_R_REFWORD	2
Packit bbfece
#define MIPS_R_JMPADDR	3
Packit bbfece
#define MIPS_R_REFHI	4
Packit bbfece
#define MIPS_R_REFLO	5
Packit bbfece
#define MIPS_R_GPREL	6
Packit bbfece
#define MIPS_R_LITERAL	7
Packit bbfece
Packit bbfece
/* FIXME: This relocation is used (internally only) to represent branches
Packit bbfece
   when assembling.  It should never appear in output files, and  
Packit bbfece
   be removed.  (It used to be used for embedded-PIC support.)  */
Packit bbfece
#define MIPS_R_PCREL16	12
Packit bbfece
Packit bbfece
/********************** STABS **********************/
Packit bbfece
Packit bbfece
#define MIPS_IS_STAB ECOFF_IS_STAB
Packit bbfece
#define MIPS_MARK_STAB ECOFF_MARK_STAB
Packit bbfece
#define MIPS_UNMARK_STAB ECOFF_UNMARK_STAB
Packit bbfece
Packit bbfece
/********************** SYMBOLIC INFORMATION **********************/
Packit bbfece
Packit bbfece
/* Written by John Gilmore.  */
Packit bbfece
Packit bbfece
/* ECOFF uses COFF-like section structures, but its own symbol format.
Packit bbfece
   This file defines the symbol format in fields whose size and alignment
Packit bbfece
   will not vary on different host systems.  */
Packit bbfece
Packit bbfece
/* File header as a set of bytes */
Packit bbfece
Packit bbfece
struct hdr_ext
Packit bbfece
{
Packit bbfece
	unsigned char 	h_magic[2];
Packit bbfece
	unsigned char	h_vstamp[2];
Packit bbfece
	unsigned char	h_ilineMax[4];
Packit bbfece
	unsigned char	h_cbLine[4];
Packit bbfece
	unsigned char	h_cbLineOffset[4];
Packit bbfece
	unsigned char	h_idnMax[4];
Packit bbfece
	unsigned char	h_cbDnOffset[4];
Packit bbfece
	unsigned char	h_ipdMax[4];
Packit bbfece
	unsigned char	h_cbPdOffset[4];
Packit bbfece
	unsigned char	h_isymMax[4];
Packit bbfece
	unsigned char	h_cbSymOffset[4];
Packit bbfece
	unsigned char	h_ioptMax[4];
Packit bbfece
	unsigned char	h_cbOptOffset[4];
Packit bbfece
	unsigned char	h_iauxMax[4];
Packit bbfece
	unsigned char	h_cbAuxOffset[4];
Packit bbfece
	unsigned char	h_issMax[4];
Packit bbfece
	unsigned char	h_cbSsOffset[4];
Packit bbfece
	unsigned char	h_issExtMax[4];
Packit bbfece
	unsigned char	h_cbSsExtOffset[4];
Packit bbfece
	unsigned char	h_ifdMax[4];
Packit bbfece
	unsigned char	h_cbFdOffset[4];
Packit bbfece
	unsigned char	h_crfd[4];
Packit bbfece
	unsigned char	h_cbRfdOffset[4];
Packit bbfece
	unsigned char	h_iextMax[4];
Packit bbfece
	unsigned char	h_cbExtOffset[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
/* File descriptor external record */
Packit bbfece
Packit bbfece
struct fdr_ext
Packit bbfece
{
Packit bbfece
	unsigned char	f_adr[4];
Packit bbfece
	unsigned char	f_rss[4];
Packit bbfece
	unsigned char	f_issBase[4];
Packit bbfece
	unsigned char	f_cbSs[4];
Packit bbfece
	unsigned char	f_isymBase[4];
Packit bbfece
	unsigned char	f_csym[4];
Packit bbfece
	unsigned char	f_ilineBase[4];
Packit bbfece
	unsigned char	f_cline[4];
Packit bbfece
	unsigned char	f_ioptBase[4];
Packit bbfece
	unsigned char	f_copt[4];
Packit bbfece
	unsigned char	f_ipdFirst[2];
Packit bbfece
	unsigned char	f_cpd[2];
Packit bbfece
	unsigned char	f_iauxBase[4];
Packit bbfece
	unsigned char	f_caux[4];
Packit bbfece
	unsigned char	f_rfdBase[4];
Packit bbfece
	unsigned char	f_crfd[4];
Packit bbfece
	unsigned char	f_bits1[1];
Packit bbfece
	unsigned char	f_bits2[3];
Packit bbfece
	unsigned char	f_cbLineOffset[4];
Packit bbfece
	unsigned char	f_cbLine[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
#define	FDR_BITS1_LANG_BIG		0xF8
Packit bbfece
#define	FDR_BITS1_LANG_SH_BIG		3
Packit bbfece
#define	FDR_BITS1_LANG_LITTLE		0x1F
Packit bbfece
#define	FDR_BITS1_LANG_SH_LITTLE	0
Packit bbfece
Packit bbfece
#define	FDR_BITS1_FMERGE_BIG		0x04
Packit bbfece
#define	FDR_BITS1_FMERGE_LITTLE		0x20
Packit bbfece
Packit bbfece
#define	FDR_BITS1_FREADIN_BIG		0x02
Packit bbfece
#define	FDR_BITS1_FREADIN_LITTLE	0x40
Packit bbfece
Packit bbfece
#define	FDR_BITS1_FBIGENDIAN_BIG	0x01
Packit bbfece
#define	FDR_BITS1_FBIGENDIAN_LITTLE	0x80
Packit bbfece
Packit bbfece
#define	FDR_BITS2_GLEVEL_BIG		0xC0
Packit bbfece
#define	FDR_BITS2_GLEVEL_SH_BIG		6
Packit bbfece
#define	FDR_BITS2_GLEVEL_LITTLE		0x03
Packit bbfece
#define	FDR_BITS2_GLEVEL_SH_LITTLE	0
Packit bbfece
Packit bbfece
/* We ignore the `reserved' field in bits2. */
Packit bbfece
Packit bbfece
/* Procedure descriptor external record */
Packit bbfece
Packit bbfece
struct pdr_ext
Packit bbfece
{
Packit bbfece
	unsigned char	p_adr[4];
Packit bbfece
	unsigned char	p_isym[4];
Packit bbfece
	unsigned char	p_iline[4];
Packit bbfece
	unsigned char	p_regmask[4];
Packit bbfece
	unsigned char	p_regoffset[4];
Packit bbfece
	unsigned char	p_iopt[4];
Packit bbfece
	unsigned char	p_fregmask[4];
Packit bbfece
	unsigned char	p_fregoffset[4];
Packit bbfece
	unsigned char	p_frameoffset[4];
Packit bbfece
	unsigned char	p_framereg[2];
Packit bbfece
	unsigned char	p_pcreg[2];
Packit bbfece
	unsigned char	p_lnLow[4];
Packit bbfece
	unsigned char	p_lnHigh[4];
Packit bbfece
	unsigned char	p_cbLineOffset[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Runtime procedure table */
Packit bbfece
Packit bbfece
struct rpdr_ext
Packit bbfece
{
Packit bbfece
	unsigned char	p_adr[4];
Packit bbfece
	unsigned char	p_regmask[4];
Packit bbfece
	unsigned char	p_regoffset[4];
Packit bbfece
	unsigned char	p_fregmask[4];
Packit bbfece
	unsigned char	p_fregoffset[4];
Packit bbfece
	unsigned char	p_frameoffset[4];
Packit bbfece
	unsigned char	p_framereg[2];
Packit bbfece
	unsigned char	p_pcreg[2];
Packit bbfece
	unsigned char	p_irpss[4];
Packit bbfece
	unsigned char	p_reserved[4];
Packit bbfece
	unsigned char	p_exception_info[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Line numbers */
Packit bbfece
Packit bbfece
struct line_ext
Packit bbfece
{
Packit bbfece
	unsigned char	l_line[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Symbol external record */
Packit bbfece
Packit bbfece
struct sym_ext
Packit bbfece
{
Packit bbfece
	unsigned char	s_iss[4];
Packit bbfece
	unsigned char	s_value[4];
Packit bbfece
	unsigned char	s_bits1[1];
Packit bbfece
	unsigned char	s_bits2[1];
Packit bbfece
	unsigned char	s_bits3[1];
Packit bbfece
	unsigned char	s_bits4[1];
Packit bbfece
};
Packit bbfece
Packit bbfece
#define	SYM_BITS1_ST_BIG		0xFC
Packit bbfece
#define	SYM_BITS1_ST_SH_BIG		2
Packit bbfece
#define	SYM_BITS1_ST_LITTLE		0x3F
Packit bbfece
#define	SYM_BITS1_ST_SH_LITTLE		0
Packit bbfece
Packit bbfece
#define	SYM_BITS1_SC_BIG		0x03
Packit bbfece
#define	SYM_BITS1_SC_SH_LEFT_BIG	3
Packit bbfece
#define	SYM_BITS1_SC_LITTLE		0xC0
Packit bbfece
#define	SYM_BITS1_SC_SH_LITTLE		6
Packit bbfece
Packit bbfece
#define	SYM_BITS2_SC_BIG		0xE0
Packit bbfece
#define	SYM_BITS2_SC_SH_BIG		5
Packit bbfece
#define	SYM_BITS2_SC_LITTLE		0x07
Packit bbfece
#define	SYM_BITS2_SC_SH_LEFT_LITTLE	2
Packit bbfece
Packit bbfece
#define	SYM_BITS2_RESERVED_BIG		0x10
Packit bbfece
#define	SYM_BITS2_RESERVED_LITTLE	0x08
Packit bbfece
Packit bbfece
#define	SYM_BITS2_INDEX_BIG		0x0F
Packit bbfece
#define	SYM_BITS2_INDEX_SH_LEFT_BIG	16
Packit bbfece
#define	SYM_BITS2_INDEX_LITTLE		0xF0
Packit bbfece
#define	SYM_BITS2_INDEX_SH_LITTLE	4
Packit bbfece
Packit bbfece
#define	SYM_BITS3_INDEX_SH_LEFT_BIG	8
Packit bbfece
#define	SYM_BITS3_INDEX_SH_LEFT_LITTLE	4
Packit bbfece
Packit bbfece
#define	SYM_BITS4_INDEX_SH_LEFT_BIG	0
Packit bbfece
#define	SYM_BITS4_INDEX_SH_LEFT_LITTLE	12
Packit bbfece
Packit bbfece
/* External symbol external record */
Packit bbfece
Packit bbfece
struct ext_ext
Packit bbfece
{
Packit bbfece
	unsigned char	es_bits1[1];
Packit bbfece
	unsigned char	es_bits2[1];
Packit bbfece
	unsigned char	es_ifd[2];
Packit bbfece
	struct	sym_ext es_asym;
Packit bbfece
};
Packit bbfece
Packit bbfece
#define	EXT_BITS1_JMPTBL_BIG		0x80
Packit bbfece
#define	EXT_BITS1_JMPTBL_LITTLE		0x01
Packit bbfece
Packit bbfece
#define	EXT_BITS1_COBOL_MAIN_BIG	0x40
Packit bbfece
#define	EXT_BITS1_COBOL_MAIN_LITTLE	0x02
Packit bbfece
Packit bbfece
#define	EXT_BITS1_WEAKEXT_BIG		0x20
Packit bbfece
#define	EXT_BITS1_WEAKEXT_LITTLE	0x04
Packit bbfece
Packit bbfece
/* Dense numbers external record */
Packit bbfece
Packit bbfece
struct dnr_ext
Packit bbfece
{
Packit bbfece
	unsigned char	d_rfd[4];
Packit bbfece
	unsigned char	d_index[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Relative file descriptor */
Packit bbfece
Packit bbfece
struct rfd_ext
Packit bbfece
{
Packit bbfece
  unsigned char	rfd[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Optimizer symbol external record */
Packit bbfece
Packit bbfece
struct opt_ext
Packit bbfece
{
Packit bbfece
  unsigned char o_bits1[1];
Packit bbfece
  unsigned char o_bits2[1];
Packit bbfece
  unsigned char o_bits3[1];
Packit bbfece
  unsigned char o_bits4[1];
Packit bbfece
  struct rndx_ext o_rndx;
Packit bbfece
  unsigned char o_offset[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
#define OPT_BITS2_VALUE_SH_LEFT_BIG	16
Packit bbfece
#define OPT_BITS2_VALUE_SH_LEFT_LITTLE	0
Packit bbfece
Packit bbfece
#define OPT_BITS3_VALUE_SH_LEFT_BIG	8
Packit bbfece
#define OPT_BITS3_VALUE_SH_LEFT_LITTLE	8
Packit bbfece
Packit bbfece
#define OPT_BITS4_VALUE_SH_LEFT_BIG	0
Packit bbfece
#define OPT_BITS4_VALUE_SH_LEFT_LITTLE	16