4 #include <libfirm/firm_types.h>
13 extern struct obstack ast_obstack;
21 EXPR_WIDE_STRING_LITERAL,
33 EXPR_BUILTIN_CONSTANT_P,
40 EXPR_UNARY_NEGATE = EXPR_UNARY_FIRST,
42 EXPR_UNARY_BITWISE_NEGATE,
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,
51 EXPR_UNARY_CAST_IMPLICIT, /**< compiler generated cast */
52 EXPR_UNARY_ASSUME, /**< MS __assume() */
53 EXPR_UNARY_LAST = EXPR_UNARY_ASSUME,
56 EXPR_BINARY_ADD = EXPR_BINARY_FIRST,
64 EXPR_BINARY_LESSEQUAL,
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,
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,
87 EXPR_BINARY_BUILTIN_EXPECT,
88 EXPR_BINARY_ISGREATER,
89 EXPR_BINARY_ISGREATEREQUAL,
91 EXPR_BINARY_ISLESSEQUAL,
92 EXPR_BINARY_ISLESSGREATER,
93 EXPR_BINARY_ISUNORDERED,
94 EXPR_BINARY_LAST = EXPR_BINARY_ISUNORDERED,
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:
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:
153 declaration_t *declarations;
156 struct expression_base_t {
157 expression_kind_t kind;
159 source_position_t source_position;
162 struct const_expression_t {
163 expression_base_t expression;
166 long double float_value;
170 struct string_literal_expression_t {
171 expression_base_t expression;
175 struct wide_string_literal_expression_t {
176 expression_base_t expression;
180 struct builtin_symbol_expression_t {
181 expression_base_t expression;
185 struct builtin_constant_expression_t {
186 expression_base_t expression;
190 struct reference_expression_t {
191 expression_base_t expression;
193 declaration_t *declaration;
196 struct call_argument_t {
197 expression_t *expression;
198 call_argument_t *next;
201 struct call_expression_t {
202 expression_base_t expression;
203 expression_t *function;
204 call_argument_t *arguments;
207 struct unary_expression_t {
208 expression_base_t expression;
212 struct binary_expression_t {
213 expression_base_t expression;
218 struct select_expression_t {
219 expression_base_t expression;
220 expression_t *compound;
223 declaration_t *compound_entry;
226 struct array_access_expression_t {
227 expression_base_t expression;
228 expression_t *array_ref;
230 bool flipped; /* index/ref was written in a 5[a] way */
233 struct sizeof_expression_t {
234 expression_base_t expression;
236 expression_t *size_expression;
239 struct alignof_expression_t {
240 expression_base_t expression;
244 struct designator_t {
246 expression_t *array_access;
250 struct offsetof_expression_t {
251 expression_base_t expression;
253 designator_t *designator;
256 struct va_start_expression_t {
257 expression_base_t expression;
259 declaration_t *parameter;
262 struct va_arg_expression_t {
263 expression_base_t expression;
267 struct conditional_expression_t {
268 expression_base_t expression;
269 expression_t *condition;
270 expression_t *true_expression;
271 expression_t *false_expression;
274 struct statement_expression_t {
275 expression_base_t expression;
276 statement_t *statement;
279 struct classify_type_expression_t {
280 expression_base_t expression;
281 expression_t *type_expression;
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;
310 STORAGE_CLASS_TYPEDEF,
311 STORAGE_CLASS_EXTERN,
312 STORAGE_CLASS_STATIC,
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;
333 INITIALIZER_WIDE_STRING
334 } initializer_kind_t;
336 struct initializer_base_t {
337 initializer_kind_t kind;
340 struct initializer_value_t {
341 initializer_base_t initializer;
345 struct initializer_list_t {
346 initializer_base_t initializer;
348 initializer_t *initializers[];
351 struct initializer_string_t {
352 initializer_base_t initializer;
356 struct initializer_wide_string_t {
357 initializer_base_t initializer;
358 wide_string_t string;
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;
371 DM_DLLIMPORT = (1 << 0),
372 DM_DLLEXPORT = (1 << 1),
373 DM_THREAD = (1 << 2),
375 DM_FORCEINLINE = (1 << 4),
376 DM_NOTHROW = (1 << 5),
377 DM_NORETURN = (1 << 6),
378 DM_NOINLINE = (1 << 7)
381 typedef unsigned short decl_modifiers_t;
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;
391 source_position_t source_position;
394 statement_t *statement;
395 initializer_t *initializer;
396 expression_t *enum_value;
399 context_t *parent_context;
401 /** next declaration in a context */
403 /** next declaration with same symbol */
404 declaration_t *symbol_next;
406 /* the following fields are used in ast2firm module */
407 unsigned char declaration_kind;
409 unsigned int value_number;
420 STATEMENT_DECLARATION,
423 STATEMENT_EXPRESSION,
428 STATEMENT_CASE_LABEL,
435 struct statement_base_t {
436 statement_kind_t kind;
438 source_position_t source_position;
441 struct return_statement_t {
442 statement_base_t statement;
443 expression_t *return_value;
446 struct compound_statement_t {
447 statement_base_t statement;
448 statement_t *statements;
452 struct declaration_statement_t {
453 statement_base_t statement;
454 declaration_t *declarations_begin;
455 declaration_t *declarations_end;
458 struct if_statement_t {
459 statement_base_t statement;
460 expression_t *condition;
461 statement_t *true_statement;
462 statement_t *false_statement;
465 struct switch_statement_t {
466 statement_base_t statement;
467 expression_t *expression;
471 struct goto_statement_t {
472 statement_base_t statement;
473 declaration_t *label;
476 struct case_label_statement_t {
477 statement_base_t statement;
478 expression_t *expression;
479 statement_t *label_statement;
482 struct label_statement_t {
483 statement_base_t statement;
484 declaration_t *label;
485 statement_t *label_statement;
488 struct expression_statement_t {
489 statement_base_t statement;
490 expression_t *expression;
493 struct while_statement_t {
494 statement_base_t statement;
495 expression_t *condition;
499 struct do_while_statement_t {
500 statement_base_t statement;
501 expression_t *condition;
505 struct for_statement_t {
506 statement_base_t statement;
507 expression_t *initialisation;
508 expression_t *condition;
514 struct asm_constraint_t {
515 const char *constraints;
516 expression_t *expression;
518 asm_constraint_t *next;
521 struct asm_clobber_t {
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;
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;
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;
553 struct translation_unit_t {
558 void *_allocate_ast(size_t size)
560 return obstack_alloc(&ast_obstack, size);
563 #define allocate_ast(size) _allocate_ast(size)