c07ee6414d93162e6cbfb70c1941efe235ddf13b
[cparser] / ast2firm.c
1 /*
2  * This file is part of cparser.
3  * Copyright (C) 2007-2009 Matthias Braun <matze@braunis.de>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18  * 02111-1307, USA.
19  */
20 #include <config.h>
21
22 #include <assert.h>
23 #include <string.h>
24 #include <stdbool.h>
25 #include <limits.h>
26
27 #include <libfirm/firm.h>
28 #include <libfirm/adt/obst.h>
29 #include <libfirm/be.h>
30
31 #include "ast2firm.h"
32
33 #include "adt/error.h"
34 #include "adt/array.h"
35 #include "adt/util.h"
36 #include "symbol_t.h"
37 #include "token_t.h"
38 #include "type_t.h"
39 #include "ast_t.h"
40 #include "entity_t.h"
41 #include "parser.h"
42 #include "diagnostic.h"
43 #include "lang_features.h"
44 #include "types.h"
45 #include "type_hash.h"
46 #include "mangle.h"
47 #include "walk.h"
48 #include "warning.h"
49 #include "printer.h"
50 #include "entitymap_t.h"
51 #include "driver/firm_opt.h"
52
53 typedef struct trampoline_region trampoline_region;
54 struct trampoline_region {
55         ir_entity        *function;    /**< The function that is called by this trampoline */
56         ir_entity        *region;      /**< created region for the trampoline */
57 };
58
59 fp_model_t firm_fp_model = fp_model_precise;
60
61 static const backend_params *be_params;
62
63 static ir_type *ir_type_char;
64 static ir_type *ir_type_const_char;
65 static ir_type *ir_type_wchar_t;
66 static ir_type *ir_type_void;
67 static ir_type *ir_type_int;
68
69 /* architecture specific floating point arithmetic mode (if any) */
70 static ir_mode *mode_float_arithmetic;
71
72 /* alignment of stack parameters */
73 static unsigned stack_param_align;
74
75 static int        next_value_number_function;
76 static ir_node   *continue_label;
77 static ir_node   *break_label;
78 static ir_node   *current_switch_cond;
79 static bool       saw_default_label;
80 static label_t  **all_labels;
81 static entity_t **inner_functions;
82 static ir_node   *ijmp_list;
83 static bool       constant_folding;
84
85 static const entity_t     *current_function_entity;
86 static ir_node            *current_function_name;
87 static ir_node            *current_funcsig;
88 static switch_statement_t *current_switch;
89 static ir_graph           *current_function;
90 static translation_unit_t *current_translation_unit;
91 static trampoline_region  *current_trampolines;
92 static ir_type            *current_outer_frame;
93 static ir_node            *current_static_link;
94 static ir_entity          *current_vararg_entity;
95
96 static entitymap_t  entitymap;
97
98 static struct obstack asm_obst;
99
100 typedef enum declaration_kind_t {
101         DECLARATION_KIND_UNKNOWN,
102         DECLARATION_KIND_VARIABLE_LENGTH_ARRAY,
103         DECLARATION_KIND_GLOBAL_VARIABLE,
104         DECLARATION_KIND_LOCAL_VARIABLE,
105         DECLARATION_KIND_LOCAL_VARIABLE_ENTITY,
106         DECLARATION_KIND_PARAMETER,
107         DECLARATION_KIND_PARAMETER_ENTITY,
108         DECLARATION_KIND_FUNCTION,
109         DECLARATION_KIND_COMPOUND_MEMBER,
110         DECLARATION_KIND_INNER_FUNCTION
111 } declaration_kind_t;
112
113 static ir_mode *get_ir_mode_storage(type_t *type);
114
115 static ir_type *get_ir_type_incomplete(type_t *type);
116
117 static void enqueue_inner_function(entity_t *entity)
118 {
119         if (inner_functions == NULL)
120                 inner_functions = NEW_ARR_F(entity_t *, 0);
121         ARR_APP1(entity_t*, inner_functions, entity);
122 }
123
124 static ir_node *uninitialized_local_var(ir_graph *irg, ir_mode *mode, int pos)
125 {
126         const entity_t *entity = get_irg_loc_description(irg, pos);
127
128         if (entity != NULL) {
129                 source_position_t const *const pos = &entity->base.source_position;
130                 warningf(WARN_UNINITIALIZED, pos, "'%N' might be used uninitialized", entity);
131         }
132         return new_r_Unknown(irg, mode);
133 }
134
135 static const char *dbg_retrieve(const dbg_info *dbg, unsigned *line)
136 {
137         const source_position_t *pos = (const source_position_t*) dbg;
138         if (pos == NULL)
139                 return NULL;
140         if (line != NULL)
141                 *line = pos->lineno;
142         return pos->input_name;
143 }
144
145 static dbg_info *get_dbg_info(const source_position_t *pos)
146 {
147         return (dbg_info*) pos;
148 }
149
150 static void dbg_print_type_dbg_info(char *buffer, size_t buffer_size,
151                                     const type_dbg_info *dbg)
152 {
153         assert(dbg != NULL);
154         print_to_buffer(buffer, buffer_size);
155         const type_t *type = (const type_t*) dbg;
156         print_type(type);
157         finish_print_to_buffer();
158 }
159
160 static type_dbg_info *get_type_dbg_info_(const type_t *type)
161 {
162         return (type_dbg_info*) type;
163 }
164
165 /* is the current block a reachable one? */
166 static bool currently_reachable(void)
167 {
168         ir_node *const block = get_cur_block();
169         return block != NULL && !is_Bad(block);
170 }
171
172 static void set_unreachable_now(void)
173 {
174         set_cur_block(NULL);
175 }
176
177 static ir_mode *atomic_modes[ATOMIC_TYPE_LAST+1];
178
179 static ir_mode *mode_int, *mode_uint;
180
181 static ir_node *_expression_to_firm(const expression_t *expression);
182 static ir_node *expression_to_firm(const expression_t *expression);
183 static void create_local_declaration(entity_t *entity);
184
185 static unsigned decide_modulo_shift(unsigned type_size)
186 {
187         if (architecture_modulo_shift == 0)
188                 return 0;
189         if (type_size < architecture_modulo_shift)
190                 return architecture_modulo_shift;
191         return type_size;
192 }
193
194 static ir_mode *init_atomic_ir_mode(atomic_type_kind_t kind)
195 {
196         unsigned flags = get_atomic_type_flags(kind);
197         unsigned size  = get_atomic_type_size(kind);
198         if ( (flags & (ATOMIC_TYPE_FLAG_INTEGER | ATOMIC_TYPE_FLAG_FLOAT))
199                         && !(flags & ATOMIC_TYPE_FLAG_COMPLEX)) {
200                 char            name[64];
201                 ir_mode_sort    sort;
202                 unsigned        bit_size     = size * 8;
203                 bool            is_signed    = (flags & ATOMIC_TYPE_FLAG_SIGNED) != 0;
204                 unsigned        modulo_shift = 0;
205                 ir_mode_arithmetic arithmetic;
206
207                 if (flags & ATOMIC_TYPE_FLAG_INTEGER) {
208                         assert(! (flags & ATOMIC_TYPE_FLAG_FLOAT));
209                         snprintf(name, sizeof(name), "%s%u", is_signed ? "I" : "U",
210                                  bit_size);
211                         sort         = irms_int_number;
212                         arithmetic   = irma_twos_complement;
213                         modulo_shift = decide_modulo_shift(bit_size);
214                 } else {
215                         assert(flags & ATOMIC_TYPE_FLAG_FLOAT);
216                         snprintf(name, sizeof(name), "F%u", bit_size);
217                         sort         = irms_float_number;
218                         arithmetic   = irma_ieee754;
219                 }
220                 return new_ir_mode(name, sort, bit_size, is_signed, arithmetic,
221                                    modulo_shift);
222         }
223
224         return NULL;
225 }
226
227 /**
228  * Initialises the atomic modes depending on the machine size.
229  */
230 static void init_atomic_modes(void)
231 {
232         for (int i = 0; i <= ATOMIC_TYPE_LAST; ++i) {
233                 atomic_modes[i] = init_atomic_ir_mode((atomic_type_kind_t) i);
234         }
235         mode_int  = atomic_modes[ATOMIC_TYPE_INT];
236         mode_uint = atomic_modes[ATOMIC_TYPE_UINT];
237
238         /* there's no real void type in firm */
239         atomic_modes[ATOMIC_TYPE_VOID] = atomic_modes[ATOMIC_TYPE_CHAR];
240 }
241
242 ir_mode *get_atomic_mode(atomic_type_kind_t kind)
243 {
244         assert(kind <= ATOMIC_TYPE_LAST);
245         return atomic_modes[kind];
246 }
247
248 static ir_node *get_vla_size(array_type_t *const type)
249 {
250         ir_node *size_node = type->size_node;
251         if (size_node == NULL) {
252                 size_node = expression_to_firm(type->size_expression);
253                 type->size_node = size_node;
254         }
255         return size_node;
256 }
257
258 /**
259  * Return a node representing the size of a type.
260  */
261 static ir_node *get_type_size_node(type_t *type)
262 {
263         type = skip_typeref(type);
264
265         if (is_type_array(type) && type->array.is_vla) {
266                 ir_node *size_node = get_vla_size(&type->array);
267                 ir_node *elem_size = get_type_size_node(type->array.element_type);
268                 ir_mode *mode      = get_irn_mode(size_node);
269                 ir_node *real_size = new_d_Mul(NULL, size_node, elem_size, mode);
270                 return real_size;
271         }
272
273         ir_mode *mode = get_ir_mode_storage(type_size_t);
274         symconst_symbol sym;
275         sym.type_p = get_ir_type(type);
276         return new_SymConst(mode, sym, symconst_type_size);
277 }
278
279 static unsigned count_parameters(const function_type_t *function_type)
280 {
281         unsigned count = 0;
282
283         function_parameter_t *parameter = function_type->parameters;
284         for ( ; parameter != NULL; parameter = parameter->next) {
285                 ++count;
286         }
287
288         return count;
289 }
290
291 /**
292  * Creates a Firm type for an atomic type
293  */
294 static ir_type *create_atomic_type(atomic_type_kind_t akind, const type_t *type)
295 {
296         ir_mode        *mode      = atomic_modes[akind];
297         type_dbg_info  *dbgi      = get_type_dbg_info_(type);
298         ir_type        *irtype    = new_d_type_primitive(mode, dbgi);
299         il_alignment_t  alignment = get_atomic_type_alignment(akind);
300
301         set_type_alignment_bytes(irtype, alignment);
302
303         return irtype;
304 }
305
306 /**
307  * Creates a Firm type for a complex type
308  */
309 static ir_type *create_complex_type(const atomic_type_t *type)
310 {
311         atomic_type_kind_t  kind = type->akind;
312         ir_mode            *mode = atomic_modes[kind];
313         ident              *id   = get_mode_ident(mode);
314
315         (void) id;
316
317         /* FIXME: finish the array */
318         return NULL;
319 }
320
321 /**
322  * Creates a Firm type for an imaginary type
323  */
324 static ir_type *create_imaginary_type(const atomic_type_t *type)
325 {
326         return create_atomic_type(type->akind, (const type_t*)type);
327 }
328
329 /**
330  * return type of a parameter (and take transparent union gnu extension into
331  * account)
332  */
333 static type_t *get_parameter_type(type_t *orig_type)
334 {
335         type_t *type = skip_typeref(orig_type);
336         if (is_type_union(type)
337                         && get_type_modifiers(orig_type) & DM_TRANSPARENT_UNION) {
338                 compound_t *compound = type->compound.compound;
339                 type                 = compound->members.entities->declaration.type;
340         }
341
342         return type;
343 }
344
345 static ir_type *create_method_type(const function_type_t *function_type, bool for_closure)
346 {
347         type_t        *return_type  = skip_typeref(function_type->return_type);
348
349         int            n_parameters = count_parameters(function_type)
350                                        + (for_closure ? 1 : 0);
351         int            n_results    = return_type == type_void ? 0 : 1;
352         type_dbg_info *dbgi         = get_type_dbg_info_((const type_t*) function_type);
353         ir_type       *irtype       = new_d_type_method(n_parameters, n_results, dbgi);
354
355         if (return_type != type_void) {
356                 ir_type *restype = get_ir_type(return_type);
357                 set_method_res_type(irtype, 0, restype);
358         }
359
360         function_parameter_t *parameter = function_type->parameters;
361         int                   n         = 0;
362         if (for_closure) {
363                 ir_type *p_irtype = get_ir_type(type_void_ptr);
364                 set_method_param_type(irtype, n, p_irtype);
365                 ++n;
366         }
367         for ( ; parameter != NULL; parameter = parameter->next) {
368                 type_t  *type     = get_parameter_type(parameter->type);
369                 ir_type *p_irtype = get_ir_type(type);
370                 set_method_param_type(irtype, n, p_irtype);
371                 ++n;
372         }
373
374         bool is_variadic = function_type->variadic;
375
376         if (is_variadic)
377                 set_method_variadicity(irtype, variadicity_variadic);
378
379         unsigned cc = get_method_calling_convention(irtype);
380         switch (function_type->calling_convention) {
381         case CC_DEFAULT: /* unspecified calling convention, equal to one of the other, typically cdecl */
382         case CC_CDECL:
383 is_cdecl:
384                 set_method_calling_convention(irtype, SET_CDECL(cc));
385                 break;
386
387         case CC_STDCALL:
388                 if (is_variadic)
389                         goto is_cdecl;
390
391                 /* only non-variadic function can use stdcall, else use cdecl */
392                 set_method_calling_convention(irtype, SET_STDCALL(cc));
393                 break;
394
395         case CC_FASTCALL:
396                 if (is_variadic)
397                         goto is_cdecl;
398                 /* only non-variadic function can use fastcall, else use cdecl */
399                 set_method_calling_convention(irtype, SET_FASTCALL(cc));
400                 break;
401
402         case CC_THISCALL:
403                 /* Hmm, leave default, not accepted by the parser yet. */
404                 break;
405         }
406
407         if (for_closure)
408                 set_method_calling_convention(irtype, get_method_calling_convention(irtype) | cc_this_call);
409
410         const decl_modifiers_t modifiers = function_type->modifiers;
411         if (modifiers & DM_CONST)
412                 add_method_additional_properties(irtype, mtp_property_const);
413         if (modifiers & DM_PURE)
414                 add_method_additional_properties(irtype, mtp_property_pure);
415         if (modifiers & DM_RETURNS_TWICE)
416                 add_method_additional_properties(irtype, mtp_property_returns_twice);
417         if (modifiers & DM_NORETURN)
418                 add_method_additional_properties(irtype, mtp_property_noreturn);
419         if (modifiers & DM_NOTHROW)
420                 add_method_additional_properties(irtype, mtp_property_nothrow);
421         if (modifiers & DM_MALLOC)
422                 add_method_additional_properties(irtype, mtp_property_malloc);
423
424         return irtype;
425 }
426
427 static ir_type *create_pointer_type(pointer_type_t *type)
428 {
429         type_dbg_info *dbgi         = get_type_dbg_info_((const type_t*) type);
430         type_t        *points_to    = type->points_to;
431         ir_type       *ir_points_to = get_ir_type_incomplete(points_to);
432         ir_type       *irtype       = new_d_type_pointer(ir_points_to, dbgi);
433
434         return irtype;
435 }
436
437 static ir_type *create_reference_type(reference_type_t *type)
438 {
439         type_dbg_info *dbgi         = get_type_dbg_info_((const type_t*) type);
440         type_t        *refers_to    = type->refers_to;
441         ir_type       *ir_refers_to = get_ir_type_incomplete(refers_to);
442         ir_type       *irtype       = new_d_type_pointer(ir_refers_to, dbgi);
443
444         return irtype;
445 }
446
447 static ir_type *create_array_type(array_type_t *type)
448 {
449         type_dbg_info *dbgi            = get_type_dbg_info_((const type_t*) type);
450         type_t        *element_type    = type->element_type;
451         ir_type       *ir_element_type = get_ir_type(element_type);
452         ir_type       *irtype          = new_d_type_array(1, ir_element_type, dbgi);
453
454         const int align = get_type_alignment_bytes(ir_element_type);
455         set_type_alignment_bytes(irtype, align);
456
457         if (type->size_constant) {
458                 int n_elements = type->size;
459
460                 set_array_bounds_int(irtype, 0, 0, n_elements);
461
462                 size_t elemsize = get_type_size_bytes(ir_element_type);
463                 if (elemsize % align > 0) {
464                         elemsize += align - (elemsize % align);
465                 }
466                 set_type_size_bytes(irtype, n_elements * elemsize);
467         } else {
468                 set_array_lower_bound_int(irtype, 0, 0);
469         }
470         set_type_state(irtype, layout_fixed);
471
472         return irtype;
473 }
474
475 /**
476  * Return the signed integer type of size bits.
477  *
478  * @param size   the size
479  */
480 static ir_type *get_signed_int_type_for_bit_size(ir_type *base_tp,
481                                                  unsigned size,
482                                                                                                  const type_t *type)
483 {
484         static ir_mode *s_modes[64 + 1] = {NULL, };
485         ir_type *res;
486         ir_mode *mode;
487
488         if (size <= 0 || size > 64)
489                 return NULL;
490
491         mode = s_modes[size];
492         if (mode == NULL) {
493                 char name[32];
494
495                 snprintf(name, sizeof(name), "bf_I%u", size);
496                 mode = new_ir_mode(name, irms_int_number, size, 1, irma_twos_complement,
497                                    size <= 32 ? 32 : size );
498                 s_modes[size] = mode;
499         }
500
501         type_dbg_info *dbgi = get_type_dbg_info_(type);
502         res                 = new_d_type_primitive(mode, dbgi);
503         set_primitive_base_type(res, base_tp);
504
505         return res;
506 }
507
508 /**
509  * Return the unsigned integer type of size bits.
510  *
511  * @param size   the size
512  */
513 static ir_type *get_unsigned_int_type_for_bit_size(ir_type *base_tp,
514                                                    unsigned size,
515                                                                                                    const type_t *type)
516 {
517         static ir_mode *u_modes[64 + 1] = {NULL, };
518         ir_type *res;
519         ir_mode *mode;
520
521         if (size <= 0 || size > 64)
522                 return NULL;
523
524         mode = u_modes[size];
525         if (mode == NULL) {
526                 char name[32];
527
528                 snprintf(name, sizeof(name), "bf_U%u", size);
529                 mode = new_ir_mode(name, irms_int_number, size, 0, irma_twos_complement,
530                                    size <= 32 ? 32 : size );
531                 u_modes[size] = mode;
532         }
533
534         type_dbg_info *dbgi = get_type_dbg_info_(type);
535         res = new_d_type_primitive(mode, dbgi);
536         set_primitive_base_type(res, base_tp);
537
538         return res;
539 }
540
541 static ir_type *create_bitfield_type(const entity_t *entity)
542 {
543         assert(entity->kind == ENTITY_COMPOUND_MEMBER);
544         type_t *base = skip_typeref(entity->declaration.type);
545         assert(base->kind == TYPE_ATOMIC || base->kind == TYPE_ENUM);
546         ir_type *irbase = get_ir_type(base);
547
548         unsigned bit_size = entity->compound_member.bit_size;
549
550         assert(!is_type_float(base));
551         if (is_type_signed(base)) {
552                 return get_signed_int_type_for_bit_size(irbase, bit_size, base);
553         } else {
554                 return get_unsigned_int_type_for_bit_size(irbase, bit_size, base);
555         }
556 }
557
558 #define INVALID_TYPE ((ir_type_ptr)-1)
559
560 enum {
561         COMPOUND_IS_STRUCT = false,
562         COMPOUND_IS_UNION  = true
563 };
564
565 /**
566  * Construct firm type from ast struct type.
567  */
568 static ir_type *create_compound_type(compound_type_t *type,
569                                      bool incomplete, bool is_union)
570 {
571         compound_t *compound = type->compound;
572
573         if (compound->irtype != NULL && (compound->irtype_complete || incomplete)) {
574                 return compound->irtype;
575         }
576
577         symbol_t *type_symbol = compound->base.symbol;
578         ident    *id;
579         if (type_symbol != NULL) {
580                 id = new_id_from_str(type_symbol->string);
581         } else {
582                 if (is_union) {
583                         id = id_unique("__anonymous_union.%u");
584                 } else {
585                         id = id_unique("__anonymous_struct.%u");
586                 }
587         }
588
589         ir_type *irtype;
590         if (is_union) {
591                 irtype = new_type_union(id);
592         } else {
593                 irtype = new_type_struct(id);
594         }
595
596         compound->irtype_complete = false;
597         compound->irtype          = irtype;
598
599         if (incomplete)
600                 return irtype;
601
602         if (is_union) {
603                 layout_union_type(type);
604         } else {
605                 layout_struct_type(type);
606         }
607
608         compound->irtype_complete = true;
609
610         entity_t *entry = compound->members.entities;
611         for ( ; entry != NULL; entry = entry->base.next) {
612                 if (entry->kind != ENTITY_COMPOUND_MEMBER)
613                         continue;
614
615                 symbol_t *symbol     = entry->base.symbol;
616                 type_t   *entry_type = entry->declaration.type;
617                 ident    *ident;
618                 if (symbol == NULL) {
619                         /* anonymous bitfield member, skip */
620                         if (entry->compound_member.bitfield)
621                                 continue;
622                         assert(entry_type->kind == TYPE_COMPOUND_STRUCT
623                                         || entry_type->kind == TYPE_COMPOUND_UNION);
624                         ident = id_unique("anon.%u");
625                 } else {
626                         ident = new_id_from_str(symbol->string);
627                 }
628
629                 dbg_info *dbgi       = get_dbg_info(&entry->base.source_position);
630
631                 ir_type *entry_irtype;
632                 if (entry->compound_member.bitfield) {
633                         entry_irtype = create_bitfield_type(entry);
634                 } else {
635                         entry_irtype = get_ir_type(entry_type);
636                 }
637                 ir_entity *entity = new_d_entity(irtype, ident, entry_irtype, dbgi);
638
639                 set_entity_offset(entity, entry->compound_member.offset);
640                 set_entity_offset_bits_remainder(entity,
641                                                  entry->compound_member.bit_offset);
642
643                 assert(entry->declaration.kind == DECLARATION_KIND_UNKNOWN);
644                 entry->declaration.kind       = DECLARATION_KIND_COMPOUND_MEMBER;
645                 entry->compound_member.entity = entity;
646         }
647
648         set_type_alignment_bytes(irtype, compound->alignment);
649         set_type_size_bytes(irtype, compound->size);
650         set_type_state(irtype, layout_fixed);
651
652         return irtype;
653 }
654
655 static ir_type *create_enum_type(enum_type_t *const type)
656 {
657         type->base.base.firm_type = ir_type_int;
658
659         ir_mode   *const mode    = mode_int;
660         ir_tarval *const one     = get_mode_one(mode);
661         ir_tarval *      tv_next = get_mode_null(mode);
662
663         bool constant_folding_old = constant_folding;
664         constant_folding = true;
665
666         enum_t   *enume = type->enume;
667         entity_t *entry = enume->base.next;
668         for (; entry != NULL; entry = entry->base.next) {
669                 if (entry->kind != ENTITY_ENUM_VALUE)
670                         break;
671
672                 expression_t *const init = entry->enum_value.value;
673                 if (init != NULL) {
674                         ir_node *const cnst = expression_to_firm(init);
675                         if (!is_Const(cnst)) {
676                                 panic("couldn't fold constant");
677                         }
678                         tv_next = get_Const_tarval(cnst);
679                 }
680                 entry->enum_value.tv = tv_next;
681                 tv_next = tarval_add(tv_next, one);
682         }
683
684         constant_folding = constant_folding_old;
685
686         return create_atomic_type(type->base.akind, (const type_t*) type);
687 }
688
689 static ir_type *get_ir_type_incomplete(type_t *type)
690 {
691         assert(type != NULL);
692         type = skip_typeref(type);
693
694         if (type->base.firm_type != NULL) {
695                 assert(type->base.firm_type != INVALID_TYPE);
696                 return type->base.firm_type;
697         }
698
699         switch (type->kind) {
700         case TYPE_COMPOUND_STRUCT:
701                 return create_compound_type(&type->compound, true, COMPOUND_IS_STRUCT);
702         case TYPE_COMPOUND_UNION:
703                 return create_compound_type(&type->compound, true, COMPOUND_IS_UNION);
704         default:
705                 return get_ir_type(type);
706         }
707 }
708
709 ir_type *get_ir_type(type_t *type)
710 {
711         assert(type != NULL);
712
713         type = skip_typeref(type);
714
715         if (type->base.firm_type != NULL) {
716                 assert(type->base.firm_type != INVALID_TYPE);
717                 return type->base.firm_type;
718         }
719
720         ir_type *firm_type = NULL;
721         switch (type->kind) {
722         case TYPE_ERROR:
723                 /* Happens while constant folding, when there was an error */
724                 return create_atomic_type(ATOMIC_TYPE_VOID, NULL);
725
726         case TYPE_ATOMIC:
727                 firm_type = create_atomic_type(type->atomic.akind, type);
728                 break;
729         case TYPE_COMPLEX:
730                 firm_type = create_complex_type(&type->atomic);
731                 break;
732         case TYPE_IMAGINARY:
733                 firm_type = create_imaginary_type(&type->atomic);
734                 break;
735         case TYPE_FUNCTION:
736                 firm_type = create_method_type(&type->function, false);
737                 break;
738         case TYPE_POINTER:
739                 firm_type = create_pointer_type(&type->pointer);
740                 break;
741         case TYPE_REFERENCE:
742                 firm_type = create_reference_type(&type->reference);
743                 break;
744         case TYPE_ARRAY:
745                 firm_type = create_array_type(&type->array);
746                 break;
747         case TYPE_COMPOUND_STRUCT:
748                 firm_type = create_compound_type(&type->compound, false, COMPOUND_IS_STRUCT);
749                 break;
750         case TYPE_COMPOUND_UNION:
751                 firm_type = create_compound_type(&type->compound, false, COMPOUND_IS_UNION);
752                 break;
753         case TYPE_ENUM:
754                 firm_type = create_enum_type(&type->enumt);
755                 break;
756
757         case TYPE_TYPEOF:
758         case TYPE_TYPEDEF:
759                 break;
760         }
761         if (firm_type == NULL)
762                 panic("unknown type found");
763
764         type->base.firm_type = firm_type;
765         return firm_type;
766 }
767
768 static ir_mode *get_ir_mode_storage(type_t *type)
769 {
770         ir_type *irtype = get_ir_type(type);
771
772         /* firm doesn't report a mode for arrays somehow... */
773         if (is_Array_type(irtype)) {
774                 return mode_P_data;
775         }
776
777         ir_mode *mode = get_type_mode(irtype);
778         assert(mode != NULL);
779         return mode;
780 }
781
782 /*
783  * get arithmetic mode for a type. This is different from get_ir_mode_storage,
784  * int that it returns bigger modes for floating point on some platforms
785  * (x87 internally does arithemtic with 80bits)
786  */
787 static ir_mode *get_ir_mode_arithmetic(type_t *type)
788 {
789         ir_mode *mode = get_ir_mode_storage(type);
790         if (mode_is_float(mode) && mode_float_arithmetic != NULL) {
791                 return mode_float_arithmetic;
792         }
793
794         return mode;
795 }
796
797 /** Names of the runtime functions. */
798 static const struct {
799         int        id;           /**< the rts id */
800         int        n_res;        /**< number of return values */
801         const char *name;        /**< the name of the rts function */
802         int        n_params;     /**< number of parameters */
803         unsigned   flags;        /**< language flags */
804 } rts_data[] = {
805         { rts_debugbreak, 0, "__debugbreak", 0, _MS },
806         { rts_abort,      0, "abort",        0, _C89 },
807         { rts_alloca,     1, "alloca",       1, _ALL },
808         { rts_abs,        1, "abs",          1, _C89 },
809         { rts_labs,       1, "labs",         1, _C89 },
810         { rts_llabs,      1, "llabs",        1, _C99 },
811         { rts_imaxabs,    1, "imaxabs",      1, _C99 },
812
813         { rts_fabs,       1, "fabs",         1, _C89 },
814         { rts_sqrt,       1, "sqrt",         1, _C89 },
815         { rts_cbrt,       1, "cbrt",         1, _C99 },
816         { rts_exp,        1, "exp",          1, _C89 },
817         { rts_exp2,       1, "exp2",         1, _C89 },
818         { rts_exp10,      1, "exp10",        1, _GNUC },
819         { rts_log,        1, "log",          1, _C89 },
820         { rts_log2,       1, "log2",         1, _C89 },
821         { rts_log10,      1, "log10",        1, _C89 },
822         { rts_pow,        1, "pow",          2, _C89 },
823         { rts_sin,        1, "sin",          1, _C89 },
824         { rts_cos,        1, "cos",          1, _C89 },
825         { rts_tan,        1, "tan",          1, _C89 },
826         { rts_asin,       1, "asin",         1, _C89 },
827         { rts_acos,       1, "acos",         1, _C89 },
828         { rts_atan,       1, "atan",         1, _C89 },
829         { rts_sinh,       1, "sinh",         1, _C89 },
830         { rts_cosh,       1, "cosh",         1, _C89 },
831         { rts_tanh,       1, "tanh",         1, _C89 },
832
833         { rts_fabsf,      1, "fabsf",        1, _C99 },
834         { rts_sqrtf,      1, "sqrtf",        1, _C99 },
835         { rts_cbrtf,      1, "cbrtf",        1, _C99 },
836         { rts_expf,       1, "expf",         1, _C99 },
837         { rts_exp2f,      1, "exp2f",        1, _C99 },
838         { rts_exp10f,     1, "exp10f",       1, _GNUC },
839         { rts_logf,       1, "logf",         1, _C99 },
840         { rts_log2f,      1, "log2f",        1, _C99 },
841         { rts_log10f,     1, "log10f",       1, _C99 },
842         { rts_powf,       1, "powf",         2, _C99 },
843         { rts_sinf,       1, "sinf",         1, _C99 },
844         { rts_cosf,       1, "cosf",         1, _C99 },
845         { rts_tanf,       1, "tanf",         1, _C99 },
846         { rts_asinf,      1, "asinf",        1, _C99 },
847         { rts_acosf,      1, "acosf",        1, _C99 },
848         { rts_atanf,      1, "atanf",        1, _C99 },
849         { rts_sinhf,      1, "sinhf",        1, _C99 },
850         { rts_coshf,      1, "coshf",        1, _C99 },
851         { rts_tanhf,      1, "tanhf",        1, _C99 },
852
853         { rts_fabsl,      1, "fabsl",        1, _C99 },
854         { rts_sqrtl,      1, "sqrtl",        1, _C99 },
855         { rts_cbrtl,      1, "cbrtl",        1, _C99 },
856         { rts_expl,       1, "expl",         1, _C99 },
857         { rts_exp2l,      1, "exp2l",        1, _C99 },
858         { rts_exp10l,     1, "exp10l",       1, _GNUC },
859         { rts_logl,       1, "logl",         1, _C99 },
860         { rts_log2l,      1, "log2l",        1, _C99 },
861         { rts_log10l,     1, "log10l",       1, _C99 },
862         { rts_powl,       1, "powl",         2, _C99 },
863         { rts_sinl,       1, "sinl",         1, _C99 },
864         { rts_cosl,       1, "cosl",         1, _C99 },
865         { rts_tanl,       1, "tanl",         1, _C99 },
866         { rts_asinl,      1, "asinl",        1, _C99 },
867         { rts_acosl,      1, "acosl",        1, _C99 },
868         { rts_atanl,      1, "atanl",        1, _C99 },
869         { rts_sinhl,      1, "sinhl",        1, _C99 },
870         { rts_coshl,      1, "coshl",        1, _C99 },
871         { rts_tanhl,      1, "tanhl",        1, _C99 },
872
873         { rts_strcmp,     1, "strcmp",       2, _C89 },
874         { rts_strncmp,    1, "strncmp",      3, _C89 },
875         { rts_strcpy,     1, "strcpy",       2, _C89 },
876         { rts_strlen,     1, "strlen",       1, _C89 },
877         { rts_memcpy,     1, "memcpy",       3, _C89 },
878         { rts_mempcpy,    1, "mempcpy",      3, _GNUC },
879         { rts_memmove,    1, "memmove",      3, _C89 },
880         { rts_memset,     1, "memset",       3, _C89 },
881         { rts_memcmp,     1, "memcmp",       3, _C89 },
882 };
883
884 static ident *rts_idents[lengthof(rts_data)];
885
886 static create_ld_ident_func create_ld_ident = create_name_linux_elf;
887
888 void set_create_ld_ident(ident *(*func)(entity_t*))
889 {
890         create_ld_ident = func;
891 }
892
893 /**
894  * Handle GNU attributes for entities
895  *
896  * @param ent   the entity
897  * @param decl  the routine declaration
898  */
899 static void handle_decl_modifiers(ir_entity *irentity, entity_t *entity)
900 {
901         assert(is_declaration(entity));
902         decl_modifiers_t modifiers = entity->declaration.modifiers;
903
904         if (is_method_entity(irentity)) {
905                 if (modifiers & DM_PURE) {
906                         set_entity_additional_properties(irentity, mtp_property_pure);
907                 }
908                 if (modifiers & DM_CONST) {
909                         add_entity_additional_properties(irentity, mtp_property_const);
910                 }
911         }
912         if (modifiers & DM_USED) {
913                 add_entity_linkage(irentity, IR_LINKAGE_HIDDEN_USER);
914         }
915         if (modifiers & DM_WEAK) {
916                 add_entity_linkage(irentity, IR_LINKAGE_WEAK);
917         }
918 }
919
920 static bool is_main(entity_t *entity)
921 {
922         static symbol_t *sym_main = NULL;
923         if (sym_main == NULL) {
924                 sym_main = symbol_table_insert("main");
925         }
926
927         if (entity->base.symbol != sym_main)
928                 return false;
929         /* must be in outermost scope */
930         if (entity->base.parent_scope != &current_translation_unit->scope)
931                 return false;
932
933         return true;
934 }
935
936 /**
937  * Creates an entity representing a function.
938  *
939  * @param entity       the function declaration/definition
940  * @param owner_type   the owner type of this function, NULL
941  *                     for global functions
942  */
943 static ir_entity *get_function_entity(entity_t *entity, ir_type *owner_type)
944 {
945         assert(entity->kind == ENTITY_FUNCTION);
946         if (entity->function.irentity != NULL)
947                 return entity->function.irentity;
948
949         switch (entity->function.btk) {
950         case BUILTIN_NONE:
951         case BUILTIN_LIBC:
952         case BUILTIN_LIBC_CHECK:
953                 break;
954         default:
955                 return NULL;
956         }
957
958         if (is_main(entity)) {
959                 /* force main to C linkage */
960                 type_t *type = entity->declaration.type;
961                 assert(is_type_function(type));
962                 if (type->function.linkage != LINKAGE_C) {
963                         type_t *new_type           = duplicate_type(type);
964                         new_type->function.linkage = LINKAGE_C;
965                         type                       = identify_new_type(new_type);
966                         entity->declaration.type   = type;
967                 }
968         }
969
970         symbol_t *symbol = entity->base.symbol;
971         ident    *id     = new_id_from_str(symbol->string);
972
973         /* already an entity defined? */
974         ir_entity *irentity = entitymap_get(&entitymap, symbol);
975         bool const has_body = entity->function.statement != NULL;
976         if (irentity != NULL) {
977                 if (get_entity_visibility(irentity) == ir_visibility_external
978                                 && has_body) {
979                         set_entity_visibility(irentity, ir_visibility_default);
980                 }
981                 goto entity_created;
982         }
983
984         ir_type *ir_type_method;
985         if (entity->function.need_closure)
986                 ir_type_method = create_method_type(&entity->declaration.type->function, true);
987         else
988                 ir_type_method = get_ir_type(entity->declaration.type);
989
990         bool nested_function = false;
991         if (owner_type == NULL)
992                 owner_type = get_glob_type();
993         else
994                 nested_function = true;
995
996         dbg_info *const dbgi = get_dbg_info(&entity->base.source_position);
997         irentity = new_d_entity(owner_type, id, ir_type_method, dbgi);
998
999         ident *ld_id;
1000         if (nested_function)
1001                 ld_id = id_unique("inner.%u");
1002         else
1003                 ld_id = create_ld_ident(entity);
1004         set_entity_ld_ident(irentity, ld_id);
1005
1006         handle_decl_modifiers(irentity, entity);
1007
1008         if (! nested_function) {
1009                 /* static inline             => local
1010                  * extern inline             => local
1011                  * inline without definition => local
1012                  * inline with definition    => external_visible */
1013                 storage_class_tag_t const storage_class
1014                         = (storage_class_tag_t) entity->declaration.storage_class;
1015                 bool                const is_inline     = entity->function.is_inline;
1016
1017                 if (is_inline && storage_class == STORAGE_CLASS_NONE && has_body) {
1018                     set_entity_visibility(irentity, ir_visibility_default);
1019                 } else if (storage_class == STORAGE_CLASS_STATIC ||
1020                            (is_inline && has_body)) {
1021                     set_entity_visibility(irentity, ir_visibility_local);
1022                 } else if (has_body) {
1023                     set_entity_visibility(irentity, ir_visibility_default);
1024                 } else {
1025                     set_entity_visibility(irentity, ir_visibility_external);
1026                 }
1027         } else {
1028                 /* nested functions are always local */
1029                 set_entity_visibility(irentity, ir_visibility_local);
1030         }
1031
1032         /* We should check for file scope here, but as long as we compile C only
1033            this is not needed. */
1034         if (!freestanding && !has_body) {
1035                 /* check for a known runtime function */
1036                 for (size_t i = 0; i < lengthof(rts_data); ++i) {
1037                         if (id != rts_idents[i])
1038                                 continue;
1039
1040                         function_type_t *function_type
1041                                 = &entity->declaration.type->function;
1042                         /* rts_entities code can't handle a "wrong" number of parameters */
1043                         if (function_type->unspecified_parameters)
1044                                 continue;
1045
1046                         /* check number of parameters */
1047                         int n_params = count_parameters(function_type);
1048                         if (n_params != rts_data[i].n_params)
1049                                 continue;
1050
1051                         type_t *return_type = skip_typeref(function_type->return_type);
1052                         int     n_res       = return_type != type_void ? 1 : 0;
1053                         if (n_res != rts_data[i].n_res)
1054                                 continue;
1055
1056                         /* ignore those rts functions not necessary needed for current mode */
1057                         if ((c_mode & rts_data[i].flags) == 0)
1058                                 continue;
1059                         assert(rts_entities[rts_data[i].id] == NULL);
1060                         rts_entities[rts_data[i].id] = irentity;
1061                 }
1062         }
1063
1064         entitymap_insert(&entitymap, symbol, irentity);
1065
1066 entity_created:
1067         entity->declaration.kind  = DECLARATION_KIND_FUNCTION;
1068         entity->function.irentity = irentity;
1069
1070         return irentity;
1071 }
1072
1073 /**
1074  * Creates a SymConst for a given entity.
1075  *
1076  * @param dbgi    debug info
1077  * @param entity  the entity
1078  */
1079 static ir_node *create_symconst(dbg_info *dbgi, ir_entity *entity)
1080 {
1081         assert(entity != NULL);
1082         union symconst_symbol sym;
1083         sym.entity_p = entity;
1084         return new_d_SymConst(dbgi, mode_P, sym, symconst_addr_ent);
1085 }
1086
1087 static ir_node *create_conv(dbg_info *dbgi, ir_node *value, ir_mode *dest_mode)
1088 {
1089         ir_mode *value_mode = get_irn_mode(value);
1090
1091         if (value_mode == dest_mode)
1092                 return value;
1093
1094         if (dest_mode == mode_b) {
1095                 ir_node *zero = new_Const(get_mode_null(value_mode));
1096                 ir_node *cmp  = new_d_Cmp(dbgi, value, zero, ir_relation_less_greater);
1097                 return cmp;
1098         }
1099
1100         return new_d_Conv(dbgi, value, dest_mode);
1101 }
1102
1103 static ir_node *create_Const_from_bool(ir_mode *const mode, bool const v)
1104 {
1105         return new_Const((v ? get_mode_one : get_mode_null)(mode));
1106 }
1107
1108 /**
1109  * Creates a SymConst node representing a wide string literal.
1110  *
1111  * @param literal   the wide string literal
1112  */
1113 static ir_node *wide_string_literal_to_firm(
1114                 const string_literal_expression_t *literal)
1115 {
1116         ir_type  *const global_type = get_glob_type();
1117         ir_type  *const elem_type   = ir_type_wchar_t;
1118         dbg_info *const dbgi        = get_dbg_info(&literal->base.source_position);
1119         ir_type  *const type        = new_type_array(1, elem_type);
1120
1121         ident     *const id     = id_unique("str.%u");
1122         ir_entity *const entity = new_d_entity(global_type, id, type, dbgi);
1123         set_entity_ld_ident(entity, id);
1124         set_entity_visibility(entity, ir_visibility_private);
1125         add_entity_linkage(entity, IR_LINKAGE_CONSTANT);
1126
1127         ir_mode      *const mode = get_type_mode(elem_type);
1128         const size_t        slen = wstrlen(&literal->value);
1129
1130         set_array_lower_bound_int(type, 0, 0);
1131         set_array_upper_bound_int(type, 0, slen);
1132         set_type_size_bytes(type, slen * get_mode_size_bytes(mode));
1133         set_type_state(type, layout_fixed);
1134
1135         ir_initializer_t *initializer = create_initializer_compound(slen);
1136         const char              *p    = literal->value.begin;
1137         for (size_t i = 0; i < slen; ++i) {
1138                 assert(p < literal->value.begin + literal->value.size);
1139                 utf32             v   = read_utf8_char(&p);
1140                 ir_tarval        *tv  = new_tarval_from_long(v, mode);
1141                 ir_initializer_t *val = create_initializer_tarval(tv);
1142                 set_initializer_compound_value(initializer, i, val);
1143         }
1144         set_entity_initializer(entity, initializer);
1145
1146         return create_symconst(dbgi, entity);
1147 }
1148
1149 /**
1150  * Creates a SymConst node representing a string constant.
1151  *
1152  * @param src_pos    the source position of the string constant
1153  * @param id_prefix  a prefix for the name of the generated string constant
1154  * @param value      the value of the string constant
1155  */
1156 static ir_node *string_to_firm(const source_position_t *const src_pos,
1157                                const char *const id_prefix,
1158                                const string_t *const value)
1159 {
1160         ir_type  *const global_type = get_glob_type();
1161         dbg_info *const dbgi        = get_dbg_info(src_pos);
1162         ir_type  *const type        = new_type_array(1, ir_type_const_char);
1163
1164         ident     *const id     = id_unique(id_prefix);
1165         ir_entity *const entity = new_d_entity(global_type, id, type, dbgi);
1166         set_entity_ld_ident(entity, id);
1167         set_entity_visibility(entity, ir_visibility_private);
1168         add_entity_linkage(entity, IR_LINKAGE_CONSTANT);
1169
1170         ir_type *const elem_type = ir_type_const_char;
1171         ir_mode *const mode      = get_type_mode(elem_type);
1172
1173         const char* const string = value->begin;
1174         const size_t      slen   = value->size;
1175
1176         set_array_lower_bound_int(type, 0, 0);
1177         set_array_upper_bound_int(type, 0, slen);
1178         set_type_size_bytes(type, slen);
1179         set_type_state(type, layout_fixed);
1180
1181         ir_initializer_t *initializer = create_initializer_compound(slen);
1182         for (size_t i = 0; i < slen; ++i) {
1183                 ir_tarval        *tv  = new_tarval_from_long(string[i], mode);
1184                 ir_initializer_t *val = create_initializer_tarval(tv);
1185                 set_initializer_compound_value(initializer, i, val);
1186         }
1187         set_entity_initializer(entity, initializer);
1188
1189         return create_symconst(dbgi, entity);
1190 }
1191
1192 static bool try_create_integer(literal_expression_t *literal,
1193                                type_t *type, unsigned char base)
1194 {
1195         const char *string = literal->value.begin;
1196         size_t      size   = literal->value.size;
1197
1198         assert(type->kind == TYPE_ATOMIC);
1199         atomic_type_kind_t akind = type->atomic.akind;
1200
1201         ir_mode   *mode = atomic_modes[akind];
1202         ir_tarval *tv   = new_integer_tarval_from_str(string, size, 1, base, mode);
1203         if (tv == tarval_bad)
1204                 return false;
1205
1206         literal->base.type    = type;
1207         literal->target_value = tv;
1208         return true;
1209 }
1210
1211 static void create_integer_tarval(literal_expression_t *literal)
1212 {
1213         unsigned        us     = 0;
1214         unsigned        ls     = 0;
1215         const string_t *suffix = &literal->suffix;
1216         /* parse suffix */
1217         if (suffix->size > 0) {
1218                 for (const char *c = suffix->begin; *c != '\0'; ++c) {
1219                         if (*c == 'u' || *c == 'U') { ++us; }
1220                         if (*c == 'l' || *c == 'L') { ++ls; }
1221                 }
1222         }
1223
1224         unsigned base;
1225         switch (literal->base.kind) {
1226                 case EXPR_LITERAL_INTEGER_OCTAL:       base =  8; break;
1227                 case EXPR_LITERAL_INTEGER:             base = 10; break;
1228                 case EXPR_LITERAL_INTEGER_HEXADECIMAL: base = 16; break;
1229                 default: panic("invalid literal kind");
1230         }
1231
1232         tarval_int_overflow_mode_t old_mode = tarval_get_integer_overflow_mode();
1233
1234         /* now try if the constant is small enough for some types */
1235         tarval_set_integer_overflow_mode(TV_OVERFLOW_BAD);
1236         if (ls < 1) {
1237                 if (us == 0 && try_create_integer(literal, type_int, base))
1238                         goto finished;
1239                 if ((us == 1 || base != 10)
1240                                 && try_create_integer(literal, type_unsigned_int, base))
1241                         goto finished;
1242         }
1243         if (ls < 2) {
1244                 if (us == 0 && try_create_integer(literal, type_long, base))
1245                         goto finished;
1246                 if ((us == 1 || base != 10)
1247                                 && try_create_integer(literal, type_unsigned_long, base))
1248                         goto finished;
1249         }
1250         /* last try? then we should not report tarval_bad */
1251         if (us != 1 && base == 10)
1252                 tarval_set_integer_overflow_mode(TV_OVERFLOW_WRAP);
1253         if (us == 0 && try_create_integer(literal, type_long_long, base))
1254                 goto finished;
1255
1256         /* last try */
1257         assert(us == 1 || base != 10);
1258         tarval_set_integer_overflow_mode(TV_OVERFLOW_WRAP);
1259         bool res = try_create_integer(literal, type_unsigned_long_long, base);
1260         if (!res)
1261                 panic("internal error when parsing number literal");
1262
1263 finished:
1264         tarval_set_integer_overflow_mode(old_mode);
1265 }
1266
1267 void determine_literal_type(literal_expression_t *literal)
1268 {
1269         switch (literal->base.kind) {
1270         case EXPR_LITERAL_INTEGER:
1271         case EXPR_LITERAL_INTEGER_OCTAL:
1272         case EXPR_LITERAL_INTEGER_HEXADECIMAL:
1273                 create_integer_tarval(literal);
1274                 return;
1275         default:
1276                 break;
1277         }
1278 }
1279
1280 /**
1281  * Creates a Const node representing a constant.
1282  */
1283 static ir_node *literal_to_firm(const literal_expression_t *literal)
1284 {
1285         type_t     *type   = skip_typeref(literal->base.type);
1286         ir_mode    *mode   = get_ir_mode_storage(type);
1287         const char *string = literal->value.begin;
1288         size_t      size   = literal->value.size;
1289         ir_tarval  *tv;
1290
1291         switch (literal->base.kind) {
1292         case EXPR_LITERAL_WIDE_CHARACTER: {
1293                 utf32  v = read_utf8_char(&string);
1294                 char   buf[128];
1295                 size_t len = snprintf(buf, sizeof(buf), UTF32_PRINTF_FORMAT, v);
1296
1297                 tv = new_tarval_from_str(buf, len, mode);
1298                 goto make_const;
1299         }
1300         case EXPR_LITERAL_CHARACTER: {
1301                 long long int v;
1302                 bool char_is_signed
1303                         = get_atomic_type_flags(ATOMIC_TYPE_CHAR) & ATOMIC_TYPE_FLAG_SIGNED;
1304                 if (size == 1 && char_is_signed) {
1305                         v = (signed char)string[0];
1306                 } else {
1307                         v = 0;
1308                         for (size_t i = 0; i < size; ++i) {
1309                                 v = (v << 8) | ((unsigned char)string[i]);
1310                         }
1311                 }
1312                 char   buf[128];
1313                 size_t len = snprintf(buf, sizeof(buf), "%lld", v);
1314
1315                 tv = new_tarval_from_str(buf, len, mode);
1316                 goto make_const;
1317         }
1318         case EXPR_LITERAL_INTEGER:
1319         case EXPR_LITERAL_INTEGER_OCTAL:
1320         case EXPR_LITERAL_INTEGER_HEXADECIMAL:
1321                 assert(literal->target_value != NULL);
1322                 tv = literal->target_value;
1323                 goto make_const;
1324         case EXPR_LITERAL_FLOATINGPOINT:
1325                 tv = new_tarval_from_str(string, size, mode);
1326                 goto make_const;
1327         case EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL: {
1328                 char buffer[size + 2];
1329                 memcpy(buffer, "0x", 2);
1330                 memcpy(buffer+2, string, size);
1331                 tv = new_tarval_from_str(buffer, size+2, mode);
1332                 goto make_const;
1333         }
1334         case EXPR_LITERAL_BOOLEAN:
1335                 if (string[0] == 't') {
1336                         tv = get_mode_one(mode);
1337                 } else {
1338                         assert(string[0] == 'f');
1339                         tv = get_mode_null(mode);
1340                 }
1341                 goto make_const;
1342         case EXPR_LITERAL_MS_NOOP:
1343                 tv = get_mode_null(mode);
1344                 goto make_const;
1345         default:
1346                 break;
1347         }
1348         panic("Invalid literal kind found");
1349
1350 make_const: ;
1351         dbg_info *dbgi       = get_dbg_info(&literal->base.source_position);
1352         ir_node  *res        = new_d_Const(dbgi, tv);
1353         ir_mode  *mode_arith = get_ir_mode_arithmetic(type);
1354         return create_conv(dbgi, res, mode_arith);
1355 }
1356
1357 /*
1358  * Allocate an area of size bytes aligned at alignment
1359  * at a frame type.
1360  */
1361 static ir_entity *alloc_trampoline(ir_type *frame_type, int size, unsigned alignment)
1362 {
1363         static unsigned area_cnt = 0;
1364         char buf[32];
1365
1366         ir_type *tp = new_type_array(1, ir_type_char);
1367         set_array_bounds_int(tp, 0, 0, size);
1368         set_type_alignment_bytes(tp, alignment);
1369
1370         snprintf(buf, sizeof(buf), "trampolin%u", area_cnt++);
1371         ident *name = new_id_from_str(buf);
1372         ir_entity *area = new_entity(frame_type, name, tp);
1373
1374         /* mark this entity as compiler generated */
1375         set_entity_compiler_generated(area, 1);
1376         return area;
1377 }
1378
1379 /**
1380  * Return a node representing a trampoline region
1381  * for a given function entity.
1382  *
1383  * @param dbgi    debug info
1384  * @param entity  the function entity
1385  */
1386 static ir_node *get_trampoline_region(dbg_info *dbgi, ir_entity *entity)
1387 {
1388         ir_entity *region = NULL;
1389         int        i;
1390
1391         if (current_trampolines != NULL) {
1392                 for (i = ARR_LEN(current_trampolines) - 1; i >= 0; --i) {
1393                         if (current_trampolines[i].function == entity) {
1394                                 region = current_trampolines[i].region;
1395                                 break;
1396                         }
1397                 }
1398         } else {
1399                 current_trampolines = NEW_ARR_F(trampoline_region, 0);
1400         }
1401         ir_graph *irg = current_ir_graph;
1402         if (region == NULL) {
1403                 /* create a new region */
1404                 ir_type           *frame_tp = get_irg_frame_type(irg);
1405                 trampoline_region  reg;
1406                 reg.function = entity;
1407
1408                 reg.region   = alloc_trampoline(frame_tp,
1409                                                 be_params->trampoline_size,
1410                                                 be_params->trampoline_align);
1411                 ARR_APP1(trampoline_region, current_trampolines, reg);
1412                 region = reg.region;
1413         }
1414         return new_d_simpleSel(dbgi, get_irg_no_mem(irg), get_irg_frame(irg),
1415                                region);
1416 }
1417
1418 /**
1419  * Creates a trampoline for a function represented by an entity.
1420  *
1421  * @param dbgi    debug info
1422  * @param mode    the (reference) mode for the function address
1423  * @param entity  the function entity
1424  */
1425 static ir_node *create_trampoline(dbg_info *dbgi, ir_mode *mode,
1426                                   ir_entity *entity)
1427 {
1428         assert(entity != NULL);
1429         ir_node *in[3];
1430         in[0] = get_trampoline_region(dbgi, entity);
1431         in[1] = create_symconst(dbgi, entity);
1432         in[2] = get_irg_frame(current_ir_graph);
1433
1434         ir_node *irn = new_d_Builtin(dbgi, get_store(), 3, in, ir_bk_inner_trampoline, get_unknown_type());
1435         set_store(new_Proj(irn, mode_M, pn_Builtin_M));
1436         return new_Proj(irn, mode, pn_Builtin_1_result);
1437 }
1438
1439 /**
1440  * Dereference an address.
1441  *
1442  * @param dbgi  debug info
1443  * @param type  the type of the dereferenced result (the points_to type)
1444  * @param addr  the address to dereference
1445  */
1446 static ir_node *deref_address(dbg_info *const dbgi, type_t *const type,
1447                                       ir_node *const addr)
1448 {
1449         ir_type *irtype = get_ir_type(type);
1450         if (is_compound_type(irtype)
1451                         || is_Method_type(irtype)
1452                         || is_Array_type(irtype)) {
1453                 return addr;
1454         }
1455
1456         ir_cons_flags  flags    = type->base.qualifiers & TYPE_QUALIFIER_VOLATILE
1457                                   ? cons_volatile : cons_none;
1458         ir_mode *const mode     = get_type_mode(irtype);
1459         ir_node *const memory   = get_store();
1460         ir_node *const load     = new_d_Load(dbgi, memory, addr, mode, flags);
1461         ir_node *const load_mem = new_d_Proj(dbgi, load, mode_M, pn_Load_M);
1462         ir_node *const load_res = new_d_Proj(dbgi, load, mode,   pn_Load_res);
1463
1464         set_store(load_mem);
1465
1466         ir_mode *const mode_arithmetic = get_ir_mode_arithmetic(type);
1467         return create_conv(dbgi, load_res, mode_arithmetic);
1468 }
1469
1470 /**
1471  * Creates a strict Conv (to the node's mode) if necessary.
1472  *
1473  * @param dbgi  debug info
1474  * @param node  the node to strict conv
1475  */
1476 static ir_node *do_strict_conv(dbg_info *dbgi, ir_node *node)
1477 {
1478         ir_mode *mode = get_irn_mode(node);
1479
1480         if (!(get_irg_fp_model(current_ir_graph) & fp_explicit_rounding))
1481                 return node;
1482         if (!mode_is_float(mode))
1483                 return node;
1484
1485         /* check if there is already a Conv */
1486         if (is_Conv(node)) {
1487                 /* convert it into a strict Conv */
1488                 set_Conv_strict(node, 1);
1489                 return node;
1490         }
1491
1492         /* otherwise create a new one */
1493         return new_d_strictConv(dbgi, node, mode);
1494 }
1495
1496 /**
1497  * Returns the correct base address depending on whether it is a parameter or a
1498  * normal local variable.
1499  */
1500 static ir_node *get_local_frame(ir_entity *const ent)
1501 {
1502         ir_graph      *const irg   = current_ir_graph;
1503         const ir_type *const owner = get_entity_owner(ent);
1504         if (owner == current_outer_frame) {
1505                 assert(current_static_link != NULL);
1506                 return current_static_link;
1507         } else {
1508                 return get_irg_frame(irg);
1509         }
1510 }
1511
1512 /**
1513  * Keep all memory edges of the given block.
1514  */
1515 static void keep_all_memory(ir_node *block)
1516 {
1517         ir_node *old = get_cur_block();
1518
1519         set_cur_block(block);
1520         keep_alive(get_store());
1521         /* TODO: keep all memory edges from restricted pointers */
1522         set_cur_block(old);
1523 }
1524
1525 static ir_node *reference_expression_enum_value_to_firm(
1526                 const reference_expression_t *ref)
1527 {
1528         entity_t *entity = ref->entity;
1529         type_t   *type   = skip_typeref(entity->enum_value.enum_type);
1530         /* make sure the type is constructed */
1531         (void) get_ir_type(type);
1532
1533         return new_Const(entity->enum_value.tv);
1534 }
1535
1536 static ir_node *reference_expression_to_firm(const reference_expression_t *ref)
1537 {
1538         dbg_info *dbgi   = get_dbg_info(&ref->base.source_position);
1539         entity_t *entity = ref->entity;
1540         assert(is_declaration(entity));
1541         type_t   *type   = skip_typeref(entity->declaration.type);
1542
1543         /* make sure the type is constructed */
1544         (void) get_ir_type(type);
1545
1546         if (entity->kind == ENTITY_FUNCTION
1547             && entity->function.btk != BUILTIN_NONE) {
1548                 ir_entity *irentity = get_function_entity(entity, NULL);
1549                 /* for gcc compatibility we have to produce (dummy) addresses for some
1550                  * builtins which don't have entities */
1551                 if (irentity == NULL) {
1552                         source_position_t const *const pos = &ref->base.source_position;
1553                         symbol_t          const *const sym = ref->entity->base.symbol;
1554                         warningf(WARN_OTHER, pos, "taking address of builtin '%Y'", sym);
1555
1556                         /* simply create a NULL pointer */
1557                         ir_mode  *mode = get_ir_mode_arithmetic(type_void_ptr);
1558                         ir_node  *res  = new_Const(get_mode_null(mode));
1559
1560                         return res;
1561                 }
1562         }
1563
1564         switch ((declaration_kind_t) entity->declaration.kind) {
1565         case DECLARATION_KIND_UNKNOWN:
1566                 break;
1567
1568         case DECLARATION_KIND_LOCAL_VARIABLE: {
1569                 ir_mode *const mode  = get_ir_mode_storage(type);
1570                 ir_node *const value = get_value(entity->variable.v.value_number, mode);
1571                 return create_conv(NULL, value, get_ir_mode_arithmetic(type));
1572         }
1573         case DECLARATION_KIND_PARAMETER: {
1574                 ir_mode *const mode  = get_ir_mode_storage(type);
1575                 ir_node *const value = get_value(entity->parameter.v.value_number,mode);
1576                 return create_conv(NULL, value, get_ir_mode_arithmetic(type));
1577         }
1578         case DECLARATION_KIND_FUNCTION: {
1579                 return create_symconst(dbgi, entity->function.irentity);
1580         }
1581         case DECLARATION_KIND_INNER_FUNCTION: {
1582                 ir_mode *const mode = get_ir_mode_storage(type);
1583                 if (!entity->function.goto_to_outer && !entity->function.need_closure) {
1584                         /* inner function not using the closure */
1585                         return create_symconst(dbgi, entity->function.irentity);
1586                 } else {
1587                         /* need trampoline here */
1588                         return create_trampoline(dbgi, mode, entity->function.irentity);
1589                 }
1590         }
1591         case DECLARATION_KIND_GLOBAL_VARIABLE: {
1592                 const variable_t *variable = &entity->variable;
1593                 ir_node *const addr = create_symconst(dbgi, variable->v.entity);
1594                 return deref_address(dbgi, variable->base.type, addr);
1595         }
1596
1597         case DECLARATION_KIND_LOCAL_VARIABLE_ENTITY: {
1598                 ir_entity *irentity = entity->variable.v.entity;
1599                 ir_node   *frame    = get_local_frame(irentity);
1600                 ir_node   *sel = new_d_simpleSel(dbgi, new_NoMem(), frame, irentity);
1601                 return deref_address(dbgi, entity->declaration.type, sel);
1602         }
1603         case DECLARATION_KIND_PARAMETER_ENTITY: {
1604                 ir_entity *irentity = entity->parameter.v.entity;
1605                 ir_node   *frame    = get_local_frame(irentity);
1606                 ir_node   *sel = new_d_simpleSel(dbgi, new_NoMem(), frame, irentity);
1607                 return deref_address(dbgi, entity->declaration.type, sel);
1608         }
1609
1610         case DECLARATION_KIND_VARIABLE_LENGTH_ARRAY:
1611                 return entity->variable.v.vla_base;
1612
1613         case DECLARATION_KIND_COMPOUND_MEMBER:
1614                 panic("not implemented reference type");
1615         }
1616
1617         panic("reference to declaration with unknown type found");
1618 }
1619
1620 static ir_node *reference_addr(const reference_expression_t *ref)
1621 {
1622         dbg_info *dbgi   = get_dbg_info(&ref->base.source_position);
1623         entity_t *entity = ref->entity;
1624         assert(is_declaration(entity));
1625
1626         switch((declaration_kind_t) entity->declaration.kind) {
1627         case DECLARATION_KIND_UNKNOWN:
1628                 break;
1629         case DECLARATION_KIND_PARAMETER:
1630         case DECLARATION_KIND_LOCAL_VARIABLE:
1631                 /* you can store to a local variable (so we don't panic but return NULL
1632                  * as an indicator for no real address) */
1633                 return NULL;
1634         case DECLARATION_KIND_GLOBAL_VARIABLE: {
1635                 ir_node *const addr = create_symconst(dbgi, entity->variable.v.entity);
1636                 return addr;
1637         }
1638         case DECLARATION_KIND_LOCAL_VARIABLE_ENTITY: {
1639                 ir_entity *irentity = entity->variable.v.entity;
1640                 ir_node   *frame    = get_local_frame(irentity);
1641                 ir_node   *sel = new_d_simpleSel(dbgi, new_NoMem(), frame, irentity);
1642
1643                 return sel;
1644         }
1645         case DECLARATION_KIND_PARAMETER_ENTITY: {
1646                 ir_entity *irentity = entity->parameter.v.entity;
1647                 ir_node   *frame    = get_local_frame(irentity);
1648                 ir_node   *sel = new_d_simpleSel(dbgi, new_NoMem(), frame, irentity);
1649
1650                 return sel;
1651         }
1652
1653         case DECLARATION_KIND_VARIABLE_LENGTH_ARRAY:
1654                 return entity->variable.v.vla_base;
1655
1656         case DECLARATION_KIND_FUNCTION: {
1657                 return create_symconst(dbgi, entity->function.irentity);
1658         }
1659
1660         case DECLARATION_KIND_INNER_FUNCTION: {
1661                 type_t  *const type = skip_typeref(entity->declaration.type);
1662                 ir_mode *const mode = get_ir_mode_storage(type);
1663                 if (!entity->function.goto_to_outer && !entity->function.need_closure) {
1664                         /* inner function not using the closure */
1665                         return create_symconst(dbgi, entity->function.irentity);
1666                 } else {
1667                         /* need trampoline here */
1668                         return create_trampoline(dbgi, mode, entity->function.irentity);
1669                 }
1670         }
1671
1672         case DECLARATION_KIND_COMPOUND_MEMBER:
1673                 panic("not implemented reference type");
1674         }
1675
1676         panic("reference to declaration with unknown type found");
1677 }
1678
1679 /**
1680  * Transform calls to builtin functions.
1681  */
1682 static ir_node *process_builtin_call(const call_expression_t *call)
1683 {
1684         dbg_info *dbgi = get_dbg_info(&call->base.source_position);
1685
1686         assert(call->function->kind == EXPR_REFERENCE);
1687         reference_expression_t *builtin = &call->function->reference;
1688
1689         type_t *expr_type = skip_typeref(builtin->base.type);
1690         assert(is_type_pointer(expr_type));
1691
1692         type_t *function_type = skip_typeref(expr_type->pointer.points_to);
1693
1694         switch (builtin->entity->function.btk) {
1695         case BUILTIN_NONE:
1696                 break;
1697         case BUILTIN_ALLOCA: {
1698                 expression_t *argument = call->arguments->expression;
1699                 ir_node      *size     = expression_to_firm(argument);
1700
1701                 ir_node *store  = get_store();
1702                 ir_node *alloca = new_d_Alloc(dbgi, store, size, firm_unknown_type,
1703                                               stack_alloc);
1704                 ir_node *proj_m = new_Proj(alloca, mode_M, pn_Alloc_M);
1705                 set_store(proj_m);
1706                 ir_node *res    = new_Proj(alloca, mode_P_data, pn_Alloc_res);
1707
1708                 return res;
1709         }
1710         case BUILTIN_INF: {
1711                 type_t    *type = function_type->function.return_type;
1712                 ir_mode   *mode = get_ir_mode_arithmetic(type);
1713                 ir_tarval *tv   = get_mode_infinite(mode);
1714                 ir_node   *res  = new_d_Const(dbgi, tv);
1715                 return res;
1716         }
1717         case BUILTIN_NAN: {
1718                 /* Ignore string for now... */
1719                 assert(is_type_function(function_type));
1720                 type_t    *type = function_type->function.return_type;
1721                 ir_mode   *mode = get_ir_mode_arithmetic(type);
1722                 ir_tarval *tv   = get_mode_NAN(mode);
1723                 ir_node   *res  = new_d_Const(dbgi, tv);
1724                 return res;
1725         }
1726         case BUILTIN_EXPECT: {
1727                 expression_t *argument = call->arguments->expression;
1728                 return _expression_to_firm(argument);
1729         }
1730         case BUILTIN_VA_END:
1731                 /* evaluate the argument of va_end for its side effects */
1732                 _expression_to_firm(call->arguments->expression);
1733                 return NULL;
1734         case BUILTIN_OBJECT_SIZE: {
1735                 /* determine value of "type" */
1736                 expression_t *type_expression = call->arguments->next->expression;
1737                 long          type_val        = fold_constant_to_int(type_expression);
1738                 type_t       *type            = function_type->function.return_type;
1739                 ir_mode      *mode            = get_ir_mode_arithmetic(type);
1740                 /* just produce a "I don't know" result */
1741                 ir_tarval    *result          = type_val & 2 ? get_mode_null(mode) :
1742                                                 get_mode_minus_one(mode);
1743
1744                 return new_d_Const(dbgi, result);
1745         }
1746         case BUILTIN_ROTL: {
1747                 ir_node *val  = expression_to_firm(call->arguments->expression);
1748                 ir_node *shf  = expression_to_firm(call->arguments->next->expression);
1749                 ir_mode *mode = get_irn_mode(val);
1750                 return new_d_Rotl(dbgi, val, create_conv(dbgi, shf, mode_uint), mode);
1751         }
1752         case BUILTIN_ROTR: {
1753                 ir_node *val  = expression_to_firm(call->arguments->expression);
1754                 ir_node *shf  = expression_to_firm(call->arguments->next->expression);
1755                 ir_mode *mode = get_irn_mode(val);
1756                 ir_node *c    = new_Const_long(mode_uint, get_mode_size_bits(mode));
1757                 ir_node *sub  = new_d_Sub(dbgi, c, create_conv(dbgi, shf, mode_uint), mode_uint);
1758                 return new_d_Rotl(dbgi, val, sub, mode);
1759         }
1760         case BUILTIN_FIRM:
1761                 break;
1762         case BUILTIN_LIBC:
1763         case BUILTIN_LIBC_CHECK:
1764                 panic("builtin did not produce an entity");
1765         }
1766         panic("invalid builtin found");
1767 }
1768
1769 /**
1770  * Transform a call expression.
1771  * Handles some special cases, like alloca() calls, which must be resolved
1772  * BEFORE the inlines runs. Inlining routines calling alloca() is dangerous,
1773  * 176.gcc for instance might allocate 2GB instead of 256 MB if alloca is not
1774  * handled right...
1775  */
1776 static ir_node *call_expression_to_firm(const call_expression_t *const call)
1777 {
1778         dbg_info *const dbgi = get_dbg_info(&call->base.source_position);
1779         assert(currently_reachable());
1780
1781         expression_t   *function = call->function;
1782         ir_node        *callee   = NULL;
1783         bool            firm_builtin = false;
1784         ir_builtin_kind firm_builtin_kind = ir_bk_trap;
1785         if (function->kind == EXPR_REFERENCE) {
1786                 const reference_expression_t *ref    = &function->reference;
1787                 entity_t                     *entity = ref->entity;
1788
1789                 if (entity->kind == ENTITY_FUNCTION) {
1790                         builtin_kind_t builtin = entity->function.btk;
1791                         if (builtin == BUILTIN_FIRM) {
1792                                 firm_builtin = true;
1793                                 firm_builtin_kind = entity->function.b.firm_builtin_kind;
1794                         } else if (builtin != BUILTIN_NONE && builtin != BUILTIN_LIBC
1795                                    && builtin != BUILTIN_LIBC_CHECK) {
1796                                 return process_builtin_call(call);
1797                         }
1798                 }
1799         }
1800         if (!firm_builtin)
1801                 callee = expression_to_firm(function);
1802
1803         type_t *type = skip_typeref(function->base.type);
1804         assert(is_type_pointer(type));
1805         pointer_type_t *pointer_type = &type->pointer;
1806         type_t         *points_to    = skip_typeref(pointer_type->points_to);
1807         assert(is_type_function(points_to));
1808         function_type_t *function_type = &points_to->function;
1809
1810         int      n_parameters    = 0;
1811         ir_type *ir_method_type  = get_ir_type((type_t*) function_type);
1812         ir_type *new_method_type = NULL;
1813         if (function_type->variadic || function_type->unspecified_parameters) {
1814                 const call_argument_t *argument = call->arguments;
1815                 for ( ; argument != NULL; argument = argument->next) {
1816                         ++n_parameters;
1817                 }
1818
1819                 /* we need to construct a new method type matching the call
1820                  * arguments... */
1821                 type_dbg_info *tdbgi = get_type_dbg_info_((const type_t*) function_type);
1822                 int n_res       = get_method_n_ress(ir_method_type);
1823                 new_method_type = new_d_type_method(n_parameters, n_res, tdbgi);
1824                 set_method_calling_convention(new_method_type,
1825                                get_method_calling_convention(ir_method_type));
1826                 set_method_additional_properties(new_method_type,
1827                                get_method_additional_properties(ir_method_type));
1828                 set_method_variadicity(new_method_type,
1829                                        get_method_variadicity(ir_method_type));
1830
1831                 for (int i = 0; i < n_res; ++i) {
1832                         set_method_res_type(new_method_type, i,
1833                                             get_method_res_type(ir_method_type, i));
1834                 }
1835                 argument = call->arguments;
1836                 for (int i = 0; i < n_parameters; ++i, argument = argument->next) {
1837                         expression_t *expression = argument->expression;
1838                         ir_type      *irtype     = get_ir_type(expression->base.type);
1839                         set_method_param_type(new_method_type, i, irtype);
1840                 }
1841                 ir_method_type = new_method_type;
1842         } else {
1843                 n_parameters = get_method_n_params(ir_method_type);
1844         }
1845
1846         ir_node *in[n_parameters];
1847
1848         const call_argument_t *argument = call->arguments;
1849         for (int n = 0; n < n_parameters; ++n) {
1850                 expression_t *expression = argument->expression;
1851                 ir_node      *arg_node   = expression_to_firm(expression);
1852
1853                 type_t *arg_type = skip_typeref(expression->base.type);
1854                 if (!is_type_compound(arg_type)) {
1855                         ir_mode *mode = get_ir_mode_storage(expression->base.type);
1856                         arg_node      = create_conv(dbgi, arg_node, mode);
1857                         arg_node      = do_strict_conv(dbgi, arg_node);
1858                 }
1859
1860                 in[n] = arg_node;
1861
1862                 argument = argument->next;
1863         }
1864
1865         ir_node *store;
1866         if (function_type->modifiers & DM_CONST) {
1867                 store = get_irg_no_mem(current_ir_graph);
1868         } else {
1869                 store = get_store();
1870         }
1871
1872         ir_node *node;
1873         type_t  *return_type = skip_typeref(function_type->return_type);
1874         ir_node *result      = NULL;
1875         if (firm_builtin) {
1876                 node = new_d_Builtin(dbgi, store, n_parameters, in, firm_builtin_kind,
1877                                      ir_method_type);
1878                 if (! (function_type->modifiers & DM_CONST)) {
1879                         ir_node *mem = new_Proj(node, mode_M, pn_Builtin_M);
1880                         set_store(mem);
1881                 }
1882
1883                 if (!is_type_atomic(return_type, ATOMIC_TYPE_VOID)) {
1884                         assert(is_type_scalar(return_type));
1885                         ir_mode *mode = get_ir_mode_storage(return_type);
1886                         result = new_Proj(node, mode, pn_Builtin_1_result);
1887                         ir_mode *mode_arith = get_ir_mode_arithmetic(return_type);
1888                         result              = create_conv(NULL, result, mode_arith);
1889                 }
1890         } else {
1891                 node = new_d_Call(dbgi, store, callee, n_parameters, in, ir_method_type);
1892                 if (! (function_type->modifiers & DM_CONST)) {
1893                         ir_node *mem = new_Proj(node, mode_M, pn_Call_M);
1894                         set_store(mem);
1895                 }
1896
1897                 if (!is_type_atomic(return_type, ATOMIC_TYPE_VOID)) {
1898                         ir_node *resproj = new_Proj(node, mode_T, pn_Call_T_result);
1899
1900                         if (is_type_scalar(return_type)) {
1901                                 ir_mode *mode       = get_ir_mode_storage(return_type);
1902                                 result              = new_Proj(resproj, mode, 0);
1903                                 ir_mode *mode_arith = get_ir_mode_arithmetic(return_type);
1904                                 result              = create_conv(NULL, result, mode_arith);
1905                         } else {
1906                                 ir_mode *mode = mode_P_data;
1907                                 result        = new_Proj(resproj, mode, 0);
1908                         }
1909                 }
1910         }
1911
1912         if (function_type->modifiers & DM_NORETURN) {
1913                 /* A dead end:  Keep the Call and the Block.  Also place all further
1914                  * nodes into a new and unreachable block. */
1915                 keep_alive(node);
1916                 keep_alive(get_cur_block());
1917                 ir_node *block = new_Block(0, NULL);
1918                 set_cur_block(block);
1919         }
1920
1921         return result;
1922 }
1923
1924 static void statement_to_firm(statement_t *statement);
1925 static ir_node *compound_statement_to_firm(compound_statement_t *compound);
1926
1927 static ir_node *expression_to_addr(const expression_t *expression);
1928 static ir_node *create_condition_evaluation(const expression_t *expression,
1929                                             ir_node *true_block,
1930                                             ir_node *false_block);
1931
1932 static void assign_value(dbg_info *dbgi, ir_node *addr, type_t *type,
1933                          ir_node *value)
1934 {
1935         if (!is_type_compound(type)) {
1936                 ir_mode *mode = get_ir_mode_storage(type);
1937                 value         = create_conv(dbgi, value, mode);
1938                 value         = do_strict_conv(dbgi, value);
1939         }
1940
1941         ir_node *memory = get_store();
1942
1943         if (is_type_scalar(type)) {
1944                 ir_cons_flags flags = type->base.qualifiers & TYPE_QUALIFIER_VOLATILE
1945                                       ? cons_volatile : cons_none;
1946                 ir_node  *store     = new_d_Store(dbgi, memory, addr, value, flags);
1947                 ir_node  *store_mem = new_d_Proj(dbgi, store, mode_M, pn_Store_M);
1948                 set_store(store_mem);
1949         } else {
1950                 ir_type *irtype    = get_ir_type(type);
1951                 ir_node *copyb     = new_d_CopyB(dbgi, memory, addr, value, irtype);
1952                 ir_node *copyb_mem = new_Proj(copyb, mode_M, pn_CopyB_M);
1953                 set_store(copyb_mem);
1954         }
1955 }
1956
1957 static ir_tarval *create_bitfield_mask(ir_mode *mode, int offset, int size)
1958 {
1959         ir_tarval *all_one   = get_mode_all_one(mode);
1960         int        mode_size = get_mode_size_bits(mode);
1961
1962         assert(offset >= 0);
1963         assert(size   >= 0);
1964         assert(offset + size <= mode_size);
1965         if (size == mode_size) {
1966                 return all_one;
1967         }
1968
1969         long       shiftr    = get_mode_size_bits(mode) - size;
1970         long       shiftl    = offset;
1971         ir_tarval *tv_shiftr = new_tarval_from_long(shiftr, mode_uint);
1972         ir_tarval *tv_shiftl = new_tarval_from_long(shiftl, mode_uint);
1973         ir_tarval *mask0     = tarval_shr(all_one, tv_shiftr);
1974         ir_tarval *mask1     = tarval_shl(mask0, tv_shiftl);
1975
1976         return mask1;
1977 }
1978
1979 static ir_node *bitfield_store_to_firm(dbg_info *dbgi,
1980                 ir_entity *entity, ir_node *addr, ir_node *value, bool set_volatile)
1981 {
1982         ir_type *entity_type = get_entity_type(entity);
1983         ir_type *base_type   = get_primitive_base_type(entity_type);
1984         assert(base_type != NULL);
1985         ir_mode *mode        = get_type_mode(base_type);
1986
1987         value = create_conv(dbgi, value, mode);
1988
1989         /* kill upper bits of value and shift to right position */
1990         int        bitoffset       = get_entity_offset_bits_remainder(entity);
1991         int        bitsize         = get_mode_size_bits(get_type_mode(entity_type));
1992         ir_tarval *mask            = create_bitfield_mask(mode, 0, bitsize);
1993         ir_node   *mask_node       = new_d_Const(dbgi, mask);
1994         ir_node   *value_masked    = new_d_And(dbgi, value, mask_node, mode);
1995         ir_tarval *shiftl          = new_tarval_from_long(bitoffset, mode_uint);
1996         ir_node   *shiftcount      = new_d_Const(dbgi, shiftl);
1997         ir_node   *value_maskshift = new_d_Shl(dbgi, value_masked, shiftcount, mode);
1998
1999         /* load current value */
2000         ir_node   *mem             = get_store();
2001         ir_node   *load            = new_d_Load(dbgi, mem, addr, mode,
2002                                           set_volatile ? cons_volatile : cons_none);
2003         ir_node   *load_mem        = new_d_Proj(dbgi, load, mode_M, pn_Load_M);
2004         ir_node   *load_res        = new_d_Proj(dbgi, load, mode, pn_Load_res);
2005         ir_tarval *shift_mask      = create_bitfield_mask(mode, bitoffset, bitsize);
2006         ir_tarval *inv_mask        = tarval_not(shift_mask);
2007         ir_node   *inv_mask_node   = new_d_Const(dbgi, inv_mask);
2008         ir_node   *load_res_masked = new_d_And(dbgi, load_res, inv_mask_node, mode);
2009
2010         /* construct new value and store */
2011         ir_node *new_val   = new_d_Or(dbgi, load_res_masked, value_maskshift, mode);
2012         ir_node *store     = new_d_Store(dbgi, load_mem, addr, new_val,
2013                                          set_volatile ? cons_volatile : cons_none);
2014         ir_node *store_mem = new_d_Proj(dbgi, store, mode_M, pn_Store_M);
2015         set_store(store_mem);
2016
2017         return value_masked;
2018 }
2019
2020 static ir_node *bitfield_extract_to_firm(const select_expression_t *expression,
2021                                          ir_node *addr)
2022 {
2023         dbg_info *dbgi      = get_dbg_info(&expression->base.source_position);
2024         entity_t *entity    = expression->compound_entry;
2025         type_t   *base_type = entity->declaration.type;
2026         ir_mode  *mode      = get_ir_mode_storage(base_type);
2027         ir_node  *mem       = get_store();
2028         ir_node  *load      = new_d_Load(dbgi, mem, addr, mode, cons_none);
2029         ir_node  *load_mem  = new_d_Proj(dbgi, load, mode_M, pn_Load_M);
2030         ir_node  *load_res  = new_d_Proj(dbgi, load, mode, pn_Load_res);
2031
2032         ir_mode  *amode     = mode;
2033         /* optimisation, since shifting in modes < machine_size is usually
2034          * less efficient */
2035         if (get_mode_size_bits(amode) < get_mode_size_bits(mode_uint)) {
2036                 amode = mode_uint;
2037         }
2038         unsigned amode_size = get_mode_size_bits(amode);
2039         load_res = create_conv(dbgi, load_res, amode);
2040
2041         set_store(load_mem);
2042
2043         /* kill upper bits */
2044         assert(expression->compound_entry->kind == ENTITY_COMPOUND_MEMBER);
2045         int        bitoffset   = entity->compound_member.bit_offset;
2046         int        bitsize     = entity->compound_member.bit_size;
2047         unsigned   shift_bitsl = amode_size - bitoffset - bitsize;
2048         ir_tarval *tvl         = new_tarval_from_long((long)shift_bitsl, mode_uint);
2049         ir_node   *countl      = new_d_Const(dbgi, tvl);
2050         ir_node   *shiftl      = new_d_Shl(dbgi, load_res, countl, amode);
2051
2052         unsigned   shift_bitsr = bitoffset + shift_bitsl;
2053         assert(shift_bitsr <= amode_size);
2054         ir_tarval *tvr         = new_tarval_from_long((long)shift_bitsr, mode_uint);
2055         ir_node   *countr      = new_d_Const(dbgi, tvr);
2056         ir_node   *shiftr;
2057         if (mode_is_signed(mode)) {
2058                 shiftr = new_d_Shrs(dbgi, shiftl, countr, amode);
2059         } else {
2060                 shiftr = new_d_Shr(dbgi, shiftl, countr, amode);
2061         }
2062
2063         type_t  *type    = expression->base.type;
2064         ir_mode *resmode = get_ir_mode_arithmetic(type);
2065         return create_conv(dbgi, shiftr, resmode);
2066 }
2067
2068 /* make sure the selected compound type is constructed */
2069 static void construct_select_compound(const select_expression_t *expression)
2070 {
2071         type_t *type = skip_typeref(expression->compound->base.type);
2072         if (is_type_pointer(type)) {
2073                 type = type->pointer.points_to;
2074         }
2075         (void) get_ir_type(type);
2076 }
2077
2078 static ir_node *set_value_for_expression_addr(const expression_t *expression,
2079                                               ir_node *value, ir_node *addr)
2080 {
2081         dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
2082         type_t   *type = skip_typeref(expression->base.type);
2083
2084         if (!is_type_compound(type)) {
2085                 ir_mode  *mode = get_ir_mode_storage(type);
2086                 value          = create_conv(dbgi, value, mode);
2087                 value          = do_strict_conv(dbgi, value);
2088         }
2089
2090         if (expression->kind == EXPR_REFERENCE) {
2091                 const reference_expression_t *ref = &expression->reference;
2092
2093                 entity_t *entity = ref->entity;
2094                 assert(is_declaration(entity));
2095                 assert(entity->declaration.kind != DECLARATION_KIND_UNKNOWN);
2096                 if (entity->declaration.kind == DECLARATION_KIND_LOCAL_VARIABLE) {
2097                         set_value(entity->variable.v.value_number, value);
2098                         return value;
2099                 } else if (entity->declaration.kind == DECLARATION_KIND_PARAMETER) {
2100                         set_value(entity->parameter.v.value_number, value);
2101                         return value;
2102                 }
2103         }
2104
2105         if (addr == NULL)
2106                 addr = expression_to_addr(expression);
2107         assert(addr != NULL);
2108
2109         if (expression->kind == EXPR_SELECT) {
2110                 const select_expression_t *select = &expression->select;
2111
2112                 construct_select_compound(select);
2113
2114                 entity_t *entity = select->compound_entry;
2115                 assert(entity->kind == ENTITY_COMPOUND_MEMBER);
2116                 if (entity->compound_member.bitfield) {
2117                         ir_entity *irentity = entity->compound_member.entity;
2118                         bool       set_volatile
2119                                 = select->base.type->base.qualifiers & TYPE_QUALIFIER_VOLATILE;
2120                         value = bitfield_store_to_firm(dbgi, irentity, addr, value,
2121                                                        set_volatile);
2122                         return value;
2123                 }
2124         }
2125
2126         assign_value(dbgi, addr, type, value);
2127         return value;
2128 }
2129
2130 static void set_value_for_expression(const expression_t *expression,
2131                                      ir_node *value)
2132 {
2133         set_value_for_expression_addr(expression, value, NULL);
2134 }
2135
2136 static ir_node *get_value_from_lvalue(const expression_t *expression,
2137                                       ir_node *addr)
2138 {
2139         if (expression->kind == EXPR_REFERENCE) {
2140                 const reference_expression_t *ref = &expression->reference;
2141
2142                 entity_t *entity = ref->entity;
2143                 assert(entity->kind == ENTITY_VARIABLE
2144                                 || entity->kind == ENTITY_PARAMETER);
2145                 assert(entity->declaration.kind != DECLARATION_KIND_UNKNOWN);
2146                 int value_number;
2147                 if (entity->declaration.kind == DECLARATION_KIND_LOCAL_VARIABLE) {
2148                         value_number = entity->variable.v.value_number;
2149                         assert(addr == NULL);
2150                         type_t  *type = skip_typeref(expression->base.type);
2151                         ir_mode *mode = get_ir_mode_storage(type);
2152                         ir_node *res  = get_value(value_number, mode);
2153                         return create_conv(NULL, res, get_ir_mode_arithmetic(type));
2154                 } else if (entity->declaration.kind == DECLARATION_KIND_PARAMETER) {
2155                         value_number = entity->parameter.v.value_number;
2156                         assert(addr == NULL);
2157                         type_t  *type = skip_typeref(expression->base.type);
2158                         ir_mode *mode = get_ir_mode_storage(type);
2159                         ir_node *res  = get_value(value_number, mode);
2160                         return create_conv(NULL, res, get_ir_mode_arithmetic(type));
2161                 }
2162         }
2163
2164         assert(addr != NULL);
2165         dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
2166
2167         ir_node *value;
2168         if (expression->kind == EXPR_SELECT &&
2169             expression->select.compound_entry->compound_member.bitfield) {
2170             construct_select_compound(&expression->select);
2171                 value = bitfield_extract_to_firm(&expression->select, addr);
2172         } else {
2173                 value = deref_address(dbgi, expression->base.type, addr);
2174         }
2175
2176         return value;
2177 }
2178
2179
2180 static ir_node *create_incdec(const unary_expression_t *expression)
2181 {
2182         dbg_info *const     dbgi = get_dbg_info(&expression->base.source_position);
2183         const expression_t *value_expr = expression->value;
2184         ir_node            *addr       = expression_to_addr(value_expr);
2185         ir_node            *value      = get_value_from_lvalue(value_expr, addr);
2186
2187         type_t  *type = skip_typeref(expression->base.type);
2188         ir_mode *mode = get_ir_mode_arithmetic(expression->base.type);
2189
2190         ir_node *offset;
2191         if (is_type_pointer(type)) {
2192                 pointer_type_t *pointer_type = &type->pointer;
2193                 offset = get_type_size_node(pointer_type->points_to);
2194         } else {
2195                 assert(is_type_arithmetic(type));
2196                 offset = new_Const(get_mode_one(mode));
2197         }
2198
2199         ir_node *result;
2200         ir_node *store_value;
2201         switch(expression->base.kind) {
2202         case EXPR_UNARY_POSTFIX_INCREMENT:
2203                 result      = value;
2204                 store_value = new_d_Add(dbgi, value, offset, mode);
2205                 break;
2206         case EXPR_UNARY_POSTFIX_DECREMENT:
2207                 result      = value;
2208                 store_value = new_d_Sub(dbgi, value, offset, mode);
2209                 break;
2210         case EXPR_UNARY_PREFIX_INCREMENT:
2211                 result      = new_d_Add(dbgi, value, offset, mode);
2212                 store_value = result;
2213                 break;
2214         case EXPR_UNARY_PREFIX_DECREMENT:
2215                 result      = new_d_Sub(dbgi, value, offset, mode);
2216                 store_value = result;
2217                 break;
2218         default:
2219                 panic("no incdec expr in create_incdec");
2220         }
2221
2222         set_value_for_expression_addr(value_expr, store_value, addr);
2223
2224         return result;
2225 }
2226
2227 static bool is_local_variable(expression_t *expression)
2228 {
2229         if (expression->kind != EXPR_REFERENCE)
2230                 return false;
2231         reference_expression_t *ref_expr = &expression->reference;
2232         entity_t               *entity   = ref_expr->entity;
2233         if (entity->kind != ENTITY_VARIABLE)
2234                 return false;
2235         assert(entity->declaration.kind != DECLARATION_KIND_UNKNOWN);
2236         return entity->declaration.kind == DECLARATION_KIND_LOCAL_VARIABLE;
2237 }
2238
2239 static ir_relation get_relation(const expression_kind_t kind)
2240 {
2241         switch(kind) {
2242         case EXPR_BINARY_EQUAL:         return ir_relation_equal;
2243         case EXPR_BINARY_ISLESSGREATER: return ir_relation_less_greater;
2244         case EXPR_BINARY_NOTEQUAL:      return ir_relation_unordered_less_greater;
2245         case EXPR_BINARY_ISLESS:
2246         case EXPR_BINARY_LESS:          return ir_relation_less;
2247         case EXPR_BINARY_ISLESSEQUAL:
2248         case EXPR_BINARY_LESSEQUAL:     return ir_relation_less_equal;
2249         case EXPR_BINARY_ISGREATER:
2250         case EXPR_BINARY_GREATER:       return ir_relation_greater;
2251         case EXPR_BINARY_ISGREATEREQUAL:
2252         case EXPR_BINARY_GREATEREQUAL:  return ir_relation_greater_equal;
2253         case EXPR_BINARY_ISUNORDERED:   return ir_relation_unordered;
2254
2255         default:
2256                 break;
2257         }
2258         panic("trying to get pn_Cmp from non-comparison binexpr type");
2259 }
2260
2261 /**
2262  * Handle the assume optimizer hint: check if a Confirm
2263  * node can be created.
2264  *
2265  * @param dbi    debug info
2266  * @param expr   the IL assume expression
2267  *
2268  * we support here only some simple cases:
2269  *  - var rel const
2270  *  - const rel val
2271  *  - var rel var
2272  */
2273 static ir_node *handle_assume_compare(dbg_info *dbi,
2274                                       const binary_expression_t *expression)
2275 {
2276         expression_t *op1 = expression->left;
2277         expression_t *op2 = expression->right;
2278         entity_t     *var2, *var = NULL;
2279         ir_node      *res      = NULL;
2280         ir_relation   relation = get_relation(expression->base.kind);
2281
2282         if (is_local_variable(op1) && is_local_variable(op2)) {
2283                 var  = op1->reference.entity;
2284             var2 = op2->reference.entity;
2285
2286                 type_t  *const type = skip_typeref(var->declaration.type);
2287                 ir_mode *const mode = get_ir_mode_storage(type);
2288
2289                 ir_node *const irn1 = get_value(var->variable.v.value_number, mode);
2290                 ir_node *const irn2 = get_value(var2->variable.v.value_number, mode);
2291
2292                 res = new_d_Confirm(dbi, irn2, irn1, get_inversed_relation(relation));
2293                 set_value(var2->variable.v.value_number, res);
2294
2295                 res = new_d_Confirm(dbi, irn1, irn2, relation);
2296                 set_value(var->variable.v.value_number, res);
2297
2298                 return res;
2299         }
2300
2301         expression_t *con = NULL;
2302         if (is_local_variable(op1) && is_constant_expression(op2) == EXPR_CLASS_CONSTANT) {
2303                 var = op1->reference.entity;
2304                 con = op2;
2305         } else if (is_constant_expression(op1) == EXPR_CLASS_CONSTANT && is_local_variable(op2)) {
2306                 relation = get_inversed_relation(relation);
2307                 var = op2->reference.entity;
2308                 con = op1;
2309         }
2310
2311         if (var != NULL) {
2312                 type_t  *const type = skip_typeref(var->declaration.type);
2313                 ir_mode *const mode = get_ir_mode_storage(type);
2314
2315                 res = get_value(var->variable.v.value_number, mode);
2316                 res = new_d_Confirm(dbi, res, expression_to_firm(con), relation);
2317                 set_value(var->variable.v.value_number, res);
2318         }
2319         return res;
2320 }
2321
2322 /**
2323  * Handle the assume optimizer hint.
2324  *
2325  * @param dbi    debug info
2326  * @param expr   the IL assume expression
2327  */
2328 static ir_node *handle_assume(dbg_info *dbi, const expression_t *expression)
2329 {
2330         switch(expression->kind) {
2331         case EXPR_BINARY_EQUAL:
2332         case EXPR_BINARY_NOTEQUAL:
2333         case EXPR_BINARY_LESS:
2334         case EXPR_BINARY_LESSEQUAL:
2335         case EXPR_BINARY_GREATER:
2336         case EXPR_BINARY_GREATEREQUAL:
2337                 return handle_assume_compare(dbi, &expression->binary);
2338         default:
2339                 return NULL;
2340         }
2341 }
2342
2343 static ir_node *create_cast(dbg_info *dbgi, ir_node *value_node,
2344                             type_t *from_type, type_t *type)
2345 {
2346         type = skip_typeref(type);
2347         if (type == type_void) {
2348                 /* make sure firm type is constructed */
2349                 (void) get_ir_type(type);
2350                 return NULL;
2351         }
2352         if (!is_type_scalar(type)) {
2353                 /* make sure firm type is constructed */
2354                 (void) get_ir_type(type);
2355                 return value_node;
2356         }
2357
2358         from_type     = skip_typeref(from_type);
2359         ir_mode *mode = get_ir_mode_storage(type);
2360         /* check for conversion from / to __based types */
2361         if (is_type_pointer(type) && is_type_pointer(from_type)) {
2362                 const variable_t *from_var = from_type->pointer.base_variable;
2363                 const variable_t *to_var   = type->pointer.base_variable;
2364                 if (from_var != to_var) {
2365                         if (from_var != NULL) {
2366                                 ir_node *const addr = create_symconst(dbgi, from_var->v.entity);
2367                                 ir_node *const base = deref_address(dbgi, from_var->base.type, addr);
2368                                 value_node = new_d_Add(dbgi, value_node, base, get_ir_mode_storage(from_type));
2369                         }
2370                         if (to_var != NULL) {
2371                                 ir_node *const addr = create_symconst(dbgi, to_var->v.entity);
2372                                 ir_node *const base = deref_address(dbgi, to_var->base.type, addr);
2373                                 value_node = new_d_Sub(dbgi, value_node, base, mode);
2374                         }
2375                 }
2376         }
2377
2378         if (is_type_atomic(type, ATOMIC_TYPE_BOOL)) {
2379                 /* bool adjustments (we save a mode_Bu, but have to temporarily
2380                  * convert to mode_b so we only get a 0/1 value */
2381                 value_node = create_conv(dbgi, value_node, mode_b);
2382         }
2383
2384         ir_mode *mode_arith = get_ir_mode_arithmetic(type);
2385         ir_node *node       = create_conv(dbgi, value_node, mode);
2386         node                = do_strict_conv(dbgi, node);
2387         node                = create_conv(dbgi, node, mode_arith);
2388
2389         return node;
2390 }
2391
2392 static ir_node *unary_expression_to_firm(const unary_expression_t *expression)
2393 {
2394         dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
2395         type_t   *type = skip_typeref(expression->base.type);
2396
2397         if (expression->base.kind == EXPR_UNARY_TAKE_ADDRESS)
2398                 return expression_to_addr(expression->value);
2399
2400         const expression_t *value = expression->value;
2401
2402         switch(expression->base.kind) {
2403         case EXPR_UNARY_NEGATE: {
2404                 ir_node *value_node = expression_to_firm(value);
2405                 ir_mode *mode       = get_ir_mode_arithmetic(type);
2406                 return new_d_Minus(dbgi, value_node, mode);
2407         }
2408         case EXPR_UNARY_PLUS:
2409                 return expression_to_firm(value);
2410         case EXPR_UNARY_BITWISE_NEGATE: {
2411                 ir_node *value_node = expression_to_firm(value);
2412                 ir_mode *mode       = get_ir_mode_arithmetic(type);
2413                 return new_d_Not(dbgi, value_node, mode);
2414         }
2415         case EXPR_UNARY_NOT: {
2416                 ir_node *value_node = _expression_to_firm(value);
2417                 value_node          = create_conv(dbgi, value_node, mode_b);
2418                 ir_node *res        = new_d_Not(dbgi, value_node, mode_b);
2419                 return res;
2420         }
2421         case EXPR_UNARY_DEREFERENCE: {
2422                 ir_node *value_node = expression_to_firm(value);
2423                 type_t  *value_type = skip_typeref(value->base.type);
2424                 assert(is_type_pointer(value_type));
2425
2426                 /* check for __based */
2427                 const variable_t *const base_var = value_type->pointer.base_variable;
2428                 if (base_var != NULL) {
2429                         ir_node *const addr = create_symconst(dbgi, base_var->v.entity);
2430                         ir_node *const base = deref_address(dbgi, base_var->base.type, addr);
2431                         value_node = new_d_Add(dbgi, value_node, base, get_ir_mode_storage(value_type));
2432                 }
2433                 type_t  *points_to  = value_type->pointer.points_to;
2434                 return deref_address(dbgi, points_to, value_node);
2435         }
2436         case EXPR_UNARY_POSTFIX_INCREMENT:
2437         case EXPR_UNARY_POSTFIX_DECREMENT:
2438         case EXPR_UNARY_PREFIX_INCREMENT:
2439         case EXPR_UNARY_PREFIX_DECREMENT:
2440                 return create_incdec(expression);
2441         case EXPR_UNARY_CAST: {
2442                 ir_node *value_node = expression_to_firm(value);
2443                 type_t  *from_type  = value->base.type;
2444                 return create_cast(dbgi, value_node, from_type, type);
2445         }
2446         case EXPR_UNARY_ASSUME:
2447                 return handle_assume(dbgi, value);
2448
2449         default:
2450                 break;
2451         }
2452         panic("invalid UNEXPR type found");
2453 }
2454
2455 /**
2456  * produces a 0/1 depending of the value of a mode_b node
2457  */
2458 static ir_node *produce_condition_result(const expression_t *expression,
2459                                          ir_mode *mode, dbg_info *dbgi)
2460 {
2461         ir_node *const one_block  = new_immBlock();
2462         ir_node *const zero_block = new_immBlock();
2463         create_condition_evaluation(expression, one_block, zero_block);
2464         mature_immBlock(one_block);
2465         mature_immBlock(zero_block);
2466
2467         ir_node *const jmp_one  = new_rd_Jmp(dbgi, one_block);
2468         ir_node *const jmp_zero = new_rd_Jmp(dbgi, zero_block);
2469         ir_node *const in_cf[2] = { jmp_one, jmp_zero };
2470         ir_node *const block    = new_Block(lengthof(in_cf), in_cf);
2471         set_cur_block(block);
2472
2473         ir_node *const one   = new_Const(get_mode_one(mode));
2474         ir_node *const zero  = new_Const(get_mode_null(mode));
2475         ir_node *const in[2] = { one, zero };
2476         ir_node *const val   = new_d_Phi(dbgi, lengthof(in), in, mode);
2477
2478         return val;
2479 }
2480
2481 static ir_node *adjust_for_pointer_arithmetic(dbg_info *dbgi,
2482                 ir_node *value, type_t *type)
2483 {
2484         ir_mode        *const mode         = get_ir_mode_arithmetic(type_ptrdiff_t);
2485         assert(is_type_pointer(type));
2486         pointer_type_t *const pointer_type = &type->pointer;
2487         type_t         *const points_to    = skip_typeref(pointer_type->points_to);
2488         ir_node        *      elem_size    = get_type_size_node(points_to);
2489         elem_size                          = create_conv(dbgi, elem_size, mode);
2490         value                              = create_conv(dbgi, value,     mode);
2491         ir_node        *const mul          = new_d_Mul(dbgi, value, elem_size, mode);
2492         return mul;
2493 }
2494
2495 static ir_node *create_op(dbg_info *dbgi, const binary_expression_t *expression,
2496                           ir_node *left, ir_node *right)
2497 {
2498         ir_mode  *mode;
2499         type_t   *type_left  = skip_typeref(expression->left->base.type);
2500         type_t   *type_right = skip_typeref(expression->right->base.type);
2501
2502         expression_kind_t kind = expression->base.kind;
2503
2504         switch (kind) {
2505         case EXPR_BINARY_SHIFTLEFT:
2506         case EXPR_BINARY_SHIFTRIGHT:
2507         case EXPR_BINARY_SHIFTLEFT_ASSIGN:
2508         case EXPR_BINARY_SHIFTRIGHT_ASSIGN:
2509                 mode  = get_ir_mode_arithmetic(expression->base.type);
2510                 right = create_conv(dbgi, right, mode_uint);
2511                 break;
2512
2513         case EXPR_BINARY_SUB:
2514                 if (is_type_pointer(type_left) && is_type_pointer(type_right)) {
2515                         const pointer_type_t *const ptr_type = &type_left->pointer;
2516
2517                         mode = get_ir_mode_arithmetic(expression->base.type);
2518                         ir_node *const elem_size = get_type_size_node(ptr_type->points_to);
2519                         ir_node *const conv_size = new_d_Conv(dbgi, elem_size, mode);
2520                         ir_node *const sub       = new_d_Sub(dbgi, left, right, mode);
2521                         ir_node *const no_mem    = new_NoMem();
2522                         ir_node *const div       = new_d_DivRL(dbgi, no_mem, sub, conv_size,
2523                                                                                                    mode, op_pin_state_floats);
2524                         return new_d_Proj(dbgi, div, mode, pn_Div_res);
2525                 }
2526                 /* fallthrough */
2527         case EXPR_BINARY_SUB_ASSIGN:
2528                 if (is_type_pointer(type_left)) {
2529                         right = adjust_for_pointer_arithmetic(dbgi, right, type_left);
2530                         mode  = get_ir_mode_arithmetic(type_left);
2531                         break;
2532                 }
2533                 goto normal_node;
2534
2535         case EXPR_BINARY_ADD:
2536         case EXPR_BINARY_ADD_ASSIGN:
2537                 if (is_type_pointer(type_left)) {
2538                         right = adjust_for_pointer_arithmetic(dbgi, right, type_left);
2539                         mode  = get_ir_mode_arithmetic(type_left);
2540                         break;
2541                 } else if (is_type_pointer(type_right)) {
2542                         left  = adjust_for_pointer_arithmetic(dbgi, left, type_right);
2543                         mode  = get_ir_mode_arithmetic(type_right);
2544                         break;
2545                 }
2546                 goto normal_node;
2547
2548         default:
2549 normal_node:
2550                 mode = get_ir_mode_arithmetic(type_right);
2551                 left = create_conv(dbgi, left, mode);
2552                 break;
2553         }
2554
2555         switch (kind) {
2556         case EXPR_BINARY_ADD_ASSIGN:
2557         case EXPR_BINARY_ADD:
2558                 return new_d_Add(dbgi, left, right, mode);
2559         case EXPR_BINARY_SUB_ASSIGN:
2560         case EXPR_BINARY_SUB:
2561                 return new_d_Sub(dbgi, left, right, mode);
2562         case EXPR_BINARY_MUL_ASSIGN:
2563         case EXPR_BINARY_MUL:
2564                 return new_d_Mul(dbgi, left, right, mode);
2565         case EXPR_BINARY_BITWISE_AND:
2566         case EXPR_BINARY_BITWISE_AND_ASSIGN:
2567                 return new_d_And(dbgi, left, right, mode);
2568         case EXPR_BINARY_BITWISE_OR:
2569         case EXPR_BINARY_BITWISE_OR_ASSIGN:
2570                 return new_d_Or(dbgi, left, right, mode);
2571         case EXPR_BINARY_BITWISE_XOR:
2572         case EXPR_BINARY_BITWISE_XOR_ASSIGN:
2573                 return new_d_Eor(dbgi, left, right, mode);
2574         case EXPR_BINARY_SHIFTLEFT:
2575         case EXPR_BINARY_SHIFTLEFT_ASSIGN:
2576                 return new_d_Shl(dbgi, left, right, mode);
2577         case EXPR_BINARY_SHIFTRIGHT:
2578         case EXPR_BINARY_SHIFTRIGHT_ASSIGN:
2579                 if (mode_is_signed(mode)) {
2580                         return new_d_Shrs(dbgi, left, right, mode);
2581                 } else {
2582                         return new_d_Shr(dbgi, left, right, mode);
2583                 }
2584         case EXPR_BINARY_DIV:
2585         case EXPR_BINARY_DIV_ASSIGN: {
2586                 ir_node *pin = new_Pin(new_NoMem());
2587                 ir_node *op  = new_d_Div(dbgi, pin, left, right, mode,
2588                                          op_pin_state_floats);
2589                 ir_node *res = new_d_Proj(dbgi, op, mode, pn_Div_res);
2590                 return res;
2591         }
2592         case EXPR_BINARY_MOD:
2593         case EXPR_BINARY_MOD_ASSIGN: {
2594                 ir_node *pin = new_Pin(new_NoMem());
2595                 assert(!mode_is_float(mode));
2596                 ir_node *op  = new_d_Mod(dbgi, pin, left, right, mode,
2597                                          op_pin_state_floats);
2598                 ir_node *res = new_d_Proj(dbgi, op, mode, pn_Mod_res);
2599                 return res;
2600         }
2601         default:
2602                 panic("unexpected expression kind");
2603         }
2604 }
2605
2606 static ir_node *create_lazy_op(const binary_expression_t *expression)
2607 {
2608         dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
2609         type_t   *type = skip_typeref(expression->base.type);
2610         ir_mode  *mode = get_ir_mode_arithmetic(type);
2611
2612         if (is_constant_expression(expression->left) == EXPR_CLASS_CONSTANT) {
2613                 bool val = fold_constant_to_bool(expression->left);
2614                 expression_kind_t ekind = expression->base.kind;
2615                 assert(ekind == EXPR_BINARY_LOGICAL_AND || ekind == EXPR_BINARY_LOGICAL_OR);
2616                 if (ekind == EXPR_BINARY_LOGICAL_AND) {
2617                         if (!val) {
2618                                 return new_Const(get_mode_null(mode));
2619                         }
2620                 } else {
2621                         if (val) {
2622                                 return new_Const(get_mode_one(mode));
2623                         }
2624                 }
2625
2626                 if (is_constant_expression(expression->right) == EXPR_CLASS_CONSTANT) {
2627                         bool valr = fold_constant_to_bool(expression->right);
2628                         return create_Const_from_bool(mode, valr);
2629                 }
2630
2631                 return produce_condition_result(expression->right, mode, dbgi);
2632         }
2633
2634         return produce_condition_result((const expression_t*) expression, mode,
2635                                         dbgi);
2636 }
2637
2638 typedef ir_node * (*create_arithmetic_func)(dbg_info *dbgi, ir_node *left,
2639                                             ir_node *right, ir_mode *mode);
2640
2641 static ir_node *create_assign_binop(const binary_expression_t *expression)
2642 {
2643         dbg_info *const     dbgi = get_dbg_info(&expression->base.source_position);
2644         const expression_t *left_expr = expression->left;
2645         type_t             *type      = skip_typeref(left_expr->base.type);
2646         ir_node            *right     = expression_to_firm(expression->right);
2647         ir_node            *left_addr = expression_to_addr(left_expr);
2648         ir_node            *left      = get_value_from_lvalue(left_expr, left_addr);
2649         ir_node            *result    = create_op(dbgi, expression, left, right);
2650
2651         result = create_cast(dbgi, result, expression->right->base.type, type);
2652         result = do_strict_conv(dbgi, result);
2653
2654         result = set_value_for_expression_addr(left_expr, result, left_addr);
2655
2656         if (!is_type_compound(type)) {
2657                 ir_mode *mode_arithmetic = get_ir_mode_arithmetic(type);
2658                 result = create_conv(dbgi, result, mode_arithmetic);
2659         }
2660         return result;
2661 }
2662
2663 static ir_node *binary_expression_to_firm(const binary_expression_t *expression)
2664 {
2665         expression_kind_t kind = expression->base.kind;
2666
2667         switch(kind) {
2668         case EXPR_BINARY_EQUAL:
2669         case EXPR_BINARY_NOTEQUAL:
2670         case EXPR_BINARY_LESS:
2671         case EXPR_BINARY_LESSEQUAL:
2672         case EXPR_BINARY_GREATER:
2673         case EXPR_BINARY_GREATEREQUAL:
2674         case EXPR_BINARY_ISGREATER:
2675         case EXPR_BINARY_ISGREATEREQUAL:
2676         case EXPR_BINARY_ISLESS:
2677         case EXPR_BINARY_ISLESSEQUAL:
2678         case EXPR_BINARY_ISLESSGREATER:
2679         case EXPR_BINARY_ISUNORDERED: {
2680                 dbg_info   *dbgi     = get_dbg_info(&expression->base.source_position);
2681                 ir_node    *left     = expression_to_firm(expression->left);
2682                 ir_node    *right    = expression_to_firm(expression->right);
2683                 ir_relation relation = get_relation(kind);
2684                 ir_node    *cmp      = new_d_Cmp(dbgi, left, right, relation);
2685                 return cmp;
2686         }
2687         case EXPR_BINARY_ASSIGN: {
2688                 ir_node *addr  = expression_to_addr(expression->left);
2689                 ir_node *right = expression_to_firm(expression->right);
2690                 ir_node *res
2691                         = set_value_for_expression_addr(expression->left, right, addr);
2692
2693                 type_t  *type            = skip_typeref(expression->base.type);
2694                 if (!is_type_compound(type)) {
2695                         ir_mode *mode_arithmetic = get_ir_mode_arithmetic(type);
2696                         res                      = create_conv(NULL, res, mode_arithmetic);
2697                 }
2698                 return res;
2699         }
2700         case EXPR_BINARY_ADD:
2701         case EXPR_BINARY_SUB:
2702         case EXPR_BINARY_MUL:
2703         case EXPR_BINARY_DIV:
2704         case EXPR_BINARY_MOD:
2705         case EXPR_BINARY_BITWISE_AND:
2706         case EXPR_BINARY_BITWISE_OR:
2707         case EXPR_BINARY_BITWISE_XOR:
2708         case EXPR_BINARY_SHIFTLEFT:
2709         case EXPR_BINARY_SHIFTRIGHT:
2710         {
2711                 dbg_info *dbgi  = get_dbg_info(&expression->base.source_position);
2712                 ir_node  *left  = expression_to_firm(expression->left);
2713                 ir_node  *right = expression_to_firm(expression->right);
2714                 return create_op(dbgi, expression, left, right);
2715         }
2716         case EXPR_BINARY_LOGICAL_AND:
2717         case EXPR_BINARY_LOGICAL_OR:
2718                 return create_lazy_op(expression);
2719         case EXPR_BINARY_COMMA:
2720                 /* create side effects of left side */
2721                 (void) expression_to_firm(expression->left);
2722                 return _expression_to_firm(expression->right);
2723
2724         case EXPR_BINARY_ADD_ASSIGN:
2725         case EXPR_BINARY_SUB_ASSIGN:
2726         case EXPR_BINARY_MUL_ASSIGN:
2727         case EXPR_BINARY_MOD_ASSIGN:
2728         case EXPR_BINARY_DIV_ASSIGN:
2729         case EXPR_BINARY_BITWISE_AND_ASSIGN:
2730         case EXPR_BINARY_BITWISE_OR_ASSIGN:
2731         case EXPR_BINARY_BITWISE_XOR_ASSIGN:
2732         case EXPR_BINARY_SHIFTLEFT_ASSIGN:
2733         case EXPR_BINARY_SHIFTRIGHT_ASSIGN:
2734                 return create_assign_binop(expression);
2735         default:
2736                 panic("TODO binexpr type");
2737         }
2738 }
2739
2740 static ir_node *array_access_addr(const array_access_expression_t *expression)
2741 {
2742         dbg_info *dbgi        = get_dbg_info(&expression->base.source_position);
2743         ir_node  *base_addr   = expression_to_firm(expression->array_ref);
2744         ir_node  *offset      = expression_to_firm(expression->index);
2745         type_t   *ref_type    = skip_typeref(expression->array_ref->base.type);
2746         ir_node  *real_offset = adjust_for_pointer_arithmetic(dbgi, offset, ref_type);
2747         ir_node  *result      = new_d_Add(dbgi, base_addr, real_offset, mode_P_data);
2748
2749         return result;
2750 }
2751
2752 static ir_node *array_access_to_firm(
2753                 const array_access_expression_t *expression)
2754 {
2755         dbg_info *dbgi   = get_dbg_info(&expression->base.source_position);
2756         ir_node  *addr   = array_access_addr(expression);
2757         type_t   *type   = revert_automatic_type_conversion(
2758                         (const expression_t*) expression);
2759         type             = skip_typeref(type);
2760
2761         return deref_address(dbgi, type, addr);
2762 }
2763
2764 static long get_offsetof_offset(const offsetof_expression_t *expression)
2765 {
2766         type_t *orig_type = expression->type;
2767         long    offset    = 0;
2768
2769         designator_t *designator = expression->designator;
2770         for ( ; designator != NULL; designator = designator->next) {
2771                 type_t *type = skip_typeref(orig_type);
2772                 /* be sure the type is constructed */
2773                 (void) get_ir_type(type);
2774
2775                 if (designator->symbol != NULL) {
2776                         assert(is_type_compound(type));
2777                         symbol_t *symbol = designator->symbol;
2778
2779                         compound_t *compound = type->compound.compound;
2780                         entity_t   *iter     = compound->members.entities;
2781                         for ( ; iter != NULL; iter = iter->base.next) {
2782                                 if (iter->base.symbol == symbol) {
2783                                         break;
2784                                 }
2785                         }
2786                         assert(iter != NULL);
2787
2788                         assert(iter->kind == ENTITY_COMPOUND_MEMBER);
2789                         assert(iter->declaration.kind == DECLARATION_KIND_COMPOUND_MEMBER);
2790                         offset += get_entity_offset(iter->compound_member.entity);
2791
2792                         orig_type = iter->declaration.type;
2793                 } else {
2794                         expression_t *array_index = designator->array_index;
2795                         assert(designator->array_index != NULL);
2796                         assert(is_type_array(type));
2797
2798                         long index         = fold_constant_to_int(array_index);
2799                         ir_type *arr_type  = get_ir_type(type);
2800                         ir_type *elem_type = get_array_element_type(arr_type);
2801                         long     elem_size = get_type_size_bytes(elem_type);
2802
2803                         offset += index * elem_size;
2804
2805                         orig_type = type->array.element_type;
2806                 }
2807         }
2808
2809         return offset;
2810 }
2811
2812 static ir_node *offsetof_to_firm(const offsetof_expression_t *expression)
2813 {
2814         ir_mode   *mode   = get_ir_mode_arithmetic(expression->base.type);
2815         long       offset = get_offsetof_offset(expression);
2816         ir_tarval *tv     = new_tarval_from_long(offset, mode);
2817         dbg_info  *dbgi   = get_dbg_info(&expression->base.source_position);
2818
2819         return new_d_Const(dbgi, tv);
2820 }
2821
2822 static void create_local_initializer(initializer_t *initializer, dbg_info *dbgi,
2823                                      ir_entity *entity, type_t *type);
2824
2825 static ir_node *compound_literal_to_firm(
2826                 const compound_literal_expression_t *expression)
2827 {
2828         type_t *type = expression->type;
2829
2830         /* create an entity on the stack */
2831         ir_type *frame_type = get_irg_frame_type(current_ir_graph);
2832
2833         ident     *const id     = id_unique("CompLit.%u");
2834         ir_type   *const irtype = get_ir_type(type);
2835         dbg_info  *const dbgi   = get_dbg_info(&expression->base.source_position);
2836         ir_entity *const entity = new_d_entity(frame_type, id, irtype, dbgi);
2837         set_entity_ld_ident(entity, id);
2838
2839         /* create initialisation code */
2840         initializer_t *initializer = expression->initializer;
2841         create_local_initializer(initializer, dbgi, entity, type);
2842
2843         /* create a sel for the compound literal address */
2844         ir_node *frame = get_irg_frame(current_ir_graph);
2845         ir_node *sel   = new_d_simpleSel(dbgi, new_NoMem(), frame, entity);
2846         return sel;
2847 }
2848
2849 /**
2850  * Transform a sizeof expression into Firm code.
2851  */
2852 static ir_node *sizeof_to_firm(const typeprop_expression_t *expression)
2853 {
2854         type_t *const type = skip_typeref(expression->type);
2855         /* ยง6.5.3.4:2 if the type is a VLA, evaluate the expression. */
2856         if (is_type_array(type) && type->array.is_vla
2857                         && expression->tp_expression != NULL) {
2858                 expression_to_firm(expression->tp_expression);
2859         }
2860         /* strange gnu extensions: sizeof(function) == 1 */
2861         if (is_type_function(type)) {
2862                 ir_mode *mode = get_ir_mode_storage(type_size_t);
2863                 return new_Const(get_mode_one(mode));
2864         }
2865
2866         return get_type_size_node(type);
2867 }
2868
2869 static entity_t *get_expression_entity(const expression_t *expression)
2870 {
2871         if (expression->kind != EXPR_REFERENCE)
2872                 return NULL;
2873
2874         return expression->reference.entity;
2875 }
2876
2877 static unsigned get_cparser_entity_alignment(const entity_t *entity)
2878 {
2879         switch(entity->kind) {
2880         DECLARATION_KIND_CASES
2881                 return entity->declaration.alignment;
2882         case ENTITY_STRUCT:
2883         case ENTITY_UNION:
2884                 return entity->compound.alignment;
2885         case ENTITY_TYPEDEF:
2886                 return entity->typedefe.alignment;
2887         default:
2888                 break;
2889         }
2890         return 0;
2891 }
2892
2893 /**
2894  * Transform an alignof expression into Firm code.
2895  */
2896 static ir_node *alignof_to_firm(const typeprop_expression_t *expression)
2897 {
2898         unsigned alignment = 0;
2899
2900         const expression_t *tp_expression = expression->tp_expression;
2901         if (tp_expression != NULL) {
2902                 entity_t *entity = get_expression_entity(tp_expression);
2903                 if (entity != NULL) {
2904                         if (entity->kind == ENTITY_FUNCTION) {
2905                                 /* a gnu-extension */
2906                                 alignment = 1;
2907                         } else {
2908                                 alignment = get_cparser_entity_alignment(entity);
2909                         }
2910                 }
2911         }
2912
2913         if (alignment == 0) {
2914                 type_t *type = expression->type;
2915                 alignment = get_type_alignment(type);
2916         }
2917
2918         dbg_info  *dbgi = get_dbg_info(&expression->base.source_position);
2919         ir_mode   *mode = get_ir_mode_arithmetic(expression->base.type);
2920         ir_tarval *tv   = new_tarval_from_long(alignment, mode);
2921         return new_d_Const(dbgi, tv);
2922 }
2923
2924 static void init_ir_types(void);
2925
2926 static ir_tarval *fold_constant_to_tarval(const expression_t *expression)
2927 {
2928         assert(is_type_valid(skip_typeref(expression->base.type)));
2929
2930         bool constant_folding_old = constant_folding;
2931         constant_folding = true;
2932
2933         init_ir_types();
2934
2935         assert(is_constant_expression(expression) == EXPR_CLASS_CONSTANT);
2936
2937         ir_graph *old_current_ir_graph = current_ir_graph;
2938         current_ir_graph = get_const_code_irg();
2939
2940         ir_node *cnst = expression_to_firm(expression);
2941         current_ir_graph = old_current_ir_graph;
2942
2943         if (!is_Const(cnst)) {
2944                 panic("couldn't fold constant");
2945         }
2946
2947         constant_folding = constant_folding_old;
2948
2949         return get_Const_tarval(cnst);
2950 }
2951
2952 /* this function is only used in parser.c, but it relies on libfirm functionality */
2953 bool constant_is_negative(const expression_t *expression)
2954 {
2955         assert(is_constant_expression(expression) == EXPR_CLASS_CONSTANT);
2956         ir_tarval *tv = fold_constant_to_tarval(expression);
2957         return tarval_is_negative(tv);
2958 }
2959
2960 long fold_constant_to_int(const expression_t *expression)
2961 {
2962         if (expression->kind == EXPR_ERROR)
2963                 return 0;
2964
2965         ir_tarval *tv = fold_constant_to_tarval(expression);
2966         if (!tarval_is_long(tv)) {
2967                 panic("result of constant folding is not integer");
2968         }
2969
2970         return get_tarval_long(tv);
2971 }
2972
2973 bool fold_constant_to_bool(const expression_t *expression)
2974 {
2975         if (expression->kind == EXPR_ERROR)
2976                 return false;
2977         ir_tarval *tv = fold_constant_to_tarval(expression);
2978         return !tarval_is_null(tv);
2979 }
2980
2981 static ir_node *conditional_to_firm(const conditional_expression_t *expression)
2982 {
2983         dbg_info *const dbgi = get_dbg_info(&expression->base.source_position);
2984
2985         /* first try to fold a constant condition */
2986         if (is_constant_expression(expression->condition) == EXPR_CLASS_CONSTANT) {
2987                 bool val = fold_constant_to_bool(expression->condition);
2988                 if (val) {
2989                         expression_t *true_expression = expression->true_expression;
2990                         if (true_expression == NULL)
2991                                 true_expression = expression->condition;
2992                         return expression_to_firm(true_expression);
2993                 } else {
2994                         return expression_to_firm(expression->false_expression);
2995                 }
2996         }
2997
2998         ir_node *const true_block  = new_immBlock();
2999         ir_node *const false_block = new_immBlock();
3000         ir_node *const cond_expr   = create_condition_evaluation(expression->condition, true_block, false_block);
3001         mature_immBlock(true_block);
3002         mature_immBlock(false_block);
3003
3004         set_cur_block(true_block);
3005         ir_node *true_val;
3006         if (expression->true_expression != NULL) {
3007                 true_val = expression_to_firm(expression->true_expression);
3008         } else if (cond_expr != NULL && get_irn_mode(cond_expr) != mode_b) {
3009                 true_val = cond_expr;
3010         } else {
3011                 /* Condition ended with a short circuit (&&, ||, !) operation or a
3012                  * comparison.  Generate a "1" as value for the true branch. */
3013                 true_val = new_Const(get_mode_one(mode_Is));
3014         }
3015         ir_node *const true_jmp = new_d_Jmp(dbgi);
3016
3017         set_cur_block(false_block);
3018         ir_node *const false_val = expression_to_firm(expression->false_expression);
3019         ir_node *const false_jmp = new_d_Jmp(dbgi);
3020
3021         /* create the common block */
3022         ir_node *const in_cf[2] = { true_jmp, false_jmp };
3023         ir_node *const block    = new_Block(lengthof(in_cf), in_cf);
3024         set_cur_block(block);
3025
3026         /* TODO improve static semantics, so either both or no values are NULL */
3027         if (true_val == NULL || false_val == NULL)
3028                 return NULL;
3029
3030         ir_node *const in[2] = { true_val, false_val };
3031         type_t  *const type  = skip_typeref(expression->base.type);
3032         ir_mode *mode;
3033         if (is_type_compound(type)) {
3034                 mode = mode_P;
3035         } else {
3036                 mode = get_ir_mode_arithmetic(type);
3037         }
3038         ir_node *const val   = new_d_Phi(dbgi, lengthof(in), in, mode);
3039
3040         return val;
3041 }
3042
3043 /**
3044  * Returns an IR-node representing the address of a field.
3045  */
3046 static ir_node *select_addr(const select_expression_t *expression)
3047 {
3048         dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
3049
3050         construct_select_compound(expression);
3051
3052         ir_node *compound_addr = expression_to_firm(expression->compound);
3053
3054         entity_t *entry = expression->compound_entry;
3055         assert(entry->kind == ENTITY_COMPOUND_MEMBER);
3056         assert(entry->declaration.kind == DECLARATION_KIND_COMPOUND_MEMBER);
3057
3058         if (constant_folding) {
3059                 ir_mode *mode = get_irn_mode(compound_addr);
3060                 /* FIXME: here, we need an integer mode with the same number of bits as mode */
3061                 ir_node *ofs  = new_Const_long(mode_uint, entry->compound_member.offset);
3062                 return new_d_Add(dbgi, compound_addr, ofs, mode);
3063         } else {
3064                 ir_entity *irentity = entry->compound_member.entity;
3065                 assert(irentity != NULL);
3066                 return new_d_simpleSel(dbgi, new_NoMem(), compound_addr, irentity);
3067         }
3068 }
3069
3070 static ir_node *select_to_firm(const select_expression_t *expression)
3071 {
3072         dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
3073         ir_node  *addr = select_addr(expression);
3074         type_t   *type = revert_automatic_type_conversion(
3075                         (const expression_t*) expression);
3076         type           = skip_typeref(type);
3077
3078         entity_t *entry = expression->compound_entry;
3079         assert(entry->kind == ENTITY_COMPOUND_MEMBER);
3080
3081         if (entry->compound_member.bitfield) {
3082                 return bitfield_extract_to_firm(expression, addr);
3083         }
3084
3085         return deref_address(dbgi, type, addr);
3086 }
3087
3088 /* Values returned by __builtin_classify_type. */
3089 typedef enum gcc_type_class
3090 {
3091         no_type_class = -1,
3092         void_type_class,
3093         integer_type_class,
3094         char_type_class,
3095         enumeral_type_class,
3096         boolean_type_class,
3097         pointer_type_class,
3098         reference_type_class,
3099         offset_type_class,
3100         real_type_class,
3101         complex_type_class,
3102         function_type_class,
3103         method_type_class,
3104         record_type_class,
3105         union_type_class,
3106         array_type_class,
3107         string_type_class,
3108         set_type_class,
3109         file_type_class,
3110         lang_type_class
3111 } gcc_type_class;
3112
3113 static ir_node *classify_type_to_firm(const classify_type_expression_t *const expr)
3114 {
3115         type_t *type = expr->type_expression->base.type;
3116
3117         /* FIXME gcc returns different values depending on whether compiling C or C++
3118          * e.g. int x[10] is pointer_type_class in C, but array_type_class in C++ */
3119         gcc_type_class tc;
3120         for (;;) {
3121                 type = skip_typeref(type);
3122                 switch (type->kind) {
3123                         case TYPE_ATOMIC: {
3124                                 const atomic_type_t *const atomic_type = &type->atomic;
3125                                 switch (atomic_type->akind) {
3126                                         /* should not be reached */
3127                                         case ATOMIC_TYPE_INVALID:
3128                                                 tc = no_type_class;
3129                                                 goto make_const;
3130
3131                                         /* gcc cannot do that */
3132                                         case ATOMIC_TYPE_VOID:
3133                                                 tc = void_type_class;
3134                                                 goto make_const;
3135
3136                                         case ATOMIC_TYPE_WCHAR_T:   /* gcc handles this as integer */
3137                                         case ATOMIC_TYPE_CHAR:      /* gcc handles this as integer */
3138                                         case ATOMIC_TYPE_SCHAR:     /* gcc handles this as integer */
3139                                         case ATOMIC_TYPE_UCHAR:     /* gcc handles this as integer */
3140                                         case ATOMIC_TYPE_SHORT:
3141                                         case ATOMIC_TYPE_USHORT:
3142                                         case ATOMIC_TYPE_INT:
3143                                         case ATOMIC_TYPE_UINT:
3144                                         case ATOMIC_TYPE_LONG:
3145                                         case ATOMIC_TYPE_ULONG:
3146                                         case ATOMIC_TYPE_LONGLONG:
3147                                         case ATOMIC_TYPE_ULONGLONG:
3148                                         case ATOMIC_TYPE_BOOL:      /* gcc handles this as integer */
3149                                                 tc = integer_type_class;
3150                                                 goto make_const;
3151
3152                                         case ATOMIC_TYPE_FLOAT:
3153                                         case ATOMIC_TYPE_DOUBLE:
3154                                         case ATOMIC_TYPE_LONG_DOUBLE:
3155                                                 tc = real_type_class;
3156                                                 goto make_const;
3157                                 }
3158                                 panic("Unexpected atomic type in classify_type_to_firm().");
3159                         }
3160
3161                         case TYPE_COMPLEX:         tc = complex_type_class; goto make_const;
3162                         case TYPE_IMAGINARY:       tc = complex_type_class; goto make_const;
3163                         case TYPE_ARRAY:           /* gcc handles this as pointer */
3164                         case TYPE_FUNCTION:        /* gcc handles this as pointer */
3165                         case TYPE_POINTER:         tc = pointer_type_class; goto make_const;
3166                         case TYPE_COMPOUND_STRUCT: tc = record_type_class;  goto make_const;
3167                         case TYPE_COMPOUND_UNION:  tc = union_type_class;   goto make_const;
3168
3169                         /* gcc handles this as integer */
3170                         case TYPE_ENUM:            tc = integer_type_class; goto make_const;
3171
3172                         /* gcc classifies the referenced type */
3173                         case TYPE_REFERENCE: type = type->reference.refers_to; continue;
3174
3175                         /* typedef/typeof should be skipped already */
3176                         case TYPE_TYPEDEF:
3177                         case TYPE_TYPEOF:
3178                         case TYPE_ERROR:
3179                                 break;
3180                 }
3181                 panic("unexpected TYPE classify_type_to_firm().");
3182         }
3183
3184 make_const:;
3185         dbg_info  *const dbgi = get_dbg_info(&expr->base.source_position);
3186         ir_tarval *const tv   = new_tarval_from_long(tc, mode_int);
3187         return new_d_Const(dbgi, tv);
3188 }
3189
3190 static ir_node *function_name_to_firm(
3191                 const funcname_expression_t *const expr)
3192 {
3193         switch(expr->kind) {
3194         case FUNCNAME_FUNCTION:
3195         case FUNCNAME_PRETTY_FUNCTION:
3196         case FUNCNAME_FUNCDNAME:
3197                 if (current_function_name == NULL) {
3198                         const source_position_t *const src_pos = &expr->base.source_position;
3199                         const char    *name  = current_function_entity->base.symbol->string;
3200                         const string_t string = { name, strlen(name) + 1 };
3201                         current_function_name = string_to_firm(src_pos, "__func__.%u", &string);
3202                 }
3203                 return current_function_name;
3204         case FUNCNAME_FUNCSIG:
3205                 if (current_funcsig == NULL) {
3206                         const source_position_t *const src_pos = &expr->base.source_position;
3207                         ir_entity *ent = get_irg_entity(current_ir_graph);
3208                         const char *const name = get_entity_ld_name(ent);
3209                         const string_t string = { name, strlen(name) + 1 };
3210                         current_funcsig = string_to_firm(src_pos, "__FUNCSIG__.%u", &string);
3211                 }
3212                 return current_funcsig;
3213         }
3214         panic("Unsupported function name");
3215 }
3216
3217 static ir_node *statement_expression_to_firm(const statement_expression_t *expr)
3218 {
3219         statement_t *statement = expr->statement;
3220
3221         assert(statement->kind == STATEMENT_COMPOUND);
3222         return compound_statement_to_firm(&statement->compound);
3223 }
3224
3225 static ir_node *va_start_expression_to_firm(
3226         const va_start_expression_t *const expr)
3227 {
3228         ir_entity *param_ent = current_vararg_entity;
3229         if (param_ent == NULL) {
3230                 size_t   const n           = IR_VA_START_PARAMETER_NUMBER;
3231                 ir_type *const frame_type  = get_irg_frame_type(current_ir_graph);
3232                 ir_type *const param_type  = get_unknown_type();
3233                 param_ent = new_parameter_entity(frame_type, n, param_type);
3234                 current_vararg_entity = param_ent;
3235         }
3236
3237         ir_node  *const frame   = get_irg_frame(current_ir_graph);
3238         dbg_info *const dbgi    = get_dbg_info(&expr->base.source_position);
3239         ir_node  *const no_mem  = new_NoMem();
3240         ir_node  *const arg_sel = new_d_simpleSel(dbgi, no_mem, frame, param_ent);
3241
3242         set_value_for_expression(expr->ap, arg_sel);
3243
3244         return NULL;
3245 }
3246
3247 static ir_node *va_arg_expression_to_firm(const va_arg_expression_t *const expr)
3248 {
3249         type_t       *const type    = expr->base.type;
3250         expression_t *const ap_expr = expr->ap;
3251         ir_node      *const ap_addr = expression_to_addr(ap_expr);
3252         ir_node      *const ap      = get_value_from_lvalue(ap_expr, ap_addr);
3253         dbg_info     *const dbgi    = get_dbg_info(&expr->base.source_position);
3254         ir_node      *const res     = deref_address(dbgi, type, ap);
3255
3256         ir_node      *const cnst    = get_type_size_node(expr->base.type);
3257         ir_mode      *const mode    = get_irn_mode(cnst);
3258         ir_node      *const c1      = new_Const_long(mode, stack_param_align - 1);
3259         ir_node      *const c2      = new_d_Add(dbgi, cnst, c1, mode);
3260         ir_node      *const c3      = new_Const_long(mode, -(long)stack_param_align);
3261         ir_node      *const c4      = new_d_And(dbgi, c2, c3, mode);
3262         ir_node      *const add     = new_d_Add(dbgi, ap, c4, mode_P_data);
3263
3264         set_value_for_expression_addr(ap_expr, add, ap_addr);
3265
3266         return res;
3267 }
3268
3269 /**
3270  * Generate Firm for a va_copy expression.
3271  */
3272 static ir_node *va_copy_expression_to_firm(const va_copy_expression_t *const expr)
3273 {
3274         ir_node *const src = expression_to_firm(expr->src);
3275         set_value_for_expression(expr->dst, src);
3276         return NULL;
3277 }
3278
3279 static ir_node *dereference_addr(const unary_expression_t *const expression)
3280 {
3281         assert(expression->base.kind == EXPR_UNARY_DEREFERENCE);
3282         return expression_to_firm(expression->value);
3283 }
3284
3285 /**
3286  * Returns a IR-node representing an lvalue of the given expression.
3287  */
3288 static ir_node *expression_to_addr(const expression_t *expression)
3289 {
3290         switch(expression->kind) {
3291         case EXPR_ARRAY_ACCESS:
3292                 return array_access_addr(&expression->array_access);
3293         case EXPR_CALL:
3294                 return call_expression_to_firm(&expression->call);
3295         case EXPR_COMPOUND_LITERAL:
3296                 return compound_literal_to_firm(&expression->compound_literal);
3297         case EXPR_REFERENCE:
3298                 return reference_addr(&expression->reference);
3299         case EXPR_SELECT:
3300                 return select_addr(&expression->select);
3301         case EXPR_UNARY_DEREFERENCE:
3302                 return dereference_addr(&expression->unary);
3303         default:
3304                 break;
3305         }
3306         panic("trying to get address of non-lvalue");
3307 }
3308
3309 static ir_node *builtin_constant_to_firm(
3310                 const builtin_constant_expression_t *expression)
3311 {
3312         ir_mode *const mode = get_ir_mode_arithmetic(expression->base.type);
3313         bool     const v    = is_constant_expression(expression->value) == EXPR_CLASS_CONSTANT;
3314         return create_Const_from_bool(mode, v);
3315 }
3316
3317 static ir_node *builtin_types_compatible_to_firm(
3318                 const builtin_types_compatible_expression_t *expression)
3319 {
3320         type_t  *const left  = get_unqualified_type(skip_typeref(expression->left));
3321         type_t  *const right = get_unqualified_type(skip_typeref(expression->right));
3322         bool     const value = types_compatible(left, right);
3323         ir_mode *const mode  = get_ir_mode_arithmetic(expression->base.type);
3324         return create_Const_from_bool(mode, value);
3325 }
3326
3327 static ir_node *get_label_block(label_t *label)
3328 {
3329         if (label->block != NULL)
3330                 return label->block;
3331
3332         /* beware: might be called from create initializer with current_ir_graph
3333          * set to const_code_irg. */
3334         ir_graph *rem    = current_ir_graph;
3335         current_ir_graph = current_function;
3336
3337         ir_node *block = new_immBlock();
3338
3339         label->block = block;
3340
3341         ARR_APP1(label_t *, all_labels, label);
3342
3343         current_ir_graph = rem;
3344         return block;
3345 }
3346
3347 /**
3348  * Pointer to a label.  This is used for the
3349  * GNU address-of-label extension.
3350  */
3351 static ir_node *label_address_to_firm(const label_address_expression_t *label)
3352 {
3353         dbg_info  *dbgi   = get_dbg_info(&label->base.source_position);
3354         ir_node   *block  = get_label_block(label->label);
3355         ir_entity *entity = create_Block_entity(block);
3356
3357         symconst_symbol value;
3358         value.entity_p = entity;
3359         return new_d_SymConst(dbgi, mode_P_code, value, symconst_addr_ent);
3360 }
3361
3362 static ir_node *error_to_firm(const expression_t *expression)
3363 {
3364         ir_mode *mode = get_ir_mode_arithmetic(expression->base.type);
3365         return new_Bad(mode);
3366 }
3367
3368 /**
3369  * creates firm nodes for an expression. The difference between this function
3370  * and expression_to_firm is, that this version might produce mode_b nodes
3371  * instead of mode_Is.
3372  */
3373 static ir_node *_expression_to_firm(const expression_t *expression)
3374 {
3375 #ifndef NDEBUG
3376         if (!constant_folding) {
3377                 assert(!expression->base.transformed);
3378                 ((expression_t*) expression)->base.transformed = true;
3379         }
3380 #endif
3381
3382         switch (expression->kind) {
3383         EXPR_LITERAL_CASES
3384                 return literal_to_firm(&expression->literal);
3385         case EXPR_STRING_LITERAL:
3386                 return string_to_firm(&expression->base.source_position, "str.%u",
3387                                       &expression->literal.value);
3388         case EXPR_WIDE_STRING_LITERAL:
3389                 return wide_string_literal_to_firm(&expression->string_literal);
3390         case EXPR_REFERENCE:
3391                 return reference_expression_to_firm(&expression->reference);
3392         case EXPR_REFERENCE_ENUM_VALUE:
3393                 return reference_expression_enum_value_to_firm(&expression->reference);
3394         case EXPR_CALL:
3395                 return call_expression_to_firm(&expression->call);
3396         EXPR_UNARY_CASES
3397                 return unary_expression_to_firm(&expression->unary);
3398         EXPR_BINARY_CASES
3399                 return binary_expression_to_firm(&expression->binary);
3400         case EXPR_ARRAY_ACCESS:
3401                 return array_access_to_firm(&expression->array_access);
3402         case EXPR_SIZEOF:
3403                 return sizeof_to_firm(&expression->typeprop);
3404         case EXPR_ALIGNOF:
3405                 return alignof_to_firm(&expression->typeprop);
3406         case EXPR_CONDITIONAL:
3407                 return conditional_to_firm(&expression->conditional);
3408         case EXPR_SELECT:
3409                 return select_to_firm(&expression->select);
3410         case EXPR_CLASSIFY_TYPE:
3411                 return classify_type_to_firm(&expression->classify_type);
3412         case EXPR_FUNCNAME:
3413                 return function_name_to_firm(&expression->funcname);
3414         case EXPR_STATEMENT:
3415                 return statement_expression_to_firm(&expression->statement);
3416         case EXPR_VA_START:
3417                 return va_start_expression_to_firm(&expression->va_starte);
3418         case EXPR_VA_ARG:
3419                 return va_arg_expression_to_firm(&expression->va_arge);
3420         case EXPR_VA_COPY:
3421                 return va_copy_expression_to_firm(&expression->va_copye);
3422         case EXPR_BUILTIN_CONSTANT_P:
3423                 return builtin_constant_to_firm(&expression->builtin_constant);
3424         case EXPR_BUILTIN_TYPES_COMPATIBLE_P:
3425                 return builtin_types_compatible_to_firm(&expression->builtin_types_compatible);
3426         case EXPR_OFFSETOF:
3427                 return offsetof_to_firm(&expression->offsetofe);
3428         case EXPR_COMPOUND_LITERAL:
3429                 return compound_literal_to_firm(&expression->compound_literal);
3430         case EXPR_LABEL_ADDRESS:
3431                 return label_address_to_firm(&expression->label_address);
3432
3433         case EXPR_ERROR:
3434                 return error_to_firm(expression);
3435         }
3436         panic("invalid expression found");
3437 }
3438
3439 /**
3440  * Check if a given expression is a GNU __builtin_expect() call.
3441  */
3442 static bool is_builtin_expect(const expression_t *expression)
3443 {
3444         if (expression->kind != EXPR_CALL)
3445                 return false;
3446
3447         expression_t *function = expression->call.function;
3448         if (function->kind != EXPR_REFERENCE)
3449                 return false;
3450         reference_expression_t *ref = &function->reference;
3451         if (ref->entity->kind         != ENTITY_FUNCTION ||
3452             ref->entity->function.btk != BUILTIN_EXPECT)
3453                 return false;
3454
3455         return true;
3456 }
3457
3458 static bool produces_mode_b(const expression_t *expression)
3459 {
3460         switch (expression->kind) {
3461         case EXPR_BINARY_EQUAL:
3462         case EXPR_BINARY_NOTEQUAL:
3463         case EXPR_BINARY_LESS:
3464         case EXPR_BINARY_LESSEQUAL:
3465         case EXPR_BINARY_GREATER:
3466         case EXPR_BINARY_GREATEREQUAL:
3467         case EXPR_BINARY_ISGREATER:
3468         case EXPR_BINARY_ISGREATEREQUAL:
3469         case EXPR_BINARY_ISLESS:
3470         case EXPR_BINARY_ISLESSEQUAL:
3471         case EXPR_BINARY_ISLESSGREATER:
3472         case EXPR_BINARY_ISUNORDERED:
3473         case EXPR_UNARY_NOT:
3474                 return true;
3475
3476         case EXPR_CALL:
3477                 if (is_builtin_expect(expression)) {
3478                         expression_t *argument = expression->call.arguments->expression;
3479                         return produces_mode_b(argument);
3480                 }
3481                 return false;
3482         case EXPR_BINARY_COMMA:
3483                 return produces_mode_b(expression->binary.right);
3484
3485         default:
3486                 return false;
3487         }
3488 }
3489
3490 static ir_node *expression_to_firm(const expression_t *expression)
3491 {
3492         if (!produces_mode_b(expression)) {
3493                 ir_node *res = _expression_to_firm(expression);
3494                 assert(res == NULL || get_irn_mode(res) != mode_b);
3495                 return res;
3496         }
3497
3498         if (is_constant_expression(expression) == EXPR_CLASS_CONSTANT) {
3499                 bool const constant_folding_old = constant_folding;
3500                 constant_folding = true;
3501                 ir_node *res  = _expression_to_firm(expression);
3502                 constant_folding = constant_folding_old;
3503                 ir_mode *mode = get_ir_mode_arithmetic(expression->base.type);
3504                 assert(is_Const(res));
3505                 return create_Const_from_bool(mode, !is_Const_null(res));
3506         }
3507
3508         /* we have to produce a 0/1 from the mode_b expression */
3509         dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
3510         ir_mode  *mode = get_ir_mode_arithmetic(expression->base.type);
3511         return produce_condition_result(expression, mode, dbgi);
3512 }
3513
3514 /**
3515  * create a short-circuit expression evaluation that tries to construct
3516  * efficient control flow structures for &&, || and ! expressions
3517  */
3518 static ir_node *create_condition_evaluation(const expression_t *expression,
3519                                             ir_node *true_block,
3520                                             ir_node *false_block)
3521 {
3522         switch(expression->kind) {
3523         case EXPR_UNARY_NOT: {
3524                 const unary_expression_t *unary_expression = &expression->unary;
3525                 create_condition_evaluation(unary_expression->value, false_block,
3526                                             true_block);
3527                 return NULL;
3528         }
3529         case EXPR_BINARY_LOGICAL_AND: {
3530                 const binary_expression_t *binary_expression = &expression->binary;
3531
3532                 ir_node *extra_block = new_immBlock();
3533                 create_condition_evaluation(binary_expression->left, extra_block,
3534                                             false_block);
3535                 mature_immBlock(extra_block);
3536                 set_cur_block(extra_block);
3537                 create_condition_evaluation(binary_expression->right, true_block,
3538                                             false_block);
3539                 return NULL;
3540         }
3541         case EXPR_BINARY_LOGICAL_OR: {
3542                 const binary_expression_t *binary_expression = &expression->binary;
3543
3544                 ir_node *extra_block = new_immBlock();
3545                 create_condition_evaluation(binary_expression->left, true_block,
3546                                             extra_block);
3547                 mature_immBlock(extra_block);
3548                 set_cur_block(extra_block);
3549                 create_condition_evaluation(binary_expression->right, true_block,
3550                                             false_block);
3551                 return NULL;
3552         }
3553         default:
3554                 break;
3555         }
3556
3557         dbg_info *dbgi       = get_dbg_info(&expression->base.source_position);
3558         ir_node  *cond_expr  = _expression_to_firm(expression);
3559         ir_node  *condition  = create_conv(dbgi, cond_expr, mode_b);
3560         ir_node  *cond       = new_d_Cond(dbgi, condition);
3561         ir_node  *true_proj  = new_d_Proj(dbgi, cond, mode_X, pn_Cond_true);
3562         ir_node  *false_proj = new_d_Proj(dbgi, cond, mode_X, pn_Cond_false);
3563
3564         /* set branch prediction info based on __builtin_expect */
3565         if (is_builtin_expect(expression) && is_Cond(cond)) {
3566                 call_argument_t *argument = expression->call.arguments->next;
3567                 if (is_constant_expression(argument->expression) == EXPR_CLASS_CONSTANT) {
3568                         bool               const cnst = fold_constant_to_bool(argument->expression);
3569                         cond_jmp_predicate const pred = cnst ? COND_JMP_PRED_TRUE : COND_JMP_PRED_FALSE;
3570                         set_Cond_jmp_pred(cond, pred);
3571                 }
3572         }
3573
3574         add_immBlock_pred(true_block, true_proj);
3575         add_immBlock_pred(false_block, false_proj);
3576
3577         set_unreachable_now();
3578         return cond_expr;
3579 }
3580
3581 static void create_variable_entity(entity_t *variable,
3582                                    declaration_kind_t declaration_kind,
3583                                    ir_type *parent_type)
3584 {
3585         assert(variable->kind == ENTITY_VARIABLE);
3586         type_t    *type = skip_typeref(variable->declaration.type);
3587
3588         ident     *const id        = new_id_from_str(variable->base.symbol->string);
3589         ir_type   *const irtype    = get_ir_type(type);
3590         dbg_info  *const dbgi      = get_dbg_info(&variable->base.source_position);
3591         ir_entity *const irentity  = new_d_entity(parent_type, id, irtype, dbgi);
3592         unsigned         alignment = variable->declaration.alignment;
3593
3594         set_entity_alignment(irentity, alignment);
3595
3596         handle_decl_modifiers(irentity, variable);
3597
3598         variable->declaration.kind  = (unsigned char) declaration_kind;
3599         variable->variable.v.entity = irentity;
3600         set_entity_ld_ident(irentity, create_ld_ident(variable));
3601
3602         if (type->base.qualifiers & TYPE_QUALIFIER_VOLATILE) {
3603                 set_entity_volatility(irentity, volatility_is_volatile);
3604         }
3605 }
3606
3607
3608 typedef struct type_path_entry_t type_path_entry_t;
3609 struct type_path_entry_t {
3610         type_t           *type;
3611         ir_initializer_t *initializer;
3612         size_t            index;
3613         entity_t         *compound_entry;
3614 };
3615
3616 typedef struct type_path_t type_path_t;
3617 struct type_path_t {
3618         type_path_entry_t *path;
3619         type_t            *top_type;
3620         bool               invalid;
3621 };
3622
3623 static __attribute__((unused)) void debug_print_type_path(const type_path_t *path)
3624 {
3625         size_t len = ARR_LEN(path->path);
3626
3627         for (size_t i = 0; i < len; ++i) {
3628                 const type_path_entry_t *entry = & path->path[i];
3629
3630                 type_t *type = skip_typeref(entry->type);
3631                 if (is_type_compound(type)) {
3632                         fprintf(stderr, ".%s", entry->compound_entry->base.symbol->string);
3633                 } else if (is_type_array(type)) {
3634                         fprintf(stderr, "[%u]", (unsigned) entry->index);
3635                 } else {
3636                         fprintf(stderr, "-INVALID-");
3637                 }
3638         }
3639         fprintf(stderr, "  (");
3640         print_type(path->top_type);
3641         fprintf(stderr, ")");
3642 }
3643
3644 static type_path_entry_t *get_type_path_top(const type_path_t *path)
3645 {
3646         size_t len = ARR_LEN(path->path);
3647         assert(len > 0);
3648         return & path->path[len-1];
3649 }
3650
3651 static type_path_entry_t *append_to_type_path(type_path_t *path)
3652 {
3653         size_t len = ARR_LEN(path->path);
3654         ARR_RESIZE(type_path_entry_t, path->path, len+1);
3655
3656         type_path_entry_t *result = & path->path[len];
3657         memset(result, 0, sizeof(result[0]));
3658         return result;
3659 }
3660
3661 static size_t get_compound_member_count(const compound_type_t *type)
3662 {
3663         compound_t *compound  = type->compound;
3664         size_t      n_members = 0;
3665         entity_t   *member    = compound->members.entities;
3666         for ( ; member != NULL; member = member->base.next) {
3667                 ++n_members;
3668         }
3669
3670         return n_members;
3671 }
3672
3673 static ir_initializer_t *get_initializer_entry(type_path_t *path)
3674 {
3675         type_t *orig_top_type = path->top_type;
3676         type_t *top_type      = skip_typeref(orig_top_type);
3677
3678         assert(is_type_compound(top_type) || is_type_array(top_type));
3679
3680         if (ARR_LEN(path->path) == 0) {
3681                 return NULL;
3682         } else {
3683                 type_path_entry_t *top         = get_type_path_top(path);
3684                 ir_initializer_t  *initializer = top->initializer;
3685                 return get_initializer_compound_value(initializer, top->index);
3686         }
3687 }
3688
3689 static void descend_into_subtype(type_path_t *path)
3690 {
3691         type_t *orig_top_type = path->top_type;
3692         type_t *top_type      = skip_typeref(orig_top_type);
3693
3694         assert(is_type_compound(top_type) || is_type_array(top_type));
3695
3696         ir_initializer_t *initializer = get_initializer_entry(path);
3697
3698         type_path_entry_t *top = append_to_type_path(path);
3699         top->type              = top_type;
3700
3701         size_t len;
3702
3703         if (is_type_compound(top_type)) {
3704                 compound_t *const compound = top_type->compound.compound;
3705                 entity_t   *const entry    = skip_unnamed_bitfields(compound->members.entities);
3706
3707                 top->compound_entry = entry;
3708                 top->index          = 0;
3709                 len                 = get_compound_member_count(&top_type->compound);
3710                 if (entry != NULL) {
3711                         assert(entry->kind == ENTITY_COMPOUND_MEMBER);
3712                         path->top_type = entry->declaration.type;
3713                 }
3714         } else {
3715                 assert(is_type_array(top_type));
3716                 assert(top_type->array.size > 0);
3717
3718                 top->index     = 0;
3719                 path->top_type = top_type->array.element_type;
3720                 len            = top_type->array.size;
3721         }
3722         if (initializer == NULL
3723                         || get_initializer_kind(initializer) == IR_INITIALIZER_NULL) {
3724                 initializer = create_initializer_compound(len);
3725                 /* we have to set the entry at the 2nd latest path entry... */
3726                 size_t path_len = ARR_LEN(path->path);
3727                 assert(path_len >= 1);
3728                 if (path_len > 1) {
3729                         type_path_entry_t *entry        = & path->path[path_len-2];
3730                         ir_initializer_t  *tinitializer = entry->initializer;
3731                         set_initializer_compound_value(tinitializer, entry->index,
3732                                                        initializer);
3733                 }
3734         }
3735         top->initializer = initializer;
3736 }
3737
3738 static void ascend_from_subtype(type_path_t *path)
3739 {
3740         type_path_entry_t *top = get_type_path_top(path);
3741
3742         path->top_type = top->type;
3743
3744         size_t len = ARR_LEN(path->path);
3745         ARR_RESIZE(type_path_entry_t, path->path, len-1);
3746 }
3747
3748 static void walk_designator(type_path_t *path, const designator_t *designator)
3749 {
3750         /* designators start at current object type */
3751         ARR_RESIZE(type_path_entry_t, path->path, 1);
3752
3753         for ( ; designator != NULL; designator = designator->next) {
3754                 type_path_entry_t *top         = get_type_path_top(path);
3755                 type_t            *orig_type   = top->type;
3756                 type_t            *type        = skip_typeref(orig_type);
3757
3758                 if (designator->symbol != NULL) {
3759                         assert(is_type_compound(type));
3760                         size_t    index  = 0;
3761                         symbol_t *symbol = designator->symbol;
3762
3763                         compound_t *compound = type->compound.compound;
3764                         entity_t   *iter     = compound->members.entities;
3765                         for ( ; iter != NULL; iter = iter->base.next, ++index) {
3766                                 if (iter->base.symbol == symbol) {
3767                                         assert(iter->kind == ENTITY_COMPOUND_MEMBER);
3768                                         break;
3769                                 }
3770                         }
3771                         assert(iter != NULL);
3772
3773                         /* revert previous initialisations of other union elements */
3774                         if (type->kind == TYPE_COMPOUND_UNION) {
3775                                 ir_initializer_t *initializer = top->initializer;
3776                                 if (initializer != NULL
3777                                         && get_initializer_kind(initializer) == IR_INITIALIZER_COMPOUND) {
3778                                         /* are we writing to a new element? */
3779                                         ir_initializer_t *oldi
3780                                                 = get_initializer_compound_value(initializer, index);
3781                                         if (get_initializer_kind(oldi) == IR_INITIALIZER_NULL) {
3782                                                 /* clear initializer */
3783                                                 size_t len
3784                                                         = get_initializer_compound_n_entries(initializer);
3785                                                 ir_initializer_t *nulli = get_initializer_null();
3786                                                 for (size_t i = 0; i < len; ++i) {
3787                                                         set_initializer_compound_value(initializer, i,
3788                                                                                        nulli);
3789                                                 }
3790                                         }
3791                                 }
3792                         }
3793
3794                         top->type           = orig_type;
3795                         top->compound_entry = iter;
3796                         top->index          = index;
3797                         orig_type           = iter->declaration.type;
3798                 } else {
3799                         expression_t *array_index = designator->array_index;
3800                         assert(designator->array_index != NULL);
3801                         assert(is_type_array(type));
3802
3803                         long index = fold_constant_to_int(array_index);
3804                         assert(index >= 0);
3805 #ifndef NDEBUG
3806                         if (type->array.size_constant) {
3807                                 long array_size = type->array.size;
3808                                 assert(index < array_size);
3809                         }
3810 #endif
3811
3812                         top->type  = orig_type;
3813                         top->index = (size_t) index;
3814                         orig_type  = type->array.element_type;
3815                 }
3816                 path->top_type = orig_type;
3817
3818                 if (designator->next != NULL) {
3819                         descend_into_subtype(path);
3820                 }
3821         }
3822
3823         path->invalid  = false;
3824 }
3825
3826 static void advance_current_object(type_path_t *path)
3827 {
3828         if (path->invalid) {
3829                 /* TODO: handle this... */
3830                 panic("invalid initializer in ast2firm (excessive elements)");
3831         }
3832
3833         type_path_entry_t *top = get_type_path_top(path);
3834
3835         type_t *type = skip_typeref(top->type);
3836         if (is_type_union(type)) {
3837                 /* only the first element is initialized in unions */
3838                 top->compound_entry = NULL;
3839         } else if (is_type_struct(type)) {
3840                 entity_t *entry = top->compound_entry;
3841
3842                 top->index++;
3843                 entry               = skip_unnamed_bitfields(entry->base.next);
3844                 top->compound_entry = entry;
3845                 if (entry != NULL) {
3846                         assert(entry->kind == ENTITY_COMPOUND_MEMBER);
3847                         path->top_type = entry->declaration.type;
3848                         return;
3849                 }
3850         } else {
3851                 assert(is_type_array(type));
3852
3853                 top->index++;
3854                 if (!type->array.size_constant || top->index < type->array.size) {
3855                         return;
3856                 }
3857         }
3858
3859         /* we're past the last member of the current sub-aggregate, try if we
3860          * can ascend in the type hierarchy and continue with another subobject */
3861         size_t len = ARR_LEN(path->path);
3862
3863         if (len > 1) {
3864                 ascend_from_subtype(path);
3865                 advance_current_object(path);
3866         } else {
3867                 path->invalid = true;
3868         }
3869 }
3870
3871
3872 static ir_initializer_t *create_ir_initializer(
3873                 const initializer_t *initializer, type_t *type);
3874
3875 static ir_initializer_t *create_ir_initializer_value(
3876                 const initializer_value_t *initializer)
3877 {
3878         if (is_type_compound(initializer->value->base.type)) {
3879                 panic("initializer creation for compounds not implemented yet");
3880         }
3881         type_t       *type = initializer->value->base.type;
3882         expression_t *expr = initializer->value;
3883         ir_node *value = expression_to_firm(expr);
3884         ir_mode *mode  = get_ir_mode_storage(type);
3885         value          = create_conv(NULL, value, mode);
3886         return create_initializer_const(value);
3887 }
3888
3889 /** test wether type can be initialized by a string constant */
3890 static bool is_string_type(type_t *type)
3891 {
3892         type_t *inner;
3893         if (is_type_pointer(type)) {
3894                 inner = skip_typeref(type->pointer.points_to);
3895         } else if(is_type_array(type)) {
3896                 inner = skip_typeref(type->array.element_type);
3897         } else {
3898                 return false;
3899         }
3900
3901         return is_type_integer(inner);
3902 }
3903
3904 static ir_initializer_t *create_ir_initializer_list(
3905                 const initializer_list_t *initializer, type_t *type)
3906 {
3907         type_path_t path;
3908         memset(&path, 0, sizeof(path));
3909         path.top_type = type;
3910         path.path     = NEW_ARR_F(type_path_entry_t, 0);
3911
3912         descend_into_subtype(&path);
3913
3914         for (size_t i = 0; i < initializer->len; ++i) {
3915                 const initializer_t *sub_initializer = initializer->initializers[i];
3916
3917                 if (sub_initializer->kind == INITIALIZER_DESIGNATOR) {
3918                         walk_designator(&path, sub_initializer->designator.designator);
3919                         continue;
3920                 }
3921
3922                 if (sub_initializer->kind == INITIALIZER_VALUE) {
3923                         /* we might have to descend into types until we're at a scalar
3924                          * type */
3925                         while(true) {
3926                                 type_t *orig_top_type = path.top_type;
3927                                 type_t *top_type      = skip_typeref(orig_top_type);
3928
3929                                 if (is_type_scalar(top_type))
3930                                         break;
3931                                 descend_into_subtype(&path);
3932                         }
3933                 } else if (sub_initializer->kind == INITIALIZER_STRING
3934                                 || sub_initializer->kind == INITIALIZER_WIDE_STRING) {
3935                         /* we might have to descend into types until we're at a scalar
3936                          * type */
3937                         while (true) {
3938                                 type_t *orig_top_type = path.top_type;
3939                                 type_t *top_type      = skip_typeref(orig_top_type);
3940
3941                                 if (is_string_type(top_type))
3942                                         break;
3943                                 descend_into_subtype(&path);
3944                         }
3945                 }
3946
3947                 ir_initializer_t *sub_irinitializer
3948                         = create_ir_initializer(sub_initializer, path.top_type);
3949
3950                 size_t path_len = ARR_LEN(path.path);
3951                 assert(path_len >= 1);
3952                 type_path_entry_t *entry        = & path.path[path_len-1];
3953                 ir_initializer_t  *tinitializer = entry->initializer;
3954                 set_initializer_compound_value(tinitializer, entry->index,
3955                                                sub_irinitializer);
3956
3957                 advance_current_object(&path);
3958         }
3959
3960         assert(ARR_LEN(path.path) >= 1);
3961         ir_initializer_t *result = path.path[0].initializer;
3962         DEL_ARR_F(path.path);
3963
3964         return result;
3965 }
3966
3967 static ir_initializer_t *create_ir_initializer_string(
3968                 const initializer_string_t *initializer, type_t *type)
3969 {
3970         type = skip_typeref(type);
3971
3972         size_t            string_len    = initializer->string.size;
3973         assert(type->kind == TYPE_ARRAY);
3974         assert(type->array.size_constant);
3975         size_t            len           = type->array.size;
3976         ir_initializer_t *irinitializer = create_initializer_compound(len);
3977
3978         const char *string = initializer->string.begin;
3979         ir_mode    *mode   = get_ir_mode_storage(type->array.element_type);
3980
3981         for (size_t i = 0; i < len; ++i) {
3982                 char c = 0;
3983                 if (i < string_len)
3984                         c = string[i];
3985
3986                 ir_tarval        *tv = new_tarval_from_long(c, mode);
3987                 ir_initializer_t *char_initializer = create_initializer_tarval(tv);
3988
3989                 set_initializer_compound_value(irinitializer, i, char_initializer);
3990         }
3991
3992         return irinitializer;
3993 }
3994
3995 static ir_initializer_t *create_ir_initializer_wide_string(
3996                 const initializer_wide_string_t *initializer, type_t *type)
3997 {
3998         assert(type->kind == TYPE_ARRAY);
3999         assert(type->array.size_constant);
4000         size_t            len           = type->array.size;
4001         size_t            string_len    = wstrlen(&initializer->string);
4002         ir_initializer_t *irinitializer = create_initializer_compound(len);
4003
4004         const char *p    = initializer->string.begin;
4005         ir_mode    *mode = get_type_mode(ir_type_wchar_t);
4006
4007         for (size_t i = 0; i < len; ++i) {
4008                 utf32 c = 0;
4009                 if (i < string_len) {
4010                         c = read_utf8_char(&p);
4011                 }
4012                 ir_tarval *tv = new_tarval_from_long(c, mode);
4013                 ir_initializer_t *char_initializer = create_initializer_tarval(tv);
4014
4015                 set_initializer_compound_value(irinitializer, i, char_initializer);
4016         }
4017
4018         return irinitializer;
4019 }
4020
4021 static ir_initializer_t *create_ir_initializer(
4022                 const initializer_t *initializer, type_t *type)
4023 {
4024         switch(initializer->kind) {
4025                 case INITIALIZER_STRING:
4026                         return create_ir_initializer_string(&initializer->string, type);
4027
4028                 case INITIALIZER_WIDE_STRING:
4029                         return create_ir_initializer_wide_string(&initializer->wide_string,
4030                                                                  type);
4031
4032                 case INITIALIZER_LIST:
4033                         return create_ir_initializer_list(&initializer->list, type);
4034
4035                 case INITIALIZER_VALUE:
4036                         return create_ir_initializer_value(&initializer->value);
4037
4038                 case INITIALIZER_DESIGNATOR:
4039                         panic("unexpected designator initializer found");
4040         }
4041         panic("unknown initializer");
4042 }
4043
4044 /** ANSI C ยง6.7.8:21: If there are fewer initializers [..] than there
4045  *  are elements [...] the remainder of the aggregate shall be initialized
4046  *  implicitly the same as objects that have static storage duration. */
4047 static void create_dynamic_null_initializer(ir_entity *entity, dbg_info *dbgi,
4048                 ir_node *base_addr)
4049 {
4050         /* for unions we must NOT do anything for null initializers */
4051         ir_type *owner = get_entity_owner(entity);
4052         if (is_Union_type(owner)) {
4053                 return;
4054         }
4055
4056         ir_type *ent_type = get_entity_type(entity);
4057         /* create sub-initializers for a compound type */
4058         if (is_compound_type(ent_type)) {
4059                 unsigned n_members = get_compound_n_members(ent_type);
4060                 for (unsigned n = 0; n < n_members; ++n) {
4061                         ir_entity *member = get_compound_member(ent_type, n);
4062                         ir_node   *addr   = new_d_simpleSel(dbgi, new_NoMem(), base_addr,
4063                                                                 member);
4064                         create_dynamic_null_initializer(member, dbgi, addr);
4065                 }
4066                 return;
4067         }
4068         if (is_Array_type(ent_type)) {
4069                 assert(has_array_upper_bound(ent_type, 0));
4070                 long n = get_array_upper_bound_int(ent_type, 0);
4071                 for (long i = 0; i < n; ++i) {
4072                         ir_tarval *index_tv = new_tarval_from_long(i, mode_uint);
4073                         ir_node   *cnst     = new_d_Const(dbgi, index_tv);
4074                         ir_node   *in[1]    = { cnst };
4075                         ir_entity *arrent   = get_array_element_entity(ent_type);
4076                         ir_node   *addr     = new_d_Sel(dbgi, new_NoMem(), base_addr, 1, in,
4077                                                         arrent);
4078                         create_dynamic_null_initializer(arrent, dbgi, addr);
4079                 }
4080                 return;
4081         }
4082
4083         ir_mode *value_mode = get_type_mode(ent_type);
4084         ir_node *node       = new_Const(get_mode_null(value_mode));
4085
4086         /* is it a bitfield type? */
4087         if (is_Primitive_type(ent_type) &&
4088                         get_primitive_base_type(ent_type) != NULL) {
4089                 bitfield_store_to_firm(dbgi, entity, base_addr, node, false);
4090                 return;
4091         }
4092
4093         ir_node *mem    = get_store();
4094         ir_node *store  = new_d_Store(dbgi, mem, base_addr, node, cons_none);
4095         ir_node *proj_m = new_Proj(store, mode_M, pn_Store_M);
4096         set_store(proj_m);
4097 }
4098
4099 static void create_dynamic_initializer_sub(ir_initializer_t *initializer,
4100                 ir_entity *entity, ir_type *type, dbg_info *dbgi, ir_node *base_addr)
4101 {
4102         switch(get_initializer_kind(initializer)) {
4103         case IR_INITIALIZER_NULL:
4104                 create_dynamic_null_initializer(entity, dbgi, base_addr);
4105                 return;
4106         case IR_INITIALIZER_CONST: {
4107                 ir_node *node     = get_initializer_const_value(initializer);
4108                 ir_type *ent_type = get_entity_type(entity);
4109
4110                 /* is it a bitfield type? */
4111                 if (is_Primitive_type(ent_type) &&
4112                                 get_primitive_base_type(ent_type) != NULL) {
4113                         bitfield_store_to_firm(dbgi, entity, base_addr, node, false);
4114                         return;
4115                 }
4116
4117                 assert(get_type_mode(type) == get_irn_mode(node));
4118                 ir_node *mem    = get_store();
4119                 ir_node *store  = new_d_Store(dbgi, mem, base_addr, node, cons_none);
4120                 ir_node *proj_m = new_Proj(store, mode_M, pn_Store_M);
4121                 set_store(proj_m);
4122                 return;
4123         }
4124         case IR_INITIALIZER_TARVAL: {
4125                 ir_tarval *tv       = get_initializer_tarval_value(initializer);
4126                 ir_node   *cnst     = new_d_Const(dbgi, tv);
4127                 ir_type   *ent_type = get_entity_type(entity);
4128
4129                 /* is it a bitfield type? */
4130                 if (is_Primitive_type(ent_type) &&
4131                                 get_primitive_base_type(ent_type) != NULL) {
4132                         bitfield_store_to_firm(dbgi, entity, base_addr, cnst, false);
4133                         return;
4134                 }
4135
4136                 assert(get_type_mode(type) == get_tarval_mode(tv));
4137                 ir_node *mem    = get_store();
4138                 ir_node *store  = new_d_Store(dbgi, mem, base_addr, cnst, cons_none);
4139                 ir_node *proj_m = new_Proj(store, mode_M, pn_Store_M);
4140                 set_store(proj_m);
4141                 return;
4142         }
4143         case IR_INITIALIZER_COMPOUND: {
4144                 assert(is_compound_type(type) || is_Array_type(type));
4145                 int n_members;
4146                 if (is_Array_type(type)) {
4147                         assert(has_array_upper_bound(type, 0));
4148                         n_members = get_array_upper_bound_int(type, 0);
4149                 } else {
4150                         n_members = get_compound_n_members(type);
4151                 }
4152
4153                 if (get_initializer_compound_n_entries(initializer)
4154                                 != (unsigned) n_members)
4155                         panic("initializer doesn't match compound type");
4156
4157                 for (int i = 0; i < n_members; ++i) {
4158                         ir_node   *addr;
4159                         ir_type   *irtype;
4160                         ir_entity *sub_entity;
4161                         if (is_Array_type(type)) {
4162                                 ir_tarval *index_tv = new_tarval_from_long(i, mode_uint);
4163                                 ir_node   *cnst     = new_d_Const(dbgi, index_tv);
4164                                 ir_node   *in[1]    = { cnst };
4165                                 irtype     = get_array_element_type(type);
4166                                 sub_entity = get_array_element_entity(type);
4167                                 addr       = new_d_Sel(dbgi, new_NoMem(), base_addr, 1, in,
4168                                                        sub_entity);
4169                         } else {
4170                                 sub_entity = get_compound_member(type, i);
4171                                 irtype     = get_entity_type(sub_entity);
4172                                 addr       = new_d_simpleSel(dbgi, new_NoMem(), base_addr,
4173                                                              sub_entity);
4174                         }
4175
4176                         ir_initializer_t *sub_init
4177                                 = get_initializer_compound_value(initializer, i);
4178
4179                         create_dynamic_initializer_sub(sub_init, sub_entity, irtype, dbgi,
4180                                                        addr);
4181                 }
4182                 return;
4183         }
4184         }
4185
4186         panic("invalid IR_INITIALIZER found");
4187 }
4188
4189 static void create_dynamic_initializer(ir_initializer_t *initializer,
4190                 dbg_info *dbgi, ir_entity *entity)
4191 {
4192         ir_node *frame     = get_irg_frame(current_ir_graph);
4193         ir_node *base_addr = new_d_simpleSel(dbgi, new_NoMem(), frame, entity);
4194         ir_type *type      = get_entity_type(entity);
4195
4196         create_dynamic_initializer_sub(initializer, entity, type, dbgi, base_addr);
4197 }
4198
4199 static void create_local_initializer(initializer_t *initializer, dbg_info *dbgi,
4200                                      ir_entity *entity, type_t *type)
4201 {
4202         ir_node *memory = get_store();
4203         ir_node *nomem  = new_NoMem();
4204         ir_node *frame  = get_irg_frame(current_ir_graph);
4205         ir_node *addr   = new_d_simpleSel(dbgi, nomem, frame, entity);
4206
4207         if (initializer->kind == INITIALIZER_VALUE) {
4208                 initializer_value_t *initializer_value = &initializer->value;
4209
4210                 ir_node *value = expression_to_firm(initializer_value->value);
4211                 type = skip_typeref(type);
4212                 assign_value(dbgi, addr, type, value);
4213                 return;
4214         }
4215
4216         if (is_constant_initializer(initializer) == EXPR_CLASS_VARIABLE) {
4217                 ir_initializer_t *irinitializer
4218                         = create_ir_initializer(initializer, type);
4219
4220                 create_dynamic_initializer(irinitializer, dbgi, entity);
4221                 return;
4222         }
4223
4224         /* create the ir_initializer */
4225         ir_graph *const old_current_ir_graph = current_ir_graph;
4226         current_ir_graph = get_const_code_irg();
4227
4228         ir_initializer_t *irinitializer = create_ir_initializer(initializer, type);
4229
4230         assert(current_ir_graph == get_const_code_irg());
4231         current_ir_graph = old_current_ir_graph;
4232
4233         /* create a "template" entity which is copied to the entity on the stack */
4234         ident     *const id          = id_unique("initializer.%u");
4235         ir_type   *const irtype      = get_ir_type(type);
4236         ir_type   *const global_type = get_glob_type();
4237         ir_entity *const init_entity = new_d_entity(global_type, id, irtype, dbgi);
4238         set_entity_ld_ident(init_entity, id);
4239
4240         set_entity_visibility(init_entity, ir_visibility_private);
4241         add_entity_linkage(init_entity, IR_LINKAGE_CONSTANT);
4242
4243         set_entity_initializer(init_entity, irinitializer);
4244
4245         ir_node *const src_addr = create_symconst(dbgi, init_entity);
4246         ir_node *const copyb    = new_d_CopyB(dbgi, memory, addr, src_addr, irtype);
4247
4248         ir_node *const copyb_mem = new_Proj(copyb, mode_M, pn_CopyB_M);
4249         set_store(copyb_mem);
4250 }
4251
4252 static void create_initializer_local_variable_entity(entity_t *entity)
4253 {
4254         assert(entity->kind == ENTITY_VARIABLE);
4255         initializer_t *initializer = entity->variable.initializer;
4256         dbg_info      *dbgi        = get_dbg_info(&entity->base.source_position);
4257         ir_entity     *irentity    = entity->variable.v.entity;
4258         type_t        *type        = entity->declaration.type;
4259
4260         create_local_initializer(initializer, dbgi, irentity, type);
4261 }
4262
4263 static void create_variable_initializer(entity_t *entity)
4264 {
4265         assert(entity->kind == ENTITY_VARIABLE);
4266         initializer_t *initializer = entity->variable.initializer;
4267         if (initializer == NULL)
4268                 return;
4269
4270         declaration_kind_t declaration_kind
4271                 = (declaration_kind_t) entity->declaration.kind;
4272         if (declaration_kind == DECLARATION_KIND_LOCAL_VARIABLE_ENTITY) {
4273                 create_initializer_local_variable_entity(entity);
4274                 return;
4275         }
4276
4277         type_t            *type = entity->declaration.type;
4278         type_qualifiers_t  tq   = get_type_qualifier(type, true);
4279
4280         if (initializer->kind == INITIALIZER_VALUE) {
4281                 initializer_value_t *initializer_value = &initializer->value;
4282                 dbg_info            *dbgi = get_dbg_info(&entity->base.source_position);
4283
4284                 ir_node *value = expression_to_firm(initializer_value->value);
4285
4286                 type_t  *init_type = initializer_value->value->base.type;
4287                 ir_mode *mode      = get_ir_mode_storage(init_type);
4288                 value = create_conv(dbgi, value, mode);
4289                 value = do_strict_conv(dbgi, value);
4290
4291                 if (declaration_kind == DECLARATION_KIND_LOCAL_VARIABLE) {
4292                         set_value(entity->variable.v.value_number, value);
4293                 } else {
4294                         assert(declaration_kind == DECLARATION_KIND_GLOBAL_VARIABLE);
4295
4296                         ir_entity *irentity = entity->variable.v.entity;
4297
4298                         if (tq & TYPE_QUALIFIER_CONST
4299                                         && get_entity_owner(irentity) != get_tls_type()) {
4300                                 add_entity_linkage(irentity, IR_LINKAGE_CONSTANT);
4301                         }
4302                         set_atomic_ent_value(irentity, value);
4303                 }
4304         } else {
4305                 assert(declaration_kind == DECLARATION_KIND_LOCAL_VARIABLE_ENTITY ||
4306                        declaration_kind == DECLARATION_KIND_GLOBAL_VARIABLE);
4307
4308                 ir_entity        *irentity        = entity->variable.v.entity;
4309                 ir_initializer_t *irinitializer
4310                         = create_ir_initializer(initializer, type);
4311
4312                 if (tq & TYPE_QUALIFIER_CONST) {
4313                         add_entity_linkage(irentity, IR_LINKAGE_CONSTANT);
4314                 }
4315                 set_entity_initializer(irentity, irinitializer);
4316         }
4317 }
4318
4319 static void create_variable_length_array(entity_t *entity)
4320 {
4321         assert(entity->kind == ENTITY_VARIABLE);
4322         assert(entity->variable.initializer == NULL);
4323
4324         entity->declaration.kind    = DECLARATION_KIND_VARIABLE_LENGTH_ARRAY;
4325         entity->variable.v.vla_base = NULL;
4326
4327         /* TODO: record VLA somewhere so we create the free node when we leave
4328          * it's scope */
4329 }
4330
4331 static void allocate_variable_length_array(entity_t *entity)
4332 {
4333         assert(entity->kind == ENTITY_VARIABLE);
4334         assert(entity->variable.initializer == NULL);
4335         assert(currently_reachable());
4336
4337         dbg_info *dbgi      = get_dbg_info(&entity->base.source_position);
4338         type_t   *type      = entity->declaration.type;
4339         ir_type  *el_type   = get_ir_type(type->array.element_type);
4340
4341         /* make sure size_node is calculated */
4342         get_type_size_node(type);
4343         ir_node  *elems = type->array.size_node;
4344         ir_node  *mem   = get_store();
4345         ir_node  *alloc = new_d_Alloc(dbgi, mem, elems, el_type, stack_alloc);
4346
4347         ir_node  *proj_m = new_d_Proj(dbgi, alloc, mode_M, pn_Alloc_M);
4348         ir_node  *addr   = new_d_Proj(dbgi, alloc, mode_P_data, pn_Alloc_res);
4349         set_store(proj_m);
4350
4351         assert(entity->declaration.kind == DECLARATION_KIND_VARIABLE_LENGTH_ARRAY);
4352         entity->variable.v.vla_base = addr;
4353 }
4354
4355 /**
4356  * Creates a Firm local variable from a declaration.
4357  */
4358 static void create_local_variable(entity_t *entity)
4359 {
4360         assert(entity->kind == ENTITY_VARIABLE);
4361         assert(entity->declaration.kind == DECLARATION_KIND_UNKNOWN);
4362
4363         bool needs_entity = entity->variable.address_taken;
4364         type_t *type = skip_typeref(entity->declaration.type);
4365
4366         /* is it a variable length array? */
4367         if (is_type_array(type) && !type->array.size_constant) {
4368                 create_variable_length_array(entity);
4369                 return;
4370         } else if (is_type_array(type) || is_type_compound(type)) {
4371                 needs_entity = true;
4372         } else if (type->base.qualifiers & TYPE_QUALIFIER_VOLATILE) {
4373                 needs_entity = true;
4374         }
4375
4376         if (needs_entity) {
4377                 ir_type *frame_type = get_irg_frame_type(current_ir_graph);
4378                 create_variable_entity(entity,
4379                                        DECLARATION_KIND_LOCAL_VARIABLE_ENTITY,
4380                                        frame_type);
4381         } else {
4382                 entity->declaration.kind        = DECLARATION_KIND_LOCAL_VARIABLE;
4383                 entity->variable.v.value_number = next_value_number_function;
4384                 set_irg_loc_description(current_ir_graph, next_value_number_function,
4385                                         entity);
4386                 ++next_value_number_function;
4387         }
4388 }
4389
4390 static void create_local_static_variable(entity_t *entity)
4391 {
4392         assert(entity->kind == ENTITY_VARIABLE);
4393         assert(entity->declaration.kind == DECLARATION_KIND_UNKNOWN);
4394
4395         type_t   *type           = skip_typeref(entity->declaration.type);
4396         ir_type  *const var_type = entity->variable.thread_local ?
4397                 get_tls_type() : get_glob_type();
4398         ir_type  *const irtype   = get_ir_type(type);
4399         dbg_info *const dbgi     = get_dbg_info(&entity->base.source_position);
4400
4401         size_t l = strlen(entity->base.symbol->string);
4402         char   buf[l + sizeof(".%u")];
4403         snprintf(buf, sizeof(buf), "%s.%%u", entity->base.symbol->string);
4404         ident     *const id       = id_unique(buf);
4405         ir_entity *const irentity = new_d_entity(var_type, id, irtype, dbgi);
4406
4407         if (type->base.qualifiers & TYPE_QUALIFIER_VOLATILE) {
4408                 set_entity_volatility(irentity, volatility_is_volatile);
4409         }
4410
4411         entity->declaration.kind  = DECLARATION_KIND_GLOBAL_VARIABLE;
4412         entity->variable.v.entity = irentity;
4413
4414         set_entity_ld_ident(irentity, id);
4415         set_entity_visibility(irentity, ir_visibility_local);
4416
4417         ir_graph *const old_current_ir_graph = current_ir_graph;
4418         current_ir_graph = get_const_code_irg();
4419
4420         create_variable_initializer(entity);
4421
4422         assert(current_ir_graph == get_const_code_irg());
4423         current_ir_graph = old_current_ir_graph;
4424 }
4425
4426
4427
4428 static void return_statement_to_firm(return_statement_t *statement)
4429 {
4430         if (!currently_reachable())
4431                 return;
4432
4433         dbg_info *dbgi        = get_dbg_info(&statement->base.source_position);
4434         type_t   *type        = current_function_entity->declaration.type;
4435         ir_type  *func_irtype = get_ir_type(type);
4436
4437         ir_node *in[1];
4438         int      in_len;
4439         if (get_method_n_ress(func_irtype) > 0) {
4440                 ir_type *res_type = get_method_res_type(func_irtype, 0);
4441
4442                 if (statement->value != NULL) {
4443                         ir_node *node = expression_to_firm(statement->value);
4444                         if (!is_compound_type(res_type)) {
4445                                 type_t  *ret_value_type = statement->value->base.type;
4446                                 ir_mode *mode           = get_ir_mode_storage(ret_value_type);
4447                                 node                    = create_conv(dbgi, node, mode);
4448                                 node                    = do_strict_conv(dbgi, node);
4449                         }
4450                         in[0] = node;
4451                 } else {
4452                         ir_mode *mode;
4453                         if (is_compound_type(res_type)) {
4454                                 mode = mode_P_data;
4455                         } else {
4456                                 mode = get_type_mode(res_type);
4457                         }
4458                         in[0] = new_Unknown(mode);
4459                 }
4460                 in_len = 1;
4461         } else {
4462                 /* build return_value for its side effects */
4463                 if (statement->value != NULL) {
4464                         expression_to_firm(statement->value);
4465                 }
4466                 in_len = 0;
4467         }
4468
4469         ir_node  *store = get_store();
4470         ir_node  *ret   = new_d_Return(dbgi, store, in_len, in);
4471
4472         ir_node *end_block = get_irg_end_block(current_ir_graph);
4473         add_immBlock_pred(end_block, ret);
4474
4475         set_unreachable_now();
4476 }
4477
4478 static ir_node *expression_statement_to_firm(expression_statement_t *statement)
4479 {
4480         if (!currently_reachable())
4481                 return NULL;
4482
4483         return expression_to_firm(statement->expression);
4484 }
4485
4486 static ir_node *compound_statement_to_firm(compound_statement_t *compound)
4487 {
4488         entity_t *entity = compound->scope.entities;
4489         for ( ; entity != NULL; entity = entity->base.next) {
4490                 if (!is_declaration(entity))
4491                         continue;
4492
4493                 create_local_declaration(entity);
4494         }
4495
4496         ir_node     *result    = NULL;
4497         statement_t *statement = compound->statements;
4498         for ( ; statement != NULL; statement = statement->base.next) {
4499                 if (statement->base.next == NULL
4500                                 && statement->kind == STATEMENT_EXPRESSION) {
4501                         result = expression_statement_to_firm(
4502                                         &statement->expression);
4503                         break;
4504                 }
4505                 statement_to_firm(statement);
4506         }
4507
4508         return result;
4509 }
4510
4511 static void create_global_variable(entity_t *entity)
4512 {
4513         ir_linkage    linkage    = IR_LINKAGE_DEFAULT;
4514         ir_visibility visibility = ir_visibility_default;
4515         ir_entity    *irentity;
4516         assert(entity->kind == ENTITY_VARIABLE);
4517
4518         switch ((storage_class_tag_t)entity->declaration.storage_class) {
4519         case STORAGE_CLASS_EXTERN: visibility = ir_visibility_external; break;
4520         case STORAGE_CLASS_STATIC: visibility = ir_visibility_local;    break;
4521         case STORAGE_CLASS_NONE:
4522                 visibility = ir_visibility_default;
4523                 /* uninitialized globals get merged in C */
4524                 if (entity->variable.initializer == NULL)
4525                         linkage |= IR_LINKAGE_MERGE;
4526                 break;
4527         case STORAGE_CLASS_TYPEDEF:
4528         case STORAGE_CLASS_AUTO:
4529         case STORAGE_CLASS_REGISTER:
4530                 panic("invalid storage class for global var");
4531         }
4532
4533         ir_type *var_type = get_glob_type();
4534         if (entity->variable.thread_local) {
4535                 var_type = get_tls_type();
4536                 /* LINKAGE_MERGE not supported by current linkers */
4537                 linkage &= ~IR_LINKAGE_MERGE;
4538         }
4539         create_variable_entity(entity, DECLARATION_KIND_GLOBAL_VARIABLE, var_type);
4540         irentity = entity->variable.v.entity;
4541         add_entity_linkage(irentity, linkage);
4542         set_entity_visibility(irentity, visibility);
4543 }
4544
4545 static void create_local_declaration(entity_t *entity)
4546 {
4547         assert(is_declaration(entity));
4548
4549         /* construct type */
4550         (void) get_ir_type(entity->declaration.type);
4551         if (entity->base.symbol == NULL) {
4552                 return;
4553         }
4554
4555         switch ((storage_class_tag_t) entity->declaration.storage_class) {
4556         case STORAGE_CLASS_STATIC:
4557                 if (entity->kind == ENTITY_FUNCTION) {
4558                         (void)get_function_entity(entity, NULL);
4559                 } else {
4560                         create_local_static_variable(entity);
4561                 }
4562                 return;
4563         case STORAGE_CLASS_EXTERN:
4564                 if (entity->kind == ENTITY_FUNCTION) {
4565                         assert(entity->function.statement == NULL);
4566                         (void)get_function_entity(entity, NULL);
4567                 } else {
4568                         create_global_variable(entity);
4569                         create_variable_initializer(entity);
4570                 }
4571                 return;
4572         case STORAGE_CLASS_NONE:
4573         case STORAGE_CLASS_AUTO:
4574         case STORAGE_CLASS_REGISTER:
4575                 if (entity->kind == ENTITY_FUNCTION) {
4576                         if (entity->function.statement != NULL) {
4577                                 ir_type *owner = get_irg_frame_type(current_ir_graph);
4578                                 (void)get_function_entity(entity, owner);
4579                                 entity->declaration.kind = DECLARATION_KIND_INNER_FUNCTION;
4580                                 enqueue_inner_function(entity);
4581                         } else {
4582                                 (void)get_function_entity(entity, NULL);
4583                         }
4584                 } else {
4585                         create_local_variable(entity);
4586                 }
4587                 return;
4588         case STORAGE_CLASS_TYPEDEF:
4589                 break;
4590         }
4591         panic("invalid storage class found");
4592 }
4593
4594 static void initialize_local_declaration(entity_t *entity)
4595 {
4596         if (entity->base.symbol == NULL)
4597                 return;
4598
4599         // no need to emit code in dead blocks
4600         if (entity->declaration.storage_class != STORAGE_CLASS_STATIC
4601                         && !currently_reachable())
4602                 return;
4603
4604         switch ((declaration_kind_t) entity->declaration.kind) {
4605         case DECLARATION_KIND_LOCAL_VARIABLE:
4606         case DECLARATION_KIND_LOCAL_VARIABLE_ENTITY:
4607                 create_variable_initializer(entity);
4608                 return;
4609
4610         case DECLARATION_KIND_VARIABLE_LENGTH_ARRAY:
4611                 allocate_variable_length_array(entity);
4612                 return;
4613
4614         case DECLARATION_KIND_COMPOUND_MEMBER:
4615         case DECLARATION_KIND_GLOBAL_VARIABLE:
4616         case DECLARATION_KIND_FUNCTION:
4617         case DECLARATION_KIND_INNER_FUNCTION:
4618                 return;
4619
4620         case DECLARATION_KIND_PARAMETER:
4621         case DECLARATION_KIND_PARAMETER_ENTITY:
4622                 panic("can't initialize parameters");
4623
4624         case DECLARATION_KIND_UNKNOWN:
4625                 panic("can't initialize unknown declaration");
4626         }
4627         panic("invalid declaration kind");
4628 }
4629
4630 static void declaration_statement_to_firm(declaration_statement_t *statement)
4631 {
4632         entity_t *entity = statement->declarations_begin;
4633         if (entity == NULL)
4634                 return;
4635
4636         entity_t *const last = statement->declarations_end;
4637         for ( ;; entity = entity->base.next) {
4638                 if (is_declaration(entity)) {
4639                         initialize_local_declaration(entity);
4640                 } else if (entity->kind == ENTITY_TYPEDEF) {
4641                         /* ยง6.7.7:3  Any array size expressions associated with variable length
4642                          * array declarators are evaluated each time the declaration of the
4643                          * typedef name is reached in the order of execution. */
4644                         type_t *const type = skip_typeref(entity->typedefe.type);
4645                         if (is_type_array(type) && type->array.is_vla)
4646                                 get_vla_size(&type->array);
4647                 }
4648                 if (entity == last)
4649                         break;
4650         }
4651 }
4652
4653 static void if_statement_to_firm(if_statement_t *statement)
4654 {
4655         /* Create the condition. */
4656         ir_node *true_block  = NULL;
4657         ir_node *false_block = NULL;
4658         if (currently_reachable()) {
4659                 true_block  = new_immBlock();
4660                 false_block = new_immBlock();
4661                 create_condition_evaluation(statement->condition, true_block, false_block);
4662                 mature_immBlock(true_block);
4663         }
4664
4665         /* Create the false statement.
4666          * Handle false before true, so if no false statement is present, then the
4667          * empty false block is reused as fallthrough block. */
4668         ir_node *fallthrough_block = NULL;
4669         if (statement->false_statement != NULL) {
4670                 if (false_block != NULL) {
4671                         mature_immBlock(false_block);
4672                 }
4673                 set_cur_block(false_block);
4674                 statement_to_firm(statement->false_statement);
4675                 if (currently_reachable()) {
4676                         fallthrough_block = new_immBlock();
4677                         add_immBlock_pred(fallthrough_block, new_Jmp());
4678                 }
4679         } else {
4680                 fallthrough_block = false_block;
4681         }
4682
4683         /* Create the true statement. */
4684         set_cur_block(true_block);
4685         statement_to_firm(statement->true_statement);
4686         if (currently_reachable()) {
4687                 if (fallthrough_block == NULL) {
4688                         fallthrough_block = new_immBlock();
4689                 }
4690                 add_immBlock_pred(fallthrough_block, new_Jmp());
4691         }
4692
4693         /* Handle the block after the if-statement. */
4694         if (fallthrough_block != NULL) {
4695                 mature_immBlock(fallthrough_block);
4696         }
4697         set_cur_block(fallthrough_block);
4698 }
4699
4700 /* Create a jump node which jumps into target_block, if the current block is
4701  * reachable. */
4702 static void jump_if_reachable(ir_node *const target_block)
4703 {
4704         ir_node *const pred = currently_reachable() ? new_Jmp() : new_Bad(mode_X);
4705         add_immBlock_pred(target_block, pred);
4706 }
4707
4708 static void while_statement_to_firm(while_statement_t *statement)
4709 {
4710         /* Create the header block */
4711         ir_node *const header_block = new_immBlock();
4712         jump_if_reachable(header_block);
4713
4714         /* Create the condition. */
4715         ir_node      *      body_block;
4716         ir_node      *      false_block;
4717         expression_t *const cond = statement->condition;
4718         if (is_constant_expression(cond) == EXPR_CLASS_CONSTANT &&
4719                         fold_constant_to_bool(cond)) {
4720                 /* Shortcut for while (true). */
4721                 body_block  = header_block;
4722                 false_block = NULL;
4723
4724                 keep_alive(header_block);
4725                 keep_all_memory(header_block);
4726         } else {
4727                 body_block  = new_immBlock();
4728                 false_block = new_immBlock();
4729
4730                 set_cur_block(header_block);
4731                 create_condition_evaluation(cond, body_block, false_block);
4732                 mature_immBlock(body_block);
4733         }
4734
4735         ir_node *const old_continue_label = continue_label;
4736         ir_node *const old_break_label    = break_label;
4737         continue_label = header_block;
4738         break_label    = false_block;
4739
4740         /* Create the loop body. */
4741         set_cur_block(body_block);
4742         statement_to_firm(statement->body);
4743         jump_if_reachable(header_block);
4744
4745         mature_immBlock(header_block);
4746         assert(false_block == NULL || false_block == break_label);
4747         false_block = break_label;
4748         if (false_block != NULL) {
4749                 mature_immBlock(false_block);
4750         }
4751         set_cur_block(false_block);
4752
4753         assert(continue_label == header_block);
4754         continue_label = old_continue_label;
4755         break_label    = old_break_label;
4756 }
4757
4758 static ir_node *get_break_label(void)
4759 {
4760         if (break_label == NULL) {
4761                 break_label = new_immBlock();
4762         }
4763         return break_label;
4764 }
4765
4766 static void do_while_statement_to_firm(do_while_statement_t *statement)
4767 {
4768         /* create the header block */
4769         ir_node *header_block = new_immBlock();
4770
4771         /* the loop body */
4772         ir_node *body_block = new_immBlock();
4773         jump_if_reachable(body_block);
4774
4775         ir_node *old_continue_label = continue_label;
4776         ir_node *old_break_label    = break_label;
4777         continue_label              = header_block;
4778         break_label                 = NULL;
4779
4780         set_cur_block(body_block);
4781         statement_to_firm(statement->body);
4782         ir_node *const false_block = get_break_label();
4783
4784         assert(continue_label == header_block);
4785         continue_label = old_continue_label;
4786         break_label    = old_break_label;
4787
4788         jump_if_reachable(header_block);
4789
4790         /* create the condition */
4791         mature_immBlock(header_block);
4792         set_cur_block(header_block);
4793
4794         create_condition_evaluation(statement->condition, body_block, false_block);
4795         mature_immBlock(body_block);
4796         mature_immBlock(false_block);
4797
4798         set_cur_block(false_block);
4799 }
4800
4801 static void for_statement_to_firm(for_statement_t *statement)
4802 {
4803         /* create declarations */
4804         entity_t *entity = statement->scope.entities;
4805         for ( ; entity != NULL; entity = entity->base.next) {
4806                 if (!is_declaration(entity))
4807                         continue;
4808
4809                 create_local_declaration(entity);
4810         }
4811
4812         if (currently_reachable()) {
4813                 entity = statement->scope.entities;
4814                 for ( ; entity != NULL; entity = entity->base.next) {
4815                         if (!is_declaration(entity))
4816                                 continue;
4817
4818                         initialize_local_declaration(entity);
4819                 }
4820
4821                 if (statement->initialisation != NULL) {
4822                         expression_to_firm(statement->initialisation);
4823                 }
4824         }
4825
4826         /* Create the header block */
4827         ir_node *const header_block = new_immBlock();
4828         jump_if_reachable(header_block);
4829
4830         /* Create the condition. */
4831         ir_node *body_block;
4832         ir_node *false_block;
4833         if (statement->condition != NULL) {
4834                 body_block  = new_immBlock();
4835                 false_block = new_immBlock();
4836
4837                 set_cur_block(header_block);
4838                 create_condition_evaluation(statement->condition, body_block, false_block);
4839                 mature_immBlock(body_block);
4840         } else {
4841                 /* for-ever. */
4842                 body_block  = header_block;
4843                 false_block = NULL;
4844
4845                 keep_alive(header_block);
4846                 keep_all_memory(header_block);
4847         }
4848
4849         /* Create the step block, if necessary. */
4850         ir_node      *      step_block = header_block;
4851         expression_t *const step       = statement->step;
4852         if (step != NULL) {
4853                 step_block = new_immBlock();
4854         }
4855
4856         ir_node *const old_continue_label = continue_label;
4857         ir_node *const old_break_label    = break_label;
4858         continue_label = step_block;
4859         break_label    = false_block;
4860
4861         /* Create the loop body. */
4862         set_cur_block(body_block);
4863         statement_to_firm(statement->body);
4864         jump_if_reachable(step_block);
4865
4866         /* Create the step code. */
4867         if (step != NULL) {
4868                 mature_immBlock(step_block);
4869                 set_cur_block(step_block);
4870                 expression_to_firm(step);
4871                 jump_if_reachable(header_block);
4872         }
4873
4874         mature_immBlock(header_block);
4875         assert(false_block == NULL || false_block == break_label);
4876         false_block = break_label;
4877         if (false_block != NULL) {
4878                 mature_immBlock(false_block);
4879         }
4880         set_cur_block(false_block);
4881
4882         assert(continue_label == step_block);
4883         continue_label = old_continue_label;
4884         break_label    = old_break_label;
4885 }
4886
4887 static void create_jump_statement(const statement_t *statement,
4888                                   ir_node *target_block)
4889 {
4890         if (!currently_reachable())
4891                 return;
4892
4893         dbg_info *dbgi = get_dbg_info(&statement->base.source_position);
4894         ir_node  *jump = new_d_Jmp(dbgi);
4895         add_immBlock_pred(target_block, jump);
4896
4897         set_unreachable_now();
4898 }
4899
4900 static void switch_statement_to_firm(switch_statement_t *statement)
4901 {
4902         ir_node  *first_block = NULL;
4903         dbg_info *dbgi        = get_dbg_info(&statement->base.source_position);
4904         ir_node  *cond        = NULL;
4905
4906         if (currently_reachable()) {
4907                 ir_node *expression = expression_to_firm(statement->expression);
4908                 cond                = new_d_Cond(dbgi, expression);
4909                 first_block         = get_cur_block();
4910         }
4911
4912         set_unreachable_now();
4913
4914         ir_node *const old_switch_cond       = current_switch_cond;
4915         ir_node *const old_break_label       = break_label;
4916         const bool     old_saw_default_label = saw_default_label;
4917         saw_default_label                    = false;
4918         current_switch_cond                  = cond;
4919         break_label                          = NULL;
4920         switch_statement_t *const old_switch = current_switch;
4921         current_switch                       = statement;
4922
4923         /* determine a free number for the default label */
4924         unsigned long num_cases       = 0;
4925         long          default_proj_nr = 0;
4926         for (case_label_statement_t *l = statement->first_case; l != NULL; l = l->next) {
4927                 if (l->expression == NULL) {
4928                         /* default case */
4929                         continue;
4930                 }
4931                 if (l->last_case >= l->first_case)
4932                         num_cases += l->last_case - l->first_case + 1;
4933                 if (l->last_case > default_proj_nr)
4934                         default_proj_nr = l->last_case;
4935         }
4936
4937         if (default_proj_nr == LONG_MAX) {
4938                 /* Bad: an overflow will occur, we cannot be sure that the
4939                  * maximum + 1 is a free number. Scan the values a second
4940                  * time to find a free number.
4941                  */
4942                 unsigned char *bits = xmalloc((num_cases + 7) >> 3);
4943
4944                 memset(bits, 0, (num_cases + 7) >> 3);
4945                 for (case_label_statement_t *l = statement->first_case; l != NULL; l = l->next) {
4946                         if (l->expression == NULL) {
4947                                 /* default case */
4948                                 continue;
4949                         }
4950                         unsigned long start = l->first_case > 0 ? (unsigned long)l->first_case : 0;
4951                         if (start < num_cases && l->last_case >= 0) {
4952                                 unsigned long end  = (unsigned long)l->last_case < num_cases ?
4953                                         (unsigned long)l->last_case : num_cases - 1;
4954                                 for (unsigned long cns = start; cns <= end; ++cns) {
4955                                         bits[cns >> 3] |= (1 << (cns & 7));
4956                                 }
4957                         }
4958                 }
4959                 /* We look at the first num_cases constants:
4960                  * Either they are dense, so we took the last (num_cases)
4961                  * one, or they are not dense, so we will find one free
4962                  * there...
4963                  */
4964                 unsigned long i;
4965                 for (i = 0; i < num_cases; ++i)
4966                         if ((bits[i >> 3] & (1 << (i & 7))) == 0)
4967                                 break;
4968
4969                 free(bits);
4970                 default_proj_nr = i;
4971         } else {
4972                 ++default_proj_nr;
4973         }
4974         statement->default_proj_nr = default_proj_nr;
4975         /* safety check: cond might already be folded to a Bad */
4976         if (cond != NULL && is_Cond(cond)) {
4977                 set_Cond_default_proj(cond, default_proj_nr);
4978         }
4979
4980         statement_to_firm(statement->body);
4981
4982         jump_if_reachable(get_break_label());
4983
4984         if (!saw_default_label && first_block != NULL) {
4985                 set_cur_block(first_block);
4986                 ir_node *const proj = new_d_Proj(dbgi, cond, mode_X, default_proj_nr);
4987                 add_immBlock_pred(get_break_label(), proj);
4988         }
4989
4990         if (break_label != NULL) {
4991                 mature_immBlock(break_label);
4992         }
4993         set_cur_block(break_label);
4994
4995         assert(current_switch_cond == cond);
4996         current_switch      = old_switch;
4997         current_switch_cond = old_switch_cond;
4998         break_label         = old_break_label;
4999         saw_default_label   = old_saw_default_label;
5000 }
5001
5002 static void case_label_to_firm(const case_label_statement_t *statement)
5003 {
5004         if (statement->is_empty_range)
5005                 return;
5006
5007         ir_node *block = new_immBlock();
5008         /* Fallthrough from previous case */
5009         jump_if_reachable(block);
5010
5011         if (current_switch_cond != NULL) {
5012                 set_cur_block(get_nodes_block(current_switch_cond));
5013                 dbg_info *const dbgi = get_dbg_info(&statement->base.source_position);
5014                 if (statement->expression != NULL) {
5015                         long pn     = statement->first_case;
5016                         long end_pn = statement->last_case;
5017                         assert(pn <= end_pn);
5018                         /* create jumps for all cases in the given range */
5019                         do {
5020                                 ir_node *const proj = new_d_Proj(dbgi, current_switch_cond, mode_X, pn);
5021                                 add_immBlock_pred(block, proj);
5022                         } while (pn++ < end_pn);
5023                 } else {
5024                         saw_default_label = true;
5025                         ir_node *const proj = new_d_Proj(dbgi, current_switch_cond, mode_X,
5026                                                          current_switch->default_proj_nr);
5027                         add_immBlock_pred(block, proj);
5028                 }
5029         }
5030
5031         mature_immBlock(block);
5032         set_cur_block(block);
5033
5034         statement_to_firm(statement->statement);
5035 }
5036
5037 static void label_to_firm(const label_statement_t *statement)
5038 {
5039         ir_node *block = get_label_block(statement->label);
5040         jump_if_reachable(block);
5041
5042         set_cur_block(block);
5043         keep_alive(block);
5044         keep_all_memory(block);
5045
5046         statement_to_firm(statement->statement);
5047 }
5048
5049 static void goto_to_firm(const goto_statement_t *statement)
5050 {
5051         if (!currently_reachable())
5052                 return;
5053
5054         if (statement->expression) {
5055                 ir_node  *irn  = expression_to_firm(statement->expression);
5056                 dbg_info *dbgi = get_dbg_info(&statement->base.source_position);
5057                 ir_node  *ijmp = new_d_IJmp(dbgi, irn);
5058
5059                 set_irn_link(ijmp, ijmp_list);
5060                 ijmp_list = ijmp;
5061         } else {
5062                 ir_node *block = get_label_block(statement->label);
5063                 ir_node *jmp   = new_Jmp();
5064                 add_immBlock_pred(block, jmp);
5065         }
5066         set_unreachable_now();
5067 }
5068
5069 static void asm_statement_to_firm(const asm_statement_t *statement)
5070 {
5071         bool needs_memory = false;
5072
5073         if (statement->is_volatile) {
5074                 needs_memory = true;
5075         }
5076
5077         size_t         n_clobbers = 0;
5078         asm_clobber_t *clobber    = statement->clobbers;
5079         for ( ; clobber != NULL; clobber = clobber->next) {
5080                 const char *clobber_str = clobber->clobber.begin;
5081
5082                 if (!be_is_valid_clobber(clobber_str)) {
5083                         errorf(&statement->base.source_position,
5084                                    "invalid clobber '%s' specified", clobber->clobber);
5085                         continue;
5086                 }
5087
5088                 if (strcmp(clobber_str, "memory") == 0) {
5089                         needs_memory = true;
5090                         continue;
5091                 }
5092
5093                 ident *id = new_id_from_str(clobber_str);
5094                 obstack_ptr_grow(&asm_obst, id);
5095                 ++n_clobbers;
5096         }
5097         assert(obstack_object_size(&asm_obst) == n_clobbers * sizeof(ident*));
5098         ident **clobbers = NULL;
5099         if (n_clobbers > 0) {
5100                 clobbers = obstack_finish(&asm_obst);
5101         }
5102
5103         size_t n_inputs  = 0;
5104         asm_argument_t *argument = statement->inputs;
5105         for ( ; argument != NULL; argument = argument->next)
5106                 n_inputs++;
5107         size_t n_outputs = 0;
5108         argument = statement->outputs;
5109         for ( ; argument != NULL; argument = argument->next)
5110                 n_outputs++;
5111
5112         unsigned next_pos = 0;
5113
5114         ir_node *ins[n_inputs + n_outputs + 1];
5115         size_t   in_size = 0;
5116
5117         ir_asm_constraint tmp_in_constraints[n_outputs];
5118
5119         const expression_t *out_exprs[n_outputs];
5120         ir_node            *out_addrs[n_outputs];
5121         size_t              out_size = 0;
5122
5123         argument = statement->outputs;
5124         for ( ; argument != NULL; argument = argument->next) {
5125                 const char *constraints = argument->constraints.begin;
5126                 asm_constraint_flags_t asm_flags
5127                         = be_parse_asm_constraints(constraints);
5128
5129                 {
5130                         source_position_t const *const pos = &statement->base.source_position;
5131                         if (asm_flags & ASM_CONSTRAINT_FLAG_NO_SUPPORT) {
5132                                 warningf(WARN_OTHER, pos, "some constraints in '%s' are not supported", constraints);
5133                         }
5134                         if (asm_flags & ASM_CONSTRAINT_FLAG_INVALID) {
5135                                 errorf(pos, "some constraints in '%s' are invalid", constraints);
5136                                 continue;
5137                         }
5138                         if (! (asm_flags & ASM_CONSTRAINT_FLAG_MODIFIER_WRITE)) {
5139                                 errorf(pos, "no write flag specified for output constraints '%s'", constraints);
5140                                 continue;
5141                         }
5142                 }
5143
5144                 unsigned pos = next_pos++;
5145                 if ( (asm_flags & ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE)
5146                                 || (asm_flags & ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER) ) {
5147                         expression_t *expr = argument->expression;
5148                         ir_node      *addr = expression_to_addr(expr);
5149                         /* in+output, construct an artifical same_as constraint on the
5150                          * input */
5151                         if (asm_flags & ASM_CONSTRAINT_FLAG_MODIFIER_READ) {
5152                                 char     buf[64];
5153                                 ir_node *value = get_value_from_lvalue(expr, addr);
5154
5155                                 snprintf(buf, sizeof(buf), "%u", (unsigned) out_size);
5156
5157                                 ir_asm_constraint constraint;
5158                                 constraint.pos              = pos;
5159                                 constraint.constraint       = new_id_from_str(buf);
5160                                 constraint.mode             = get_ir_mode_storage(expr->base.type);
5161                                 tmp_in_constraints[in_size] = constraint;
5162                                 ins[in_size] = value;
5163
5164                                 ++in_size;
5165                         }
5166
5167                         out_exprs[out_size] = expr;
5168                         out_addrs[out_size] = addr;
5169                         ++out_size;
5170                 } else if (asm_flags & ASM_CONSTRAINT_FLAG_SUPPORTS_MEMOP) {
5171                         /* pure memory ops need no input (but we have to make sure we
5172                          * attach to the memory) */
5173                         assert(! (asm_flags &
5174                                                 (ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE
5175                                                  | ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER)));
5176                         needs_memory = true;
5177
5178                         /* we need to attach the address to the inputs */
5179                         expression_t *expr = argument->expression;
5180
5181                         ir_asm_constraint constraint;
5182                         constraint.pos              = pos;
5183                         constraint.constraint       = new_id_from_str(constraints);
5184                         constraint.mode             = NULL;
5185                         tmp_in_constraints[in_size] = constraint;
5186
5187                         ins[in_size]          = expression_to_addr(expr);
5188                         ++in_size;
5189                         continue;
5190                 } else {
5191                         errorf(&statement->base.source_position,
5192                                "only modifiers but no place set in constraints '%s'",
5193                                constraints);
5194                         continue;
5195                 }
5196
5197                 ir_asm_constraint constraint;
5198                 constraint.pos        = pos;
5199                 constraint.constraint = new_id_from_str(constraints);
5200                 constraint.mode       = get_ir_mode_storage(argument->expression->base.type);
5201
5202                 obstack_grow(&asm_obst, &constraint, sizeof(constraint));
5203         }
5204         assert(obstack_object_size(&asm_obst)
5205                         == out_size * sizeof(ir_asm_constraint));
5206         ir_asm_constraint *output_constraints = obstack_finish(&asm_obst);
5207
5208
5209         obstack_grow(&asm_obst, tmp_in_constraints,
5210                      in_size * sizeof(tmp_in_constraints[0]));
5211         /* find and count input and output arguments */
5212         argument = statement->inputs;
5213         for ( ; argument != NULL; argument = argument->next) {
5214                 const char *constraints = argument->constraints.begin;
5215                 asm_constraint_flags_t asm_flags
5216                         = be_parse_asm_constraints(constraints);
5217
5218                 if (asm_flags & ASM_CONSTRAINT_FLAG_NO_SUPPORT) {
5219                         errorf(&statement->base.source_position,
5220                                "some constraints in '%s' are not supported", constraints);
5221                         continue;
5222                 }
5223                 if (asm_flags & ASM_CONSTRAINT_FLAG_INVALID) {
5224                         errorf(&statement->base.source_position,
5225                                "some constraints in '%s' are invalid", constraints);
5226                         continue;
5227                 }
5228                 if (asm_flags & ASM_CONSTRAINT_FLAG_MODIFIER_WRITE) {
5229                         errorf(&statement->base.source_position,
5230                                "write flag specified for input constraints '%s'",
5231                                constraints);
5232                         continue;
5233                 }
5234
5235                 ir_node *input;
5236                 if ( (asm_flags & ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE)
5237                                 || (asm_flags & ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER) ) {
5238                         /* we can treat this as "normal" input */
5239                         input = expression_to_firm(argument->expression);
5240                 } else if (asm_flags & ASM_CONSTRAINT_FLAG_SUPPORTS_MEMOP) {
5241                         /* pure memory ops need no input (but we have to make sure we
5242                          * attach to the memory) */
5243                         assert(! (asm_flags &
5244                                                 (ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE
5245                                                  | ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER)));
5246                         needs_memory = true;
5247                         input = expression_to_addr(argument->expression);
5248                 } else {
5249                         errorf(&statement->base.source_position,
5250                                "only modifiers but no place set in constraints '%s'",
5251                                constraints);
5252                         continue;
5253                 }
5254
5255                 ir_asm_constraint constraint;
5256                 constraint.pos        = next_pos++;
5257                 constraint.constraint = new_id_from_str(constraints);
5258                 constraint.mode       = get_irn_mode(input);
5259
5260                 obstack_grow(&asm_obst, &constraint, sizeof(constraint));
5261                 ins[in_size++] = input;
5262         }
5263
5264         if (needs_memory) {
5265                 ir_asm_constraint constraint;
5266                 constraint.pos        = next_pos++;
5267                 constraint.constraint = new_id_from_str("");
5268                 constraint.mode       = mode_M;
5269
5270                 obstack_grow(&asm_obst, &constraint, sizeof(constraint));
5271                 ins[in_size++] = get_store();
5272         }
5273
5274         assert(obstack_object_size(&asm_obst)
5275                         == in_size * sizeof(ir_asm_constraint));
5276         ir_asm_constraint *input_constraints = obstack_finish(&asm_obst);
5277
5278         /* create asm node */
5279         dbg_info *dbgi = get_dbg_info(&statement->base.source_position);
5280
5281         ident *asm_text = new_id_from_str(statement->asm_text.begin);
5282
5283         ir_node *node = new_d_ASM(dbgi, in_size, ins, input_constraints,
5284                                   out_size, output_constraints,
5285                                   n_clobbers, clobbers, asm_text);
5286
5287         if (statement->is_volatile) {
5288                 set_irn_pinned(node, op_pin_state_pinned);
5289         } else {
5290                 set_irn_pinned(node, op_pin_state_floats);
5291         }
5292
5293         /* create output projs & connect them */
5294         if (needs_memory) {
5295                 ir_node *projm = new_Proj(node, mode_M, out_size);
5296                 set_store(projm);
5297         }
5298
5299         size_t i;
5300         for (i = 0; i < out_size; ++i) {
5301                 const expression_t *out_expr = out_exprs[i];
5302                 long                pn       = i;
5303                 ir_mode            *mode     = get_ir_mode_storage(out_expr->base.type);
5304                 ir_node            *proj     = new_Proj(node, mode, pn);
5305                 ir_node            *addr     = out_addrs[i];
5306
5307                 set_value_for_expression_addr(out_expr, proj, addr);
5308         }
5309 }
5310
5311 static void ms_try_statement_to_firm(ms_try_statement_t *statement)
5312 {
5313         statement_to_firm(statement->try_statement);
5314         source_position_t const *const pos = &statement->base.source_position;
5315         warningf(WARN_OTHER, pos, "structured exception handling ignored");
5316 }
5317
5318 static void leave_statement_to_firm(leave_statement_t *statement)
5319 {
5320         errorf(&statement->base.source_position, "__leave not supported yet");
5321 }
5322
5323 /**
5324  * Transform a statement.
5325  */
5326 static void statement_to_firm(statement_t *statement)
5327 {
5328 #ifndef NDEBUG
5329         assert(!statement->base.transformed);
5330         statement->base.transformed = true;
5331 #endif
5332
5333         switch (statement->kind) {
5334         case STATEMENT_ERROR:
5335                 panic("error statement found");
5336         case STATEMENT_EMPTY:
5337                 /* nothing */
5338                 return;
5339         case STATEMENT_COMPOUND:
5340                 compound_statement_to_firm(&statement->compound);
5341                 return;
5342         case STATEMENT_RETURN:
5343                 return_statement_to_firm(&statement->returns);
5344                 return;
5345         case STATEMENT_EXPRESSION:
5346                 expression_statement_to_firm(&statement->expression);
5347                 return;
5348         case STATEMENT_IF:
5349                 if_statement_to_firm(&statement->ifs);
5350                 return;
5351         case STATEMENT_WHILE:
5352                 while_statement_to_firm(&statement->whiles);
5353                 return;
5354         case STATEMENT_DO_WHILE:
5355                 do_while_statement_to_firm(&statement->do_while);
5356                 return;
5357         case STATEMENT_DECLARATION:
5358                 declaration_statement_to_firm(&statement->declaration);
5359                 return;
5360         case STATEMENT_BREAK:
5361                 create_jump_statement(statement, get_break_label());
5362                 return;
5363         case STATEMENT_CONTINUE:
5364                 create_jump_statement(statement, continue_label);
5365                 return;
5366         case STATEMENT_SWITCH:
5367                 switch_statement_to_firm(&statement->switchs);
5368                 return;
5369         case STATEMENT_CASE_LABEL:
5370                 case_label_to_firm(&statement->case_label);
5371                 return;
5372         case STATEMENT_FOR:
5373                 for_statement_to_firm(&statement->fors);
5374                 return;
5375         case STATEMENT_LABEL:
5376                 label_to_firm(&statement->label);
5377                 return;
5378         case STATEMENT_GOTO:
5379                 goto_to_firm(&statement->gotos);
5380                 return;
5381         case STATEMENT_ASM:
5382                 asm_statement_to_firm(&statement->asms);
5383                 return;
5384         case STATEMENT_MS_TRY:
5385                 ms_try_statement_to_firm(&statement->ms_try);
5386                 return;
5387         case STATEMENT_LEAVE:
5388                 leave_statement_to_firm(&statement->leave);
5389                 return;
5390         }
5391         panic("statement not implemented");
5392 }
5393
5394 static int count_local_variables(const entity_t *entity,
5395                                  const entity_t *const last)
5396 {
5397         int count = 0;
5398         entity_t const *const end = last != NULL ? last->base.next : NULL;
5399         for (; entity != end; entity = entity->base.next) {
5400                 type_t *type;
5401                 bool    address_taken;
5402
5403                 if (entity->kind == ENTITY_VARIABLE) {
5404                         type          = skip_typeref(entity->declaration.type);
5405                         address_taken = entity->variable.address_taken;
5406                 } else if (entity->kind == ENTITY_PARAMETER) {
5407                         type          = skip_typeref(entity->declaration.type);
5408                         address_taken = entity->parameter.address_taken;
5409                 } else {
5410                         continue;
5411                 }
5412
5413                 if (!address_taken && is_type_scalar(type))
5414                         ++count;
5415         }
5416         return count;
5417 }
5418
5419 static void count_local_variables_in_stmt(statement_t *stmt, void *const env)
5420 {
5421         int *const count = env;
5422
5423         switch (stmt->kind) {
5424         case STATEMENT_DECLARATION: {
5425                 const declaration_statement_t *const decl_stmt = &stmt->declaration;
5426                 *count += count_local_variables(decl_stmt->declarations_begin,
5427                                 decl_stmt->declarations_end);
5428                 break;
5429         }
5430
5431         case STATEMENT_FOR:
5432                 *count += count_local_variables(stmt->fors.scope.entities, NULL);
5433                 break;
5434
5435         default:
5436                 break;
5437         }
5438 }
5439
5440 /**
5441  * Return the number of local (alias free) variables used by a function.
5442  */
5443 static int get_function_n_local_vars(entity_t *entity)
5444 {
5445         const function_t *function = &entity->function;
5446         int count = 0;
5447
5448         /* count parameters */
5449         count += count_local_variables(function->parameters.entities, NULL);
5450
5451         /* count local variables declared in body */
5452         walk_statements(function->statement, count_local_variables_in_stmt, &count);
5453         return count;
5454 }
5455
5456 /**
5457  * Build Firm code for the parameters of a function.
5458  */
5459 static void initialize_function_parameters(entity_t *entity)
5460 {
5461         assert(entity->kind == ENTITY_FUNCTION);
5462         ir_graph *irg             = current_ir_graph;
5463         ir_node  *args            = get_irg_args(irg);
5464         int       n               = 0;
5465         ir_type  *function_irtype;
5466
5467         if (entity->function.need_closure) {
5468                 /* add an extra parameter for the static link */
5469                 entity->function.static_link = new_r_Proj(args, mode_P_data, 0);
5470                 ++n;
5471
5472                 /* Matze: IMO this is wrong, nested functions should have an own
5473                  * type and not rely on strange parameters... */
5474                 function_irtype = create_method_type(&entity->declaration.type->function, true);
5475         } else {
5476                 function_irtype = get_ir_type(entity->declaration.type);
5477         }
5478
5479
5480
5481         entity_t *parameter = entity->function.parameters.entities;
5482         for ( ; parameter != NULL; parameter = parameter->base.next, ++n) {
5483                 if (parameter->kind != ENTITY_PARAMETER)
5484                         continue;
5485
5486                 assert(parameter->declaration.kind == DECLARATION_KIND_UNKNOWN);
5487                 type_t *type = skip_typeref(parameter->declaration.type);
5488
5489                 bool needs_entity = parameter->parameter.address_taken;
5490                 assert(!is_type_array(type));
5491                 if (is_type_compound(type)) {
5492                         needs_entity = true;
5493                 }
5494
5495                 ir_type *param_irtype = get_method_param_type(function_irtype, n);
5496                 if (needs_entity) {
5497                         ir_type   *frame_type = get_irg_frame_type(irg);
5498                         ir_entity *param
5499                                 = new_parameter_entity(frame_type, n, param_irtype);
5500                         parameter->declaration.kind
5501                                 = DECLARATION_KIND_PARAMETER_ENTITY;
5502                         parameter->parameter.v.entity = param;
5503                         continue;
5504                 }
5505
5506                 ir_mode *param_mode = get_type_mode(param_irtype);
5507                 long     pn         = n;
5508                 ir_node *value      = new_r_Proj(args, param_mode, pn);
5509
5510                 ir_mode *mode = get_ir_mode_storage(type);
5511                 value = create_conv(NULL, value, mode);
5512                 value = do_strict_conv(NULL, value);
5513
5514                 parameter->declaration.kind         = DECLARATION_KIND_PARAMETER;
5515                 parameter->parameter.v.value_number = next_value_number_function;
5516                 set_irg_loc_description(current_ir_graph, next_value_number_function,
5517                                         parameter);
5518                 ++next_value_number_function;
5519
5520                 set_value(parameter->parameter.v.value_number, value);
5521         }
5522 }
5523
5524 /**
5525  * Handle additional decl modifiers for IR-graphs
5526  *
5527  * @param irg            the IR-graph
5528  * @param dec_modifiers  additional modifiers
5529  */
5530 static void handle_decl_modifier_irg(ir_graph_ptr irg,
5531                                      decl_modifiers_t decl_modifiers)
5532 {
5533         if (decl_modifiers & DM_NAKED) {
5534                 /* TRUE if the declaration includes the Microsoft
5535                    __declspec(naked) specifier. */
5536                 add_irg_additional_properties(irg, mtp_property_naked);
5537         }
5538         if (decl_modifiers & DM_FORCEINLINE) {
5539                 /* TRUE if the declaration includes the
5540                    Microsoft __forceinline specifier. */
5541                 set_irg_inline_property(irg, irg_inline_forced);
5542         }
5543         if (decl_modifiers & DM_NOINLINE) {
5544                 /* TRUE if the declaration includes the Microsoft
5545                    __declspec(noinline) specifier. */
5546                 set_irg_inline_property(irg, irg_inline_forbidden);
5547         }
5548 }
5549
5550 static void add_function_pointer(ir_type *segment, ir_entity *method,
5551                                  const char *unique_template)
5552 {
5553         ir_type   *method_type  = get_entity_type(method);
5554         ir_type   *ptr_type     = new_type_pointer(method_type);
5555
5556         /* these entities don't really have a name but firm only allows
5557          * "" in ld_ident.
5558          * Note that we mustn't give these entities a name since for example
5559          * Mach-O doesn't allow them. */
5560         ident     *ide          = id_unique(unique_template);
5561         ir_entity *ptr          = new_entity(segment, ide, ptr_type);
5562         ir_graph  *irg          = get_const_code_irg();
5563         ir_node   *val          = new_rd_SymConst_addr_ent(NULL, irg, mode_P_code,
5564                                                            method);
5565
5566         set_entity_ld_ident(ptr, new_id_from_chars("", 0));
5567         set_entity_compiler_generated(ptr, 1);
5568         set_entity_visibility(ptr, ir_visibility_private);
5569         add_entity_linkage(ptr, IR_LINKAGE_CONSTANT|IR_LINKAGE_HIDDEN_USER);
5570         set_atomic_ent_value(ptr, val);
5571 }
5572
5573 /**
5574  * Generate possible IJmp branches to a given label block.
5575  */
5576 static void gen_ijmp_branches(ir_node *block)
5577 {
5578         ir_node *ijmp;
5579         for (ijmp = ijmp_list; ijmp != NULL; ijmp = get_irn_link(ijmp)) {
5580                 add_immBlock_pred(block, ijmp);
5581         }
5582 }
5583
5584 /**
5585  * Create code for a function and all inner functions.
5586  *
5587  * @param entity  the function entity
5588  */
5589 static void create_function(entity_t *entity)
5590 {
5591         assert(entity->kind == ENTITY_FUNCTION);
5592         ir_entity *function_entity = get_function_entity(entity, current_outer_frame);
5593
5594         if (entity->function.statement == NULL)
5595                 return;
5596
5597         if (is_main(entity) && enable_main_collect2_hack) {
5598                 prepare_main_collect2(entity);
5599         }
5600
5601         inner_functions     = NULL;
5602         current_trampolines = NULL;
5603
5604         if (entity->declaration.modifiers & DM_CONSTRUCTOR) {
5605                 ir_type *segment = get_segment_type(IR_SEGMENT_CONSTRUCTORS);
5606                 add_function_pointer(segment, function_entity, "constructor_ptr.%u");
5607         }
5608         if (entity->declaration.modifiers & DM_DESTRUCTOR) {
5609                 ir_type *segment = get_segment_type(IR_SEGMENT_DESTRUCTORS);
5610                 add_function_pointer(segment, function_entity, "destructor_ptr.%u");
5611         }
5612
5613         current_function_entity = entity;
5614         current_function_name   = NULL;
5615         current_funcsig         = NULL;
5616
5617         assert(all_labels == NULL);
5618         all_labels = NEW_ARR_F(label_t *, 0);
5619         ijmp_list  = NULL;
5620
5621         int       n_local_vars = get_function_n_local_vars(entity);
5622         ir_graph *irg          = new_ir_graph(function_entity, n_local_vars);
5623         current_ir_graph = irg;
5624
5625         ir_graph *old_current_function = current_function;
5626         current_function = irg;
5627
5628         ir_entity *const old_current_vararg_entity = current_vararg_entity;
5629         current_vararg_entity = NULL;
5630
5631         set_irg_fp_model(irg, firm_fp_model);
5632         tarval_enable_fp_ops(1);
5633         set_irn_dbg_info(get_irg_start_block(irg),
5634                          get_entity_dbg_info(function_entity));
5635
5636         ir_node *first_block = get_cur_block();
5637
5638         /* set inline flags */
5639         if (entity->function.is_inline)
5640                 set_irg_inline_property(irg, irg_inline_recomended);
5641         handle_decl_modifier_irg(irg, entity->declaration.modifiers);
5642
5643         next_value_number_function = 0;
5644         initialize_function_parameters(entity);
5645         current_static_link = entity->function.static_link;
5646
5647         statement_to_firm(entity->function.statement);
5648
5649         ir_node *end_block = get_irg_end_block(irg);
5650
5651         /* do we have a return statement yet? */
5652         if (currently_reachable()) {
5653                 type_t *type = skip_typeref(entity->declaration.type);
5654                 assert(is_type_function(type));
5655                 const function_type_t *func_type   = &type->function;
5656                 const type_t          *return_type
5657                         = skip_typeref(func_type->return_type);
5658
5659                 ir_node *ret;
5660                 if (is_type_atomic(return_type, ATOMIC_TYPE_VOID)) {
5661                         ret = new_Return(get_store(), 0, NULL);
5662                 } else {
5663                         ir_mode *mode;
5664                         if (is_type_scalar(return_type)) {
5665                                 mode = get_ir_mode_storage(func_type->return_type);
5666                         } else {
5667                                 mode = mode_P_data;
5668                         }
5669
5670                         ir_node *in[1];
5671                         /* ยง5.1.2.2.3 main implicitly returns 0 */
5672                         if (is_main(entity)) {
5673                                 in[0] = new_Const(get_mode_null(mode));
5674                         } else {
5675                                 in[0] = new_Unknown(mode);
5676                         }
5677                         ret = new_Return(get_store(), 1, in);
5678                 }
5679                 add_immBlock_pred(end_block, ret);
5680         }
5681
5682         bool has_computed_gotos = false;
5683         for (int i = ARR_LEN(all_labels) - 1; i >= 0; --i) {
5684                 label_t *label = all_labels[i];
5685                 if (label->address_taken) {
5686                         gen_ijmp_branches(label->block);
5687                         has_computed_gotos = true;
5688                 }
5689                 mature_immBlock(label->block);
5690         }
5691         if (has_computed_gotos) {
5692                 /* if we have computed goto's in the function, we cannot inline it */
5693                 if (get_irg_inline_property(irg) >= irg_inline_recomended) {
5694                         source_position_t const *const pos = &entity->base.source_position;
5695                         warningf(WARN_OTHER, pos, "'%N' can never be inlined because it contains a computed goto", entity);
5696                 }
5697                 set_irg_inline_property(irg, irg_inline_forbidden);
5698         }
5699
5700         DEL_ARR_F(all_labels);
5701         all_labels = NULL;
5702
5703         mature_immBlock(first_block);
5704         mature_immBlock(end_block);
5705
5706         irg_finalize_cons(irg);
5707
5708         /* finalize the frame type */
5709         ir_type *frame_type = get_irg_frame_type(irg);
5710         int      n          = get_compound_n_members(frame_type);
5711         int      align_all  = 4;
5712         int      offset     = 0;
5713         for (int i = 0; i < n; ++i) {
5714                 ir_entity *member      = get_compound_member(frame_type, i);
5715                 ir_type   *entity_type = get_entity_type(member);
5716
5717                 int align = get_type_alignment_bytes(entity_type);
5718                 if (align > align_all)
5719                         align_all = align;
5720                 int misalign = 0;
5721                 if (align > 0) {
5722                         misalign  = offset % align;
5723                         if (misalign > 0) {
5724                                 offset += align - misalign;
5725                         }
5726                 }
5727
5728                 set_entity_offset(member, offset);
5729                 offset += get_type_size_bytes(entity_type);
5730         }
5731         set_type_size_bytes(frame_type, offset);
5732         set_type_alignment_bytes(frame_type, align_all);
5733
5734         irg_verify(irg, VERIFY_ENFORCE_SSA);
5735         current_vararg_entity = old_current_vararg_entity;
5736         current_function      = old_current_function;
5737
5738         if (current_trampolines != NULL) {
5739                 DEL_ARR_F(current_trampolines);
5740                 current_trampolines = NULL;
5741         }
5742
5743         /* create inner functions if any */
5744         entity_t **inner = inner_functions;
5745         if (inner != NULL) {
5746                 ir_type *rem_outer_frame      = current_outer_frame;
5747                 current_outer_frame           = get_irg_frame_type(current_ir_graph);
5748                 for (int i = ARR_LEN(inner) - 1; i >= 0; --i) {
5749                         create_function(inner[i]);
5750                 }
5751                 DEL_ARR_F(inner);
5752
5753                 current_outer_frame      = rem_outer_frame;
5754         }
5755 }
5756
5757 static void scope_to_firm(scope_t *scope)
5758 {
5759         /* first pass: create declarations */
5760         entity_t *entity = scope->entities;
5761         for ( ; entity != NULL; entity = entity->base.next) {
5762                 if (entity->base.symbol == NULL)
5763                         continue;
5764
5765                 if (entity->kind == ENTITY_FUNCTION) {
5766                         if (entity->function.btk != BUILTIN_NONE) {
5767                                 /* builtins have no representation */
5768                                 continue;
5769                         }
5770                         (void)get_function_entity(entity, NULL);
5771                 } else if (entity->kind == ENTITY_VARIABLE) {
5772                         create_global_variable(entity);
5773                 } else if (entity->kind == ENTITY_NAMESPACE) {
5774                         scope_to_firm(&entity->namespacee.members);
5775                 }
5776         }
5777
5778         /* second pass: create code/initializers */
5779         entity = scope->entities;
5780         for ( ; entity != NULL; entity = entity->base.next) {
5781                 if (entity->base.symbol == NULL)
5782                         continue;
5783
5784                 if (entity->kind == ENTITY_FUNCTION) {
5785                         if (entity->function.btk != BUILTIN_NONE) {
5786                                 /* builtins have no representation */
5787                                 continue;
5788                         }
5789                         create_function(entity);
5790                 } else if (entity->kind == ENTITY_VARIABLE) {
5791                         assert(entity->declaration.kind
5792                                         == DECLARATION_KIND_GLOBAL_VARIABLE);
5793                         current_ir_graph = get_const_code_irg();
5794                         create_variable_initializer(entity);
5795                 }
5796         }
5797 }
5798
5799 void init_ast2firm(void)
5800 {
5801         obstack_init(&asm_obst);
5802         init_atomic_modes();
5803
5804         ir_set_debug_retrieve(dbg_retrieve);
5805         ir_set_type_debug_retrieve(dbg_print_type_dbg_info);
5806
5807         /* create idents for all known runtime functions */
5808         for (size_t i = 0; i < lengthof(rts_data); ++i) {
5809                 rts_idents[i] = new_id_from_str(rts_data[i].name);
5810         }
5811
5812         entitymap_init(&entitymap);
5813 }
5814
5815 static void init_ir_types(void)
5816 {
5817         static int ir_types_initialized = 0;
5818         if (ir_types_initialized)
5819                 return;
5820         ir_types_initialized = 1;
5821
5822         ir_type_int        = get_ir_type(type_int);
5823         ir_type_char       = get_ir_type(type_char);
5824         ir_type_const_char = get_ir_type(type_const_char);
5825         ir_type_wchar_t    = get_ir_type(type_wchar_t);
5826         ir_type_void       = get_ir_type(type_void);
5827
5828         be_params             = be_get_backend_param();
5829         mode_float_arithmetic = be_params->mode_float_arithmetic;
5830
5831         stack_param_align     = be_params->stack_param_align;
5832 }
5833
5834 void exit_ast2firm(void)
5835 {
5836         entitymap_destroy(&entitymap);
5837         obstack_free(&asm_obst, NULL);
5838 }
5839
5840 static void global_asm_to_firm(statement_t *s)
5841 {
5842         for (; s != NULL; s = s->base.next) {
5843                 assert(s->kind == STATEMENT_ASM);
5844
5845                 char const *const text = s->asms.asm_text.begin;
5846                 size_t            size = s->asms.asm_text.size;
5847
5848                 /* skip the last \0 */
5849                 if (text[size - 1] == '\0')
5850                         --size;
5851
5852                 ident *const id = new_id_from_chars(text, size);
5853                 add_irp_asm(id);
5854         }
5855 }
5856
5857 void translation_unit_to_firm(translation_unit_t *unit)
5858 {
5859         /* initialize firm arithmetic */
5860         tarval_set_integer_overflow_mode(TV_OVERFLOW_WRAP);
5861         ir_set_uninitialized_local_variable_func(uninitialized_local_var);
5862
5863         /* just to be sure */
5864         continue_label           = NULL;
5865         break_label              = NULL;
5866         current_switch_cond      = NULL;
5867         current_translation_unit = unit;
5868
5869         init_ir_types();
5870
5871         scope_to_firm(&unit->scope);
5872         global_asm_to_firm(unit->global_asm);
5873
5874         current_ir_graph         = NULL;
5875         current_translation_unit = NULL;
5876 }