__builtin_constant_p() implemented
[cparser] / ast_t.h
1 #ifndef AST_T_H
2 #define AST_T_H
3
4 #include <libfirm/firm_types.h>
5 #include <assert.h>
6
7 #include "ast.h"
8 #include "symbol.h"
9 #include "token_t.h"
10 #include "type.h"
11 #include "adt/obst.h"
12
13 extern struct obstack ast_obstack;
14
15 typedef enum {
16         EXPR_UNKNOWN = 0,
17         EXPR_INVALID,
18         EXPR_REFERENCE,
19         EXPR_CONST,
20         EXPR_STRING_LITERAL,
21         EXPR_WIDE_STRING_LITERAL,
22         EXPR_CALL,
23         EXPR_CONDITIONAL,
24         EXPR_SELECT,
25         EXPR_ARRAY_ACCESS,
26         EXPR_SIZEOF,
27         EXPR_CLASSIFY_TYPE,
28         EXPR_ALIGNOF,
29
30         EXPR_FUNCTION,
31         EXPR_PRETTY_FUNCTION,
32         EXPR_BUILTIN_SYMBOL,
33         EXPR_BUILTIN_CONSTANT_P,
34         EXPR_OFFSETOF,
35         EXPR_VA_START,
36         EXPR_VA_ARG,
37         EXPR_STATEMENT,
38
39         EXPR_UNARY_FIRST,
40         EXPR_UNARY_NEGATE = EXPR_UNARY_FIRST,
41         EXPR_UNARY_PLUS,
42         EXPR_UNARY_BITWISE_NEGATE,
43         EXPR_UNARY_NOT,
44         EXPR_UNARY_DEREFERENCE,
45         EXPR_UNARY_TAKE_ADDRESS,
46         EXPR_UNARY_POSTFIX_INCREMENT,
47         EXPR_UNARY_POSTFIX_DECREMENT,
48         EXPR_UNARY_PREFIX_INCREMENT,
49         EXPR_UNARY_PREFIX_DECREMENT,
50         EXPR_UNARY_CAST,
51         EXPR_UNARY_CAST_IMPLICIT, /**< compiler generated cast */
52         EXPR_UNARY_ASSUME,        /**< MS __assume() */
53         EXPR_UNARY_LAST = EXPR_UNARY_ASSUME,
54
55         EXPR_BINARY_FIRST,
56         EXPR_BINARY_ADD = EXPR_BINARY_FIRST,
57         EXPR_BINARY_SUB,
58         EXPR_BINARY_MUL,
59         EXPR_BINARY_DIV,
60         EXPR_BINARY_MOD,
61         EXPR_BINARY_EQUAL,
62         EXPR_BINARY_NOTEQUAL,
63         EXPR_BINARY_LESS,
64         EXPR_BINARY_LESSEQUAL,
65         EXPR_BINARY_GREATER,
66         EXPR_BINARY_GREATEREQUAL,
67         EXPR_BINARY_BITWISE_AND,
68         EXPR_BINARY_BITWISE_OR,
69         EXPR_BINARY_BITWISE_XOR,
70         EXPR_BINARY_LOGICAL_AND,
71         EXPR_BINARY_LOGICAL_OR,
72         EXPR_BINARY_SHIFTLEFT,
73         EXPR_BINARY_SHIFTRIGHT,
74         EXPR_BINARY_ASSIGN,
75         EXPR_BINARY_MUL_ASSIGN,
76         EXPR_BINARY_DIV_ASSIGN,
77         EXPR_BINARY_MOD_ASSIGN,
78         EXPR_BINARY_ADD_ASSIGN,
79         EXPR_BINARY_SUB_ASSIGN,
80         EXPR_BINARY_SHIFTLEFT_ASSIGN,
81         EXPR_BINARY_SHIFTRIGHT_ASSIGN,
82         EXPR_BINARY_BITWISE_AND_ASSIGN,
83         EXPR_BINARY_BITWISE_XOR_ASSIGN,
84         EXPR_BINARY_BITWISE_OR_ASSIGN,
85         EXPR_BINARY_COMMA,
86
87         EXPR_BINARY_BUILTIN_EXPECT,
88         EXPR_BINARY_ISGREATER,
89         EXPR_BINARY_ISGREATEREQUAL,
90         EXPR_BINARY_ISLESS,
91         EXPR_BINARY_ISLESSEQUAL,
92         EXPR_BINARY_ISLESSGREATER,
93         EXPR_BINARY_ISUNORDERED,
94         EXPR_BINARY_LAST = EXPR_BINARY_ISUNORDERED,
95 } expression_kind_t;
96
97 /* convenience macros */
98 #define EXPR_BINARY_CASES                  \
99         case EXPR_BINARY_ADD:                  \
100         case EXPR_BINARY_SUB:                  \
101         case EXPR_BINARY_MUL:                  \
102         case EXPR_BINARY_DIV:                  \
103         case EXPR_BINARY_MOD:                  \
104         case EXPR_BINARY_EQUAL:                \
105         case EXPR_BINARY_NOTEQUAL:             \
106         case EXPR_BINARY_LESS:                 \
107         case EXPR_BINARY_LESSEQUAL:            \
108         case EXPR_BINARY_GREATER:              \
109         case EXPR_BINARY_GREATEREQUAL:         \
110         case EXPR_BINARY_BITWISE_AND:          \
111         case EXPR_BINARY_BITWISE_OR:           \
112         case EXPR_BINARY_BITWISE_XOR:          \
113         case EXPR_BINARY_LOGICAL_AND:          \
114         case EXPR_BINARY_LOGICAL_OR:           \
115         case EXPR_BINARY_SHIFTLEFT:            \
116         case EXPR_BINARY_SHIFTRIGHT:           \
117         case EXPR_BINARY_ASSIGN:               \
118         case EXPR_BINARY_MUL_ASSIGN:           \
119         case EXPR_BINARY_DIV_ASSIGN:           \
120         case EXPR_BINARY_MOD_ASSIGN:           \
121         case EXPR_BINARY_ADD_ASSIGN:           \
122         case EXPR_BINARY_SUB_ASSIGN:           \
123         case EXPR_BINARY_SHIFTLEFT_ASSIGN:     \
124         case EXPR_BINARY_SHIFTRIGHT_ASSIGN:    \
125         case EXPR_BINARY_BITWISE_AND_ASSIGN:   \
126         case EXPR_BINARY_BITWISE_XOR_ASSIGN:   \
127         case EXPR_BINARY_BITWISE_OR_ASSIGN:    \
128         case EXPR_BINARY_COMMA:                \
129         case EXPR_BINARY_BUILTIN_EXPECT:       \
130         case EXPR_BINARY_ISGREATER:            \
131         case EXPR_BINARY_ISGREATEREQUAL:       \
132         case EXPR_BINARY_ISLESS:               \
133         case EXPR_BINARY_ISLESSEQUAL:          \
134         case EXPR_BINARY_ISLESSGREATER:        \
135         case EXPR_BINARY_ISUNORDERED:
136
137 #define EXPR_UNARY_CASES                   \
138         case EXPR_UNARY_NEGATE:                \
139         case EXPR_UNARY_PLUS:                  \
140         case EXPR_UNARY_BITWISE_NEGATE:        \
141         case EXPR_UNARY_NOT:                   \
142         case EXPR_UNARY_DEREFERENCE:           \
143         case EXPR_UNARY_TAKE_ADDRESS:          \
144         case EXPR_UNARY_POSTFIX_INCREMENT:     \
145         case EXPR_UNARY_POSTFIX_DECREMENT:     \
146         case EXPR_UNARY_PREFIX_INCREMENT:      \
147         case EXPR_UNARY_PREFIX_DECREMENT:      \
148         case EXPR_UNARY_CAST:                  \
149         case EXPR_UNARY_CAST_IMPLICIT:         \
150         case EXPR_UNARY_ASSUME:
151
152 struct context_t {
153         declaration_t *declarations;
154 };
155
156 struct expression_base_t {
157         expression_kind_t   kind;
158         type_t             *datatype;
159         source_position_t   source_position;
160 };
161
162 struct const_expression_t {
163         expression_base_t  expression;
164         union {
165                 long long   int_value;
166                 long double float_value;
167         } v;
168 };
169
170 struct string_literal_expression_t {
171         expression_base_t  expression;
172         const char        *value;
173 };
174
175 struct wide_string_literal_expression_t {
176         expression_base_t  expression;
177         wide_string_t      value;
178 };
179
180 struct builtin_symbol_expression_t {
181         expression_base_t  expression;
182         symbol_t          *symbol;
183 };
184
185 struct builtin_constant_expression_t {
186         expression_base_t  expression;
187         expression_t      *value;
188 };
189
190 struct reference_expression_t {
191         expression_base_t  expression;
192         symbol_t          *symbol;
193         declaration_t     *declaration;
194 };
195
196 struct call_argument_t {
197         expression_t    *expression;
198         call_argument_t *next;
199 };
200
201 struct call_expression_t {
202         expression_base_t  expression;
203         expression_t      *function;
204         call_argument_t   *arguments;
205 };
206
207 struct unary_expression_t {
208         expression_base_t  expression;
209         expression_t      *value;
210 };
211
212 struct binary_expression_t {
213         expression_base_t  expression;
214         expression_t      *left;
215         expression_t      *right;
216 };
217
218 struct select_expression_t {
219         expression_base_t  expression;
220         expression_t      *compound;
221         symbol_t          *symbol;
222
223         declaration_t     *compound_entry;
224 };
225
226 struct array_access_expression_t {
227         expression_base_t  expression;
228         expression_t      *array_ref;
229         expression_t      *index;
230         bool               flipped; /* index/ref was written in a 5[a] way */
231 };
232
233 struct sizeof_expression_t {
234         expression_base_t  expression;
235         type_t            *type;
236         expression_t      *size_expression;
237 };
238
239 struct alignof_expression_t {
240         expression_base_t  expression;
241         type_t            *type;
242 };
243
244 struct designator_t {
245         symbol_t     *symbol;
246         expression_t *array_access;
247         designator_t *next;
248 };
249
250 struct offsetof_expression_t {
251         expression_base_t  expression;
252         type_t            *type;
253         designator_t      *designator;
254 };
255
256 struct va_start_expression_t {
257         expression_base_t  expression;
258         expression_t      *ap;
259         declaration_t     *parameter;
260 };
261
262 struct va_arg_expression_t {
263         expression_base_t  expression;
264         expression_t      *ap;
265 };
266
267 struct conditional_expression_t {
268         expression_base_t  expression;
269         expression_t      *condition;
270         expression_t      *true_expression;
271         expression_t      *false_expression;
272 };
273
274 struct statement_expression_t {
275         expression_base_t  expression;
276         statement_t       *statement;
277 };
278
279 struct classify_type_expression_t {
280         expression_base_t  expression;
281         expression_t      *type_expression;
282 };
283
284 union expression_t {
285         expression_kind_t                kind;
286         expression_base_t                base;
287         const_expression_t               conste;
288         string_literal_expression_t      string;
289         wide_string_literal_expression_t wide_string;
290         builtin_symbol_expression_t      builtin_symbol;
291         builtin_constant_expression_t    builtin_constant;
292         reference_expression_t           reference;
293         call_expression_t                call;
294         unary_expression_t               unary;
295         binary_expression_t              binary;
296         select_expression_t              select;
297         array_access_expression_t        array_access;
298         sizeof_expression_t              sizeofe;
299         offsetof_expression_t            offsetofe;
300         va_start_expression_t            va_starte;
301         va_arg_expression_t              va_arge;
302         conditional_expression_t         conditional;
303         statement_expression_t           statement;
304         classify_type_expression_t       classify_type;
305         alignof_expression_t             alignofe;
306 };
307
308 typedef enum {
309         STORAGE_CLASS_NONE,
310         STORAGE_CLASS_TYPEDEF,
311         STORAGE_CLASS_EXTERN,
312         STORAGE_CLASS_STATIC,
313         STORAGE_CLASS_AUTO,
314         STORAGE_CLASS_REGISTER,
315         STORAGE_CLASS_ENUM_ENTRY,
316         STORAGE_CLASS_THREAD,
317         STORAGE_CLASS_THREAD_EXTERN,
318         STORAGE_CLASS_THREAD_STATIC
319 } storage_class_tag_t;
320
321 typedef enum {
322         NAMESPACE_NORMAL,
323         NAMESPACE_STRUCT,
324         NAMESPACE_UNION,
325         NAMESPACE_ENUM,
326         NAMESPACE_LABEL,
327 } namespace_t;
328
329 typedef enum {
330         INITIALIZER_VALUE,
331         INITIALIZER_LIST,
332         INITIALIZER_STRING,
333         INITIALIZER_WIDE_STRING
334 } initializer_kind_t;
335
336 struct initializer_base_t {
337         initializer_kind_t kind;
338 };
339
340 struct initializer_value_t {
341         initializer_base_t  initializer;
342         expression_t       *value;
343 };
344
345 struct initializer_list_t {
346         initializer_base_t  initializer;
347         size_t              len;
348         initializer_t      *initializers[];
349 };
350
351 struct initializer_string_t {
352         initializer_base_t  initializer;
353         const char         *string;
354 };
355
356 struct initializer_wide_string_t {
357         initializer_base_t  initializer;
358         wide_string_t       string;
359 };
360
361 union initializer_t {
362         initializer_kind_t        kind;
363         initializer_base_t        base;
364         initializer_value_t       value;
365         initializer_list_t        list;
366         initializer_string_t      string;
367         initializer_wide_string_t wide_string;
368 };
369
370 typedef enum {
371         DM_DLLIMPORT   = (1 << 0),
372         DM_DLLEXPORT   = (1 << 1),
373         DM_THREAD      = (1 << 2),
374         DM_NAKED       = (1 << 3),
375         DM_FORCEINLINE = (1 << 4),
376         DM_NOTHROW     = (1 << 5),
377         DM_NORETURN    = (1 << 6),
378         DM_NOINLINE    = (1 << 7)
379 } decl_modifier_t;
380
381 typedef unsigned short decl_modifiers_t;
382
383 struct declaration_t {
384         unsigned char       namespc;
385         unsigned char       storage_class;
386         decl_modifiers_t    decl_modifiers;
387         unsigned int        address_taken : 1;
388         unsigned int        is_inline     : 1;
389         type_t             *type;
390         symbol_t           *symbol;
391         source_position_t   source_position;
392         union {
393                 bool            is_defined;
394                 statement_t    *statement;
395                 initializer_t  *initializer;
396                 expression_t   *enum_value;
397         } init;
398         context_t           context;
399         context_t          *parent_context;
400
401         /** next declaration in a context */
402         declaration_t      *next;
403         /** next declaration with same symbol */
404         declaration_t      *symbol_next;
405
406         /* the following fields are used in ast2firm module */
407         unsigned char       declaration_kind;
408         union {
409                 unsigned int    value_number;
410                 ir_entity      *entity;
411                 ir_node        *block;
412                 tarval         *enum_val;
413         } v;
414 };
415
416 typedef enum {
417         STATEMENT_INVALID,
418         STATEMENT_COMPOUND,
419         STATEMENT_RETURN,
420         STATEMENT_DECLARATION,
421         STATEMENT_IF,
422         STATEMENT_SWITCH,
423         STATEMENT_EXPRESSION,
424         STATEMENT_CONTINUE,
425         STATEMENT_BREAK,
426         STATEMENT_GOTO,
427         STATEMENT_LABEL,
428         STATEMENT_CASE_LABEL,
429         STATEMENT_WHILE,
430         STATEMENT_DO_WHILE,
431         STATEMENT_FOR,
432         STATEMENT_ASM
433 } statement_kind_t;
434
435 struct statement_base_t {
436         statement_kind_t   kind;
437         statement_t       *next;
438         source_position_t  source_position;
439 };
440
441 struct return_statement_t {
442         statement_base_t  statement;
443         expression_t     *return_value;
444 };
445
446 struct compound_statement_t {
447         statement_base_t  statement;
448         statement_t      *statements;
449         context_t         context;
450 };
451
452 struct declaration_statement_t {
453         statement_base_t  statement;
454         declaration_t    *declarations_begin;
455         declaration_t    *declarations_end;
456 };
457
458 struct if_statement_t {
459         statement_base_t  statement;
460         expression_t     *condition;
461         statement_t      *true_statement;
462         statement_t      *false_statement;
463 };
464
465 struct switch_statement_t {
466         statement_base_t  statement;
467         expression_t     *expression;
468         statement_t      *body;
469 };
470
471 struct goto_statement_t {
472         statement_base_t  statement;
473         declaration_t    *label;
474 };
475
476 struct case_label_statement_t {
477         statement_base_t  statement;
478         expression_t     *expression;
479         statement_t      *label_statement;
480 };
481
482 struct label_statement_t {
483         statement_base_t  statement;
484         declaration_t    *label;
485         statement_t      *label_statement;
486 };
487
488 struct expression_statement_t {
489         statement_base_t  statement;
490         expression_t     *expression;
491 };
492
493 struct while_statement_t {
494         statement_base_t  statement;
495         expression_t     *condition;
496         statement_t      *body;
497 };
498
499 struct do_while_statement_t {
500         statement_base_t  statement;
501         expression_t     *condition;
502         statement_t      *body;
503 };
504
505 struct for_statement_t {
506         statement_base_t  statement;
507         expression_t     *initialisation;
508         expression_t     *condition;
509         expression_t     *step;
510         statement_t      *body;
511         context_t         context;
512 };
513
514 struct asm_constraint_t {
515         const char       *constraints;
516         expression_t     *expression;
517         symbol_t         *symbol;
518         asm_constraint_t *next;
519 };
520
521 struct asm_clobber_t {
522         const char    *clobber;
523         asm_clobber_t *next;
524 };
525
526 struct asm_statement_t {
527         statement_base_t  statement;
528         const char       *asm_text;
529         asm_constraint_t *inputs;
530         asm_constraint_t *outputs;
531         asm_clobber_t    *clobbers;
532         bool              is_volatile;
533 };
534
535 union statement_t {
536         statement_kind_t         kind;
537         statement_base_t         base;
538         return_statement_t       returns;
539         compound_statement_t     compound;
540         declaration_statement_t  declaration;
541         if_statement_t           ifs;
542         switch_statement_t       switchs;
543         goto_statement_t         gotos;
544         case_label_statement_t   case_label;
545         label_statement_t        label;
546         expression_statement_t   expression;
547         while_statement_t        whiles;
548         do_while_statement_t     do_while;
549         for_statement_t          fors;
550         asm_statement_t          asms;
551 };
552
553 struct translation_unit_t {
554         context_t context;
555 };
556
557 static inline
558 void *_allocate_ast(size_t size)
559 {
560         return obstack_alloc(&ast_obstack, size);
561 }
562
563 #define allocate_ast(size)                 _allocate_ast(size)
564
565 #endif