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