/* coffgrok.h
   Copyright (C) 2001-2021 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 */
  unsigned 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;     /* Which 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 (bfd *);
