1/* coffgrok.h
2   Copyright (C) 2001-2017 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
40struct coff_reloc
41{
42  int offset;
43  struct coff_symbol *symbol;
44  int addend;
45};
46
47struct 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
60struct 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
71struct coff_isection
72{
73  int low;
74  int high;
75  int init;
76  struct coff_section *parent;
77};
78
79struct 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
90struct 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
153struct coff_line
154{
155  int   nlines;
156  int * lines;
157  int * addresses;
158};
159
160struct 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
174struct 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
192struct 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
207struct 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
221struct coff_ofile * coff_grok (bfd *);
222