Home | History | Annotate | Download | only in binutils
      1 /* coffgrok.h
      2    Copyright (C) 2001-2016 Free Software Foundation, Inc.
      3 
      4    This file is part of GNU Binutils.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 #define T_NULL		0
     22 #define T_VOID		1	/* Function argument (only used by compiler).  */
     23 #define T_CHAR		2	/* Character		*/
     24 #define T_SHORT		3	/* Short integer	*/
     25 #define T_INT		4	/* Integer		*/
     26 #define T_LONG		5	/* Long integer		*/
     27 #define T_FLOAT		6	/* Floating point	*/
     28 #define T_DOUBLE	7	/* Double word		*/
     29 #define T_STRUCT	8	/* Structure 		*/
     30 #define T_UNION		9	/* Union 		*/
     31 #define T_ENUM		10	/* Enumeration 		*/
     32 #define T_MOE		11	/* Member of enumeration*/
     33 #define T_UCHAR		12	/* Unsigned character	*/
     34 #define T_USHORT	13	/* Unsigned short	*/
     35 #define T_UINT		14	/* Unsigned integer	*/
     36 #define T_ULONG		15	/* Unsigned long	*/
     37 #define T_LNGDBL	16	/* Long double		*/
     38 
     39 
     40 struct coff_reloc
     41 {
     42   int offset;
     43   struct coff_symbol *symbol;
     44   int addend;
     45 };
     46 
     47 struct coff_section
     48 {
     49   char *name;
     50   int code;
     51   int data;
     52   int address;
     53   int number;  /* 0..n, .text = 0 */
     54   unsigned int nrelocs;
     55   int size;
     56   struct coff_reloc *relocs;
     57   struct bfd_section *bfd_section;
     58 };
     59 
     60 struct coff_ofile
     61 {
     62   int nsources;
     63   struct coff_sfile *source_head;
     64   struct coff_sfile *source_tail;
     65   int nsections;
     66   struct coff_section *sections;
     67   struct coff_symbol *symbol_list_head;
     68   struct coff_symbol *symbol_list_tail;
     69 };
     70 
     71 struct coff_isection
     72 {
     73   int low;
     74   int high;
     75   int init;
     76   struct coff_section *parent;
     77 };
     78 
     79 struct coff_sfile
     80 {
     81   char *name;
     82   struct coff_scope *scope;
     83   struct coff_sfile *next;
     84 
     85   /* Vector which maps where in each output section
     86      the input file has it's data.  */
     87   struct coff_isection *section;
     88 };
     89 
     90 struct coff_type
     91 {
     92   int size;
     93   enum
     94     {
     95       coff_pointer_type, coff_function_type, coff_array_type, coff_structdef_type, coff_basic_type,
     96       coff_structref_type, coff_enumref_type, coff_enumdef_type, coff_secdef_type
     97     } type;
     98 
     99   union
    100     {
    101       struct
    102       {
    103 	int address;
    104 	int size;
    105       } asecdef;
    106 
    107       struct
    108       {
    109 	int isstruct;
    110 	struct coff_scope *elements;
    111 	int idx;
    112       } astructdef;
    113 
    114       struct
    115       {
    116 	struct coff_symbol *ref;
    117       } astructref;
    118 
    119       struct
    120       {
    121 	struct coff_scope *elements;
    122 	int idx;
    123       } aenumdef;
    124 
    125       struct
    126       {
    127 	struct coff_symbol *ref;
    128       } aenumref;
    129 
    130       struct
    131       {
    132 	struct coff_type *points_to;
    133       } pointer;
    134 
    135       struct
    136       {
    137 	int dim;
    138 	struct coff_type *array_of;
    139       } array;
    140 
    141       struct
    142       {
    143 	struct coff_type *   function_returns;
    144 	struct coff_scope *  parameters;
    145 	struct coff_scope *  code;
    146 	struct coff_line *   lines;
    147       } function;
    148 
    149       int basic;		/* One of T_VOID.. T_UINT */
    150   } u;
    151 };
    152 
    153 struct coff_line
    154 {
    155   int   nlines;
    156   int * lines;
    157   int * addresses;
    158 };
    159 
    160 struct coff_scope
    161 {
    162   struct coff_section * sec;     /* Which section.  */
    163   int                   offset;  /* Where.  */
    164   int                   size;    /* How big.  */
    165   struct coff_scope *   parent;	 /* One up.  */
    166   struct coff_scope *   next;	 /* Next along.  */
    167   int                   nvars;
    168   struct coff_symbol *  vars_head;	/* Symbols.  */
    169   struct coff_symbol *  vars_tail;
    170   struct coff_scope *   list_head;	/* Children.  */
    171   struct coff_scope *   list_tail;
    172 };
    173 
    174 struct coff_visible
    175 {
    176   enum coff_vis_type
    177   {
    178     coff_vis_ext_def,
    179     coff_vis_ext_ref,
    180     coff_vis_int_def,
    181     coff_vis_common,
    182     coff_vis_auto,
    183     coff_vis_register,
    184     coff_vis_tag,
    185     coff_vis_member_of_struct,
    186     coff_vis_member_of_enum,
    187     coff_vis_autoparam,
    188     coff_vis_regparam,
    189   } type;
    190 };
    191 
    192 struct coff_where
    193 {
    194   enum
    195   {
    196     coff_where_stack, coff_where_memory, coff_where_register, coff_where_unknown,
    197     coff_where_strtag, coff_where_member_of_struct,
    198     coff_where_member_of_enum, coff_where_entag, coff_where_typedef
    199   } where;
    200 
    201   int offset;
    202   int bitoffset;
    203   int bitsize;
    204   struct coff_section *section;
    205 };
    206 
    207 struct coff_symbol
    208 {
    209   char *                name;
    210   int                   tag;
    211   struct coff_type *    type;
    212   struct coff_where *   where;
    213   struct coff_visible * visible;
    214   struct coff_symbol *  next;
    215   struct coff_symbol *  next_in_ofile_list; /* For the ofile list.  */
    216   int                   number;
    217   int                   er_number;
    218   struct coff_sfile *   sfile;
    219 };
    220 
    221 struct coff_ofile * coff_grok (bfd *);
    222