inline is not a type qualifier anymore, fix function entity creation
[cparser] / ast_t.h
1 #ifndef AST_T_H
2 #define AST_T_H
3
4 #include <libfirm/firm_types.h>
5
6 #include "ast.h"
7 #include "symbol.h"
8 #include "token_t.h"
9 #include "type.h"
10 #include "adt/obst.h"
11
12 extern struct obstack ast_obstack;
13
14 typedef enum {
15         EXPR_INVALID = 0,
16         EXPR_REFERENCE,
17         EXPR_CONST,
18         EXPR_STRING_LITERAL,
19         EXPR_CALL,
20         EXPR_UNARY,
21         EXPR_BINARY,
22         EXPR_CONDITIONAL,
23         EXPR_SELECT,
24         EXPR_ARRAY_ACCESS,
25         EXPR_SIZEOF,
26
27         EXPR_FUNCTION,
28         EXPR_PRETTY_FUNCTION,
29         EXPR_BUILTIN_SYMBOL,
30         EXPR_OFFSETOF,
31         EXPR_VA_ARG,
32         EXPR_STATEMENT
33 } expresion_type_t;
34
35 struct context_t {
36         declaration_t   *declarations;
37 };
38
39 struct expression_t {
40         expresion_type_t   type;
41         type_t            *datatype;
42         source_position_t  source_position;
43 };
44
45 struct const_t {
46         expression_t  expression;
47         union {
48                 int         int_value;
49                 long double float_value;
50         } v;
51 };
52
53 struct string_literal_t {
54         expression_t  expression;
55         const char   *value;
56 };
57
58 struct builtin_symbol_expression_t {
59         expression_t  expression;
60         symbol_t     *symbol;
61 };
62
63 struct reference_expression_t {
64         expression_t   expression;
65         symbol_t      *symbol;
66         declaration_t *declaration;
67 };
68
69 struct call_argument_t {
70         expression_t    *expression;
71         call_argument_t *next;
72 };
73
74 struct call_expression_t {
75         expression_t     expression;
76         expression_t    *function;
77         call_argument_t *arguments;
78 };
79
80 typedef enum {
81         UNEXPR_INVALID = 0,
82         UNEXPR_NEGATE,
83         UNEXPR_PLUS,
84         UNEXPR_BITWISE_NEGATE,
85         UNEXPR_NOT,
86         UNEXPR_DEREFERENCE,
87         UNEXPR_TAKE_ADDRESS,
88         UNEXPR_POSTFIX_INCREMENT,
89         UNEXPR_POSTFIX_DECREMENT,
90         UNEXPR_PREFIX_INCREMENT,
91         UNEXPR_PREFIX_DECREMENT,
92         UNEXPR_CAST
93 } unary_expression_type_t;
94
95 struct unary_expression_t {
96         expression_t             expression;
97         unary_expression_type_t  type;
98         expression_t            *value;
99 };
100
101 typedef enum {
102         BINEXPR_INVALID = 0,
103         BINEXPR_ADD,
104         BINEXPR_SUB,
105         BINEXPR_MUL,
106         BINEXPR_DIV,
107         BINEXPR_MOD,
108         BINEXPR_EQUAL,
109         BINEXPR_NOTEQUAL,
110         BINEXPR_LESS,
111         BINEXPR_LESSEQUAL,
112         BINEXPR_GREATER,
113         BINEXPR_GREATEREQUAL,
114         BINEXPR_BITWISE_AND,
115         BINEXPR_BITWISE_OR,
116         BINEXPR_BITWISE_XOR,
117         BINEXPR_LOGICAL_AND,
118         BINEXPR_LOGICAL_OR,
119         BINEXPR_SHIFTLEFT,
120         BINEXPR_SHIFTRIGHT,
121         BINEXPR_ASSIGN,
122         BINEXPR_MUL_ASSIGN,
123         BINEXPR_DIV_ASSIGN,
124         BINEXPR_MOD_ASSIGN,
125         BINEXPR_ADD_ASSIGN,
126         BINEXPR_SUB_ASSIGN,
127         BINEXPR_SHIFTLEFT_ASSIGN,
128         BINEXPR_SHIFTRIGHT_ASSIGN,
129         BINEXPR_BITWISE_AND_ASSIGN,
130         BINEXPR_BITWISE_XOR_ASSIGN,
131         BINEXPR_BITWISE_OR_ASSIGN,
132         BINEXPR_COMMA
133 } binary_expression_type_t;
134
135 struct binary_expression_t {
136         expression_t              expression;
137         binary_expression_type_t  type;
138         expression_t             *left;
139         expression_t             *right;
140 };
141
142 struct select_expression_t {
143         expression_t   expression;
144         expression_t  *compound;
145         symbol_t      *symbol;
146
147         declaration_t *compound_entry;
148 };
149
150 struct array_access_expression_t {
151         expression_t  expression;
152         expression_t *array_ref;
153         expression_t *index;
154 };
155
156 struct sizeof_expression_t {
157         expression_t  expression;
158         type_t       *type;
159         expression_t *size_expression;
160 };
161
162 struct designator_t {
163         symbol_t     *symbol;
164         expression_t *array_access;
165         designator_t *next;
166 };
167
168 struct offsetof_expression_t {
169         expression_t  expression;
170         type_t       *type;
171         designator_t *designator;
172 };
173
174 struct va_arg_expression_t {
175         expression_t  expression;
176         expression_t *arg;
177         type_t       *type;
178 };
179
180 struct conditional_expression_t {
181         expression_t  expression;
182         expression_t *condition;
183         expression_t *true_expression;
184         expression_t *false_expression;
185 };
186
187 struct statement_expression_t {
188         expression_t  expression;
189         statement_t  *statement;
190 };
191
192 typedef enum {
193         STORAGE_CLASS_NONE,
194         STORAGE_CLASS_TYPEDEF,
195         STORAGE_CLASS_EXTERN,
196         STORAGE_CLASS_STATIC,
197         STORAGE_CLASS_AUTO,
198         STORAGE_CLASS_REGISTER,
199         STORAGE_CLASS_ENUM_ENTRY
200 } storage_class_t;
201
202 typedef enum {
203         NAMESPACE_NORMAL,
204         NAMESPACE_STRUCT,
205         NAMESPACE_UNION,
206         NAMESPACE_ENUM,
207         NAMESPACE_LABEL
208 } namespace_t;
209
210 typedef enum {
211         INITIALIZER_VALUE,
212         INITIALIZER_LIST,
213 } initializer_type_t;
214
215 struct initializer_t {
216         initializer_type_t type;
217         designator_t      *designator;
218         union {
219                 initializer_t *list;
220                 expression_t  *value;
221         } v;
222         initializer_t *next;
223 };
224
225 struct declaration_t {
226         unsigned char       namespace;
227         unsigned char       storage_class;
228         unsigned int        address_taken : 1;
229         unsigned int        is_inline     : 1;
230         type_t             *type;
231         symbol_t           *symbol;
232         source_position_t   source_position;
233         union {
234                 bool            is_defined;
235                 statement_t    *statement;
236                 initializer_t  *initializer;
237         } init;
238         context_t           context;
239         context_t          *parent_context;
240
241         /** next declaration in a context */
242         declaration_t      *next;
243         /** next declaration with same symbol */
244         declaration_t      *symbol_next;
245
246         unsigned char       declaration_type; /* used in ast2firm module */
247         union {
248                 unsigned int    value_number;     /* used in ast2firm module */
249                 ir_entity      *entity;           /* used in ast2firm module */
250                 ir_node        *block;            /* used in ast2firm module */
251         } v;
252 };
253
254 typedef enum {
255         STATEMENT_INVALID,
256         STATEMENT_COMPOUND,
257         STATEMENT_RETURN,
258         STATEMENT_DECLARATION,
259         STATEMENT_IF,
260         STATEMENT_SWITCH,
261         STATEMENT_EXPRESSION,
262         STATEMENT_CONTINUE,
263         STATEMENT_BREAK,
264         STATEMENT_GOTO,
265         STATEMENT_LABEL,
266         STATEMENT_CASE_LABEL,
267         STATEMENT_WHILE,
268         STATEMENT_DO_WHILE,
269         STATEMENT_FOR
270 } statement_type_t;
271
272 struct statement_t {
273         statement_type_t   type;
274         statement_t       *next;
275         source_position_t  source_position;
276 };
277
278 struct return_statement_t {
279         statement_t   statement;
280         expression_t *return_value;
281 };
282
283 struct compound_statement_t {
284         statement_t  statement;
285         statement_t *statements;
286         context_t    context;
287 };
288
289 struct declaration_statement_t {
290         statement_t    statement;
291         declaration_t *declarations_begin;
292         declaration_t *declarations_end;
293 };
294
295 struct if_statement_t {
296         statement_t   statement;
297         expression_t *condition;
298         statement_t  *true_statement;
299         statement_t  *false_statement;
300 };
301
302 struct switch_statement_t {
303         statement_t   statement;
304         expression_t *expression;
305         statement_t  *body;
306 };
307
308 struct goto_statement_t {
309         statement_t    statement;
310         declaration_t *label;
311 };
312
313 struct case_label_statement_t {
314         statement_t   statement;
315         expression_t *expression;
316 };
317
318 struct label_statement_t {
319         statement_t    statement;
320         declaration_t *label;
321         statement_t   *label_statement;
322 };
323
324 struct expression_statement_t {
325         statement_t   statement;
326         expression_t *expression;
327 };
328
329 struct while_statement_t {
330         statement_t   statement;
331         expression_t *condition;
332         statement_t  *body;
333 };
334
335 struct do_while_statement_t {
336         statement_t   statement;
337         expression_t *condition;
338         statement_t  *body;
339 };
340
341 struct for_statement_t {
342         statement_t   statement;
343         expression_t  *initialisation;
344         expression_t  *condition;
345         expression_t  *step;
346         statement_t   *body;
347         context_t      context;
348 };
349
350 struct translation_unit_t {
351         context_t context;
352 };
353
354 static inline
355 void *_allocate_ast(size_t size)
356 {
357         return obstack_alloc(&ast_obstack, size);
358 }
359
360 #define allocate_ast(size)                 _allocate_ast(size)
361
362 #endif