/* 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)      bfd_h_get_32 (abfd,      (bfd_byte *) (ext->l_lnno));
#define PUT_LINENO_LNNO(abfd, val, ext) bfd_h_put_32 (abfd, val, (bfd_byte *) (ext->l_lnno));
#endif
#if L_LNNO_SIZE == 2
#define GET_LINENO_LNNO(abfd, ext)     bfd_h_get_16 (abfd, (bfd_byte *) (ext->l_lnno));
#define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16 (abfd,val,  (bfd_byte *) (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 */
