/* coffgrok.h
   Copyright 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc.

   This file is part of GNU Binutils.

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

#define T_NULL		0
#define T_VOID		1	/* function argument (only used by compiler) */
#define T_CHAR		2	/* character		*/
#define T_SHORT		3	/* short integer	*/
#define T_INT		4	/* integer		*/
#define T_LONG		5	/* long integer		*/
#define T_FLOAT		6	/* floating point	*/
#define T_DOUBLE	7	/* double word		*/
#define T_STRUCT	8	/* structure 		*/
#define T_UNION		9	/* union 		*/
#define T_ENUM		10	/* enumeration 		*/
#define T_MOE		11	/* member of enumeration*/
#define T_UCHAR		12	/* unsigned character	*/
#define T_USHORT	13	/* unsigned short	*/
#define T_UINT		14	/* unsigned integer	*/
#define T_ULONG		15	/* unsigned long	*/
#define T_LNGDBL	16	/* long double		*/


struct coff_reloc
{
  int offset;
  struct coff_symbol *symbol;
  int addend;
};

struct coff_section
{
  char *name;
  int code;
  int data;
  int address;
  int number;  /* 0..n, .text = 0 */
  int nrelocs;
  int size;
  struct coff_reloc *relocs;
  struct bfd_section *bfd_section;
};

struct coff_ofile
{
  int nsources;
  struct coff_sfile *source_head;
  struct coff_sfile *source_tail;
  int nsections;
  struct coff_section *sections;
  struct coff_symbol *symbol_list_head;
  struct coff_symbol *symbol_list_tail;
};

struct coff_isection {
  int low;
  int high;
  int init;
  struct coff_section *parent;
};

struct coff_sfile
{
  char *name;
  struct coff_scope *scope;
  struct coff_sfile *next;

  /* Vector which maps where in each output section
     the input file has it's data */
  struct coff_isection *section;

};


 struct coff_type
{
  int size;
  enum
    {
      coff_pointer_type, coff_function_type, coff_array_type, coff_structdef_type, coff_basic_type,
      coff_structref_type, coff_enumref_type, coff_enumdef_type, coff_secdef_type
      } type;
  union
    {
      struct
	{
	int address;
	int size;
      } asecdef;

      struct
	{
	  int isstruct;
	  struct coff_scope *elements;
	  int idx;
	}
      astructdef;
      struct
	{
	  struct coff_symbol *ref;
	} astructref;

      struct
	{
	  struct coff_scope *elements;
	  int idx;
	} aenumdef;
      struct
	{
	  struct coff_symbol *ref;
	} aenumref;

      struct
	{
	  struct coff_type *points_to;
	} pointer;
      struct
	{
	  int dim;
	  struct coff_type *array_of;
	} array;

      struct
	{
	  struct coff_type *function_returns;
	  struct coff_scope *parameters;
	  struct coff_scope *code;
	  struct coff_line *lines;
	} function;
      int basic;		/* One of T_VOID.. T_UINT */
    }  u;
};


 struct coff_line
 {
   int nlines;
   int *lines;
   int *addresses;
 };


 struct coff_scope
   {
     struct coff_section *sec; /* What section */
     int offset; /* where */
     int size; /* How big */
     struct coff_scope *parent;	/* one up */

     struct coff_scope *next;	/*next along */

     int nvars;

     struct coff_symbol *vars_head;	/* symbols */
     struct coff_symbol *vars_tail;

     struct coff_scope *list_head;	/* children */
     struct coff_scope *list_tail;

   };


 struct coff_visible
   {
     enum coff_vis_type
       {
	 coff_vis_ext_def,
	 coff_vis_ext_ref,
	 coff_vis_int_def,
	 coff_vis_common,
	 coff_vis_auto,
	 coff_vis_register,
	 coff_vis_tag,
	 coff_vis_member_of_struct,
	 coff_vis_member_of_enum,
	 coff_vis_autoparam,
	 coff_vis_regparam,
       } type;
   };

 struct coff_where
   {
     enum
       {
	 coff_where_stack, coff_where_memory, coff_where_register, coff_where_unknown,
	 coff_where_strtag, coff_where_member_of_struct,
	 coff_where_member_of_enum, coff_where_entag, coff_where_typedef

       } where;
     int offset;
     int bitoffset;
     int bitsize;
     struct coff_section *section;
   };

 struct coff_symbol
   {
     char *name;
     int tag;
     struct coff_type *type;
     struct coff_where *where;
     struct coff_visible *visible;
     struct coff_symbol *next;
     struct coff_symbol *next_in_ofile_list; /* For the ofile list */
     int number;
     int er_number;
     struct coff_sfile *sfile;
  };

struct coff_ofile *coff_grok PARAMS ((bfd *));
