/* Motorolla MCore support for BFD.
   Copyright (C) 1999 Free Software Foundation, Inc.

This file is part of BFD, the Binary File Descriptor library.

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.  */

/* This file holds definitions specific to the MCore COFF/PE ABI. */

#ifndef _COFF_MORE_H
#define _COFF_MORE_H


#define E_DIMNUM	4	/* # array dimensions in auxiliary entry */

#define IMAGE_REL_MCORE_ABSOLUTE          	0x0000
#define IMAGE_REL_MCORE_ADDR32            	0x0001
#define IMAGE_REL_MCORE_PCREL_IMM8BY4		0x0002
#define IMAGE_REL_MCORE_PCREL_IMM11BY2		0x0003
#define IMAGE_REL_MCORE_PCREL_IMM4BY2		0x0004
#define IMAGE_REL_MCORE_PCREL_32		0x0005
#define IMAGE_REL_MCORE_PCREL_JSR_IMM11BY2	0x0006
#define IMAGE_REL_MCORE_RVA			0x0007

#define PEMCORE

typedef struct 
{
  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 AOUTSZ 28
#define AOUTHDRSZ 28

#define OMAGIC          0404    /* object files, eg as output */
#define ZMAGIC          0413    /* demand load format, eg normal ld output */
#define STMAGIC		0401	/* target shlib */
#define SHMAGIC		0443	/* host   shlib */

/* From winnt.h */
#define IMAGE_NT_OPTIONAL_HDR_MAGIC        0x10b


/* Define some NT default values. */
#define NT_SECTION_ALIGNMENT 0x1000
#define NT_FILE_ALIGNMENT    0x200  
#define NT_DEF_RESERVE       0x100000
#define NT_DEF_COMMIT        0x1000


struct external_reloc
{
  char r_vaddr  [4];
  char r_symndx [4];
  char r_type   [2];
  char r_offset [4];
};

#define RELOC struct external_reloc
#define RELSZ 14

#define	MCOREMAGIC	0xb00  /* I just made this up */ 

#define MCOREBADMAG(x) (((x).f_magic!= MCOREMAGIC))

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


#define E_SYMNMLEN	8	/* # characters in a symbol name	*/
#define E_FILNMLEN	14	/* # characters in a file name		*/
#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 N_BTMASK	0xf
#define N_TMASK		0x30
#define N_BTSHFT	4
#define N_TSHIFT	2

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 */
    char x_checksum   [4];	/* section COMDAT checksum */
    char x_associated [2];	/* COMDAT associated section index */
    char x_comdat     [1];	/* COMDAT selection number */
  } 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	SYMENT	struct external_syment
#define	SYMESZ	18	
#define	AUXENT	union external_auxent
#define	AUXESZ	18

/* 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 [2];	/* line number		*/
};

#define	LINENO	struct external_lineno
#define	LINESZ	6

#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));

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"



#endif /* __COFF_MCORE_H */
