1 /* coffgrok.h
2    Copyright 2001, 2002, 2003 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 2 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, MA 02110-1301, USA.  */
19 
20 #define T_NULL		0
21 #define T_VOID		1	/* function argument (only used by compiler) */
22 #define T_CHAR		2	/* character		*/
23 #define T_SHORT		3	/* short integer	*/
24 #define T_INT		4	/* integer		*/
25 #define T_LONG		5	/* long integer		*/
26 #define T_FLOAT		6	/* floating point	*/
27 #define T_DOUBLE	7	/* double word		*/
28 #define T_STRUCT	8	/* structure 		*/
29 #define T_UNION		9	/* union 		*/
30 #define T_ENUM		10	/* enumeration 		*/
31 #define T_MOE		11	/* member of enumeration*/
32 #define T_UCHAR		12	/* unsigned character	*/
33 #define T_USHORT	13	/* unsigned short	*/
34 #define T_UINT		14	/* unsigned integer	*/
35 #define T_ULONG		15	/* unsigned long	*/
36 #define T_LNGDBL	16	/* long double		*/
37 
38 
39  struct coff_reloc
40  {
41    int offset;
42    struct coff_symbol *symbol;
43    int addend;
44  };
45 
46  struct coff_section
47  {
48    char *name;
49    int code;
50    int data;
51    int address;
52    int number;  /* 0..n, .text = 0 */
53    int nrelocs;
54    int size;
55    struct coff_reloc *relocs;
56    struct bfd_section *bfd_section;
57  };
58 
59 struct coff_ofile
60 {
61   int nsources;
62   struct coff_sfile *source_head;
63   struct coff_sfile *source_tail;
64   int nsections;
65   struct coff_section *sections;
66   struct coff_symbol *symbol_list_head;
67   struct coff_symbol *symbol_list_tail;
68 };
69 
70 struct coff_isection {
71   int low;
72   int high;
73   int init;
74   struct coff_section *parent;
75 };
76 
77 struct coff_sfile
78 {
79   char *name;
80   struct coff_scope *scope;
81   struct coff_sfile *next;
82 
83   /* Vector which maps where in each output section
84      the input file has it's data */
85   struct coff_isection *section;
86 
87 };
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   union
99     {
100       struct
101 	{
102 	int address;
103 	int size;
104       } asecdef;
105 
106       struct
107 	{
108 	  int isstruct;
109 	  struct coff_scope *elements;
110 	  int idx;
111 	}
112       astructdef;
113       struct
114 	{
115 	  struct coff_symbol *ref;
116 	} astructref;
117 
118       struct
119 	{
120 	  struct coff_scope *elements;
121 	  int idx;
122 	} aenumdef;
123       struct
124 	{
125 	  struct coff_symbol *ref;
126 	} aenumref;
127 
128       struct
129 	{
130 	  struct coff_type *points_to;
131 	} pointer;
132       struct
133 	{
134 	  int dim;
135 	  struct coff_type *array_of;
136 	} array;
137 
138       struct
139 	{
140 	  struct coff_type *function_returns;
141 	  struct coff_scope *parameters;
142 	  struct coff_scope *code;
143 	  struct coff_line *lines;
144 	} function;
145       int basic;		/* One of T_VOID.. T_UINT */
146     }  u;
147 };
148 
149 
150  struct coff_line
151  {
152    int nlines;
153    int *lines;
154    int *addresses;
155  };
156 
157 
158  struct coff_scope
159    {
160      struct coff_section *sec; /* What section */
161      int offset; /* where */
162      int size; /* How big */
163      struct coff_scope *parent;	/* one up */
164 
165      struct coff_scope *next;	/*next along */
166 
167      int nvars;
168 
169      struct coff_symbol *vars_head;	/* symbols */
170      struct coff_symbol *vars_tail;
171 
172      struct coff_scope *list_head;	/* children */
173      struct coff_scope *list_tail;
174 
175    };
176 
177 
178  struct coff_visible
179    {
180      enum coff_vis_type
181        {
182 	 coff_vis_ext_def,
183 	 coff_vis_ext_ref,
184 	 coff_vis_int_def,
185 	 coff_vis_common,
186 	 coff_vis_auto,
187 	 coff_vis_register,
188 	 coff_vis_tag,
189 	 coff_vis_member_of_struct,
190 	 coff_vis_member_of_enum,
191 	 coff_vis_autoparam,
192 	 coff_vis_regparam,
193        } type;
194    };
195 
196  struct coff_where
197    {
198      enum
199        {
200 	 coff_where_stack, coff_where_memory, coff_where_register, coff_where_unknown,
201 	 coff_where_strtag, coff_where_member_of_struct,
202 	 coff_where_member_of_enum, coff_where_entag, coff_where_typedef
203 
204        } where;
205      int offset;
206      int bitoffset;
207      int bitsize;
208      struct coff_section *section;
209    };
210 
211  struct coff_symbol
212    {
213      char *name;
214      int tag;
215      struct coff_type *type;
216      struct coff_where *where;
217      struct coff_visible *visible;
218      struct coff_symbol *next;
219      struct coff_symbol *next_in_ofile_list; /* For the ofile list */
220      int number;
221      int er_number;
222      struct coff_sfile *sfile;
223   };
224 
225 struct coff_ofile *coff_grok PARAMS ((bfd *));
226