/* external.h  -- External COFF structures
   
   Copyright 2001 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#ifndef COFF_EXTERNAL_H
#define COFF_EXTERNAL_H

#ifndef DO_NOT_DEFINE_FILHDR
/********************** FILE HEADER **********************/

struct external_filehdr
  {
    char f_magic[2];	/* magic number			*/
    char f_nscns[2];	/* number of sections		*/
    char f_timdat[4];	/* time & date stamp		*/
    char f_symptr[4];	/* file pointer to symtab	*/
    char f_nsyms[4];	/* number of symtab entries	*/
    char f_opthdr[2];	/* sizeof(optional hdr)		*/
    char f_flags[2];	/* flags			*/
  };

#define	FILHDR	struct external_filehdr
#define	FILHSZ	20
#endif

#ifndef DO_NOT_DEFINE_AOUTHDR
/********************** AOUT "OPTIONAL HEADER" **********************/

typedef struct external_aouthdr
  {
    char magic[2];	/* type of file				*/
    char vstamp[2];	/* version stamp			*/
    char tsize[4];	/* text size in bytes, padded to FW bdry*/
    char dsize[4];	/* initialized data "  "		*/
    char bsize[4];	/* uninitialized data "   "		*/
    char entry[4];	/* entry pt.				*/
    char text_start[4];	/* base of text used for this file 	*/
    char data_start[4];	/* base of data used for this file 	*/
  }
AOUTHDR;

#define AOUTHDRSZ 28
#define AOUTSZ 28
#endif

#ifndef DO_NOT_DEFINE_SCNHDR
/********************** SECTION HEADER **********************/

struct external_scnhdr
  {
    char s_name[8];	/* section name				*/
    char s_paddr[4];	/* physical address, aliased s_nlib 	*/
    char s_vaddr[4];	/* virtual address			*/
    char s_size[4];	/* section size				*/
    char s_scnptr[4];	/* file ptr to raw data for section 	*/
    char s_relptr[4];	/* file ptr to relocation		*/
    char s_lnnoptr[4];	/* file ptr to line numbers		*/
    char s_nreloc[2];	/* number of relocation entries		*/
    char s_nlnno[2];	/* number of line number entries	*/
    char s_flags[4];	/* flags				*/
  };

#define	SCNHDR	struct external_scnhdr
#define	SCNHSZ	40

/* Names of "special" sections.  */

#define _TEXT	 ".text"
#define _DATA	 ".data"
#define _BSS	 ".bss"
#define _COMMENT ".comment"
#define _LIB     ".lib"
#endif /* not DO_NOT_DEFINE_SCNHDR */

#ifndef DO_NOT_DEFINE_LINENO

/********************** LINE NUMBERS **********************/

#ifndef L_LNNO_SIZE
#error  L_LNNO_SIZE needs to be defined
#endif

/* 1 line number entry for every "breakpointable" source line in a section.
   Line numbers are grouped on a per function basis; first entry in a function
   grouping will have l_lnno = 0 and in place of physical address will be the
   symbol table index of the function name.  */
struct external_lineno
{
  union
  {
    char l_symndx[4];	/* function name symbol index, iff l_lnno == 0*/
    char l_paddr[4];	/* (physical) address of line number	*/
  } l_addr;

  char l_lnno[L_LNNO_SIZE];	/* line number		*/
};

#define	LINENO	struct external_lineno
#define	LINESZ	(4 + L_LNNO_SIZE)

#if L_LNNO_SIZE == 4
#define GET_LINENO_LNNO(abfd, ext)      H_GET_32 (abfd,      (ext->l_lnno))
#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_32 (abfd, val, (ext->l_lnno))
#endif
#if L_LNNO_SIZE == 2
#define GET_LINENO_LNNO(abfd, ext)      H_GET_16 (abfd,      (ext->l_lnno))
#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_16 (abfd, val, (ext->l_lnno))
#endif

#endif /* not DO_NOT_DEFINE_LINENO */

#ifndef DO_NOT_DEFINE_SYMENT
/********************** SYMBOLS **********************/

#define E_SYMNMLEN	8	/* # characters in a symbol name	*/
#ifndef E_FILNMLEN
#define E_FILNMLEN	14
#endif
#define E_DIMNUM	4	/* # array dimensions in auxiliary entry */

struct external_syment 
{
  union
  {
    char e_name[E_SYMNMLEN];

    struct
    {
      char e_zeroes[4];
      char e_offset[4];
    } e;
  } e;

  char e_value[4];
  char e_scnum[2];
  char e_type[2];
  char e_sclass[1];
  char e_numaux[1];
};

#define	SYMENT	struct external_syment
#define	SYMESZ	18	

#ifndef N_BTMASK
#define N_BTMASK	0xf
#endif

#ifndef N_TMASK
#define N_TMASK		0x30
#endif

#ifndef N_BTSHFT
#define N_BTSHFT	4
#endif

#ifndef N_TSHIFT
#define N_TSHIFT	2
#endif

#endif /* not DO_NOT_DEFINE_SYMENT */

#ifndef DO_NOT_DEFINE_AUXENT

union external_auxent
{
  struct
  {
    char x_tagndx[4];		/* str, un, or enum tag indx */
    
    union
    {
      struct
      {
	char  x_lnno[2]; /* declaration line number */
	char  x_size[2]; /* str/union/array size */
      } x_lnsz;
      
      char x_fsize[4];	/* size of function */
      
    } x_misc;
    
    union
    {
      struct 		/* if ISFCN, tag, or .bb */
      {
	char x_lnnoptr[4];	/* ptr to fcn line # */
	char x_endndx[4];	/* entry ndx past block end */
      } x_fcn;
      
      struct 		/* if ISARY, up to 4 dimen. */
      {
	char x_dimen[E_DIMNUM][2];
      } x_ary;
      
    } x_fcnary;
    
    char x_tvndx[2];	/* tv index */
    
  } x_sym;
  
  union
  {
    char x_fname[E_FILNMLEN];
    
    struct
    {
      char x_zeroes[4];
      char x_offset[4];
    } x_n;
    
  } x_file;
  
  struct
  {
    char x_scnlen[4];	/* section length */
    char x_nreloc[2];	/* # relocation entries */
    char x_nlinno[2];	/* # line numbers */
#ifdef INCLUDE_COMDAT_FIELDS_IN_AUXENT
    char x_checksum[4];		   /* section COMDAT checksum	      */
    char x_associated[2];	   /* COMDAT associated section index */
    char x_comdat[1];		   /* COMDAT selection number	      */
#endif    
  } x_scn;
  
  struct
  {
    char x_tvfill[4];	/* tv fill value */
    char x_tvlen[2];	/* length of .tv */
    char x_tvran[2][2];	/* tv range */
  } x_tv;		/* info about .tv section (in auxent of symbol .tv)) */
};

#define	AUXENT	union external_auxent
#define	AUXESZ	18

#define _ETEXT	"etext"

#endif /* not DO_NOT_DEFINE_AUXENT */

#endif /* COFF_EXTERNAL_H */
