• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * sparse/expand.c
3  *
4  * Copyright (C) 2003 Transmeta Corp.
5  *               2003-2004 Linus Torvalds
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23  * THE SOFTWARE.
24  *
25  * expand constant expressions.
26  */
27 #include <stdlib.h>
28 #include <stdarg.h>
29 #include <stddef.h>
30 #include <stdio.h>
31 #include <string.h>
32 #include <ctype.h>
33 #include <unistd.h>
34 #include <fcntl.h>
35 #include <limits.h>
36 
37 #include "lib.h"
38 #include "allocate.h"
39 #include "parse.h"
40 #include "token.h"
41 #include "symbol.h"
42 #include "target.h"
43 #include "expression.h"
44 #include "evaluate.h"
45 #include "expand.h"
46 
47 
48 static int expand_expression(struct expression *);
49 static int expand_statement(struct statement *);
50 
51 // If set, don't issue a warning on divide-by-0, invalid shift, ...
52 // and don't mark the expression as erroneous but leave it as-is.
53 // This allows testing some characteristics of the expression
54 // without creating any side-effects (e.g.: is_zero_constant()).
55 static int conservative;
56 
expand_symbol_expression(struct expression * expr)57 static int expand_symbol_expression(struct expression *expr)
58 {
59 	struct symbol *sym = expr->symbol;
60 
61 	if (sym == &zero_int) {
62 		if (Wundef)
63 			warning(expr->pos, "undefined preprocessor identifier '%s'", show_ident(expr->symbol_name));
64 		expr->type = EXPR_VALUE;
65 		expr->value = 0;
66 		expr->taint = 0;
67 		return 0;
68 	}
69 
70 	// expand compound literals (C99 & C11 6.5.2.5)
71 	// FIXME: is this the correct way to identify them?
72 	//	All compound literals are anonymous but is
73 	//	the reverse true?
74 	if (sym->initializer && !expr->symbol_name)
75 		return expand_expression(sym->initializer);
76 
77 	/* The cost of a symbol expression is lower for on-stack symbols */
78 	return (sym->ctype.modifiers & (MOD_STATIC | MOD_EXTERN)) ? 2 : 1;
79 }
80 
get_longlong(struct expression * expr)81 static long long get_longlong(struct expression *expr)
82 {
83 	int no_expand = expr->ctype->ctype.modifiers & MOD_UNSIGNED;
84 	long long mask = 1ULL << (expr->ctype->bit_size - 1);
85 	long long value = expr->value;
86 	long long ormask, andmask;
87 
88 	if (!(value & mask))
89 		no_expand = 1;
90 	andmask = mask | (mask-1);
91 	ormask = ~andmask;
92 	if (no_expand)
93 		ormask = 0;
94 	return (value & andmask) | ormask;
95 }
96 
cast_value(struct expression * expr,struct symbol * newtype,struct expression * old,struct symbol * oldtype)97 void cast_value(struct expression *expr, struct symbol *newtype,
98 		struct expression *old, struct symbol *oldtype)
99 {
100 	int old_size = oldtype->bit_size;
101 	int new_size = newtype->bit_size;
102 	long long value, mask, signmask;
103 	long long oldmask, oldsignmask, dropped;
104 
105 	if (is_float_type(newtype) || is_float_type(oldtype))
106 		goto Float;
107 
108 	// For pointers and integers, we can just move the value around
109 	expr->type = EXPR_VALUE;
110 	expr->taint = old->taint;
111 	if (old_size == new_size) {
112 		expr->value = old->value;
113 		return;
114 	}
115 
116 	// expand it to the full "long long" value
117 	value = get_longlong(old);
118 
119 Int:
120 	// _Bool requires a zero test rather than truncation.
121 	if (is_bool_type(newtype)) {
122 		expr->value = !!value;
123 		if (!conservative && value != 0 && value != 1)
124 			warning(old->pos, "odd constant _Bool cast (%llx becomes 1)", value);
125 		return;
126 	}
127 
128 	// Truncate it to the new size
129 	signmask = 1ULL << (new_size-1);
130 	mask = signmask | (signmask-1);
131 	expr->value = value & mask;
132 
133 	// Stop here unless checking for truncation
134 	if (!Wcast_truncate || conservative)
135 		return;
136 
137 	// Check if we dropped any bits..
138 	oldsignmask = 1ULL << (old_size-1);
139 	oldmask = oldsignmask | (oldsignmask-1);
140 	dropped = oldmask & ~mask;
141 
142 	// OK if the bits were (and still are) purely sign bits
143 	if (value & dropped) {
144 		if (!(value & oldsignmask) || !(value & signmask) || (value & dropped) != dropped)
145 			warning(old->pos, "cast truncates bits from constant value (%llx becomes %llx)",
146 				value & oldmask,
147 				value & mask);
148 	}
149 	return;
150 
151 Float:
152 	if (!is_float_type(newtype)) {
153 		value = (long long)old->fvalue;
154 		expr->type = EXPR_VALUE;
155 		expr->taint = 0;
156 		goto Int;
157 	}
158 
159 	if (!is_float_type(oldtype))
160 		expr->fvalue = (long double)get_longlong(old);
161 	else
162 		expr->fvalue = old->fvalue;
163 
164 	if (newtype->rank <= 0) {
165 		if (newtype->rank == 0)
166 			expr->fvalue = (double)expr->fvalue;
167 		else
168 			expr->fvalue = (float)expr->fvalue;
169 	}
170 	expr->type = EXPR_FVALUE;
171 }
172 
173 /* Return true if constant shift size is valid */
check_shift_count(struct expression * expr,struct expression * right)174 static bool check_shift_count(struct expression *expr, struct expression *right)
175 {
176 	struct symbol *ctype = expr->ctype;
177 	long long count = get_longlong(right);
178 
179 	if (count >= 0 && count < ctype->bit_size)
180 		return true;
181 	return false;
182 }
183 
184 /*
185  * CAREFUL! We need to get the size and sign of the
186  * result right!
187  */
188 #define CONVERT(op,s)	(((op)<<1)+(s))
189 #define SIGNED(op)	CONVERT(op, 1)
190 #define UNSIGNED(op)	CONVERT(op, 0)
simplify_int_binop(struct expression * expr,struct symbol * ctype)191 static int simplify_int_binop(struct expression *expr, struct symbol *ctype)
192 {
193 	struct expression *left = expr->left, *right = expr->right;
194 	unsigned long long v, l, r, mask;
195 	signed long long sl, sr;
196 	int is_signed;
197 
198 	if (right->type != EXPR_VALUE)
199 		return 0;
200 	r = right->value;
201 	if (expr->op == SPECIAL_LEFTSHIFT || expr->op == SPECIAL_RIGHTSHIFT) {
202 		if (!check_shift_count(expr, right))
203 			return 0;
204 	}
205 	if (left->type != EXPR_VALUE)
206 		return 0;
207 	l = left->value; r = right->value;
208 	is_signed = !(ctype->ctype.modifiers & MOD_UNSIGNED);
209 	mask = 1ULL << (ctype->bit_size-1);
210 	sl = l; sr = r;
211 	if (is_signed && (sl & mask))
212 		sl |= ~(mask-1);
213 	if (is_signed && (sr & mask))
214 		sr |= ~(mask-1);
215 
216 	switch (CONVERT(expr->op,is_signed)) {
217 	case SIGNED('+'):
218 	case UNSIGNED('+'):
219 		v = l + r;
220 		break;
221 
222 	case SIGNED('-'):
223 	case UNSIGNED('-'):
224 		v = l - r;
225 		break;
226 
227 	case SIGNED('&'):
228 	case UNSIGNED('&'):
229 		v = l & r;
230 		break;
231 
232 	case SIGNED('|'):
233 	case UNSIGNED('|'):
234 		v = l | r;
235 		break;
236 
237 	case SIGNED('^'):
238 	case UNSIGNED('^'):
239 		v = l ^ r;
240 		break;
241 
242 	case SIGNED('*'):
243 		v = sl * sr;
244 		break;
245 
246 	case UNSIGNED('*'):
247 		v = l * r;
248 		break;
249 
250 	case SIGNED('/'):
251 		if (!r)
252 			goto Div;
253 		if (l == mask && sr == -1)
254 			goto Overflow;
255 		v = sl / sr;
256 		break;
257 
258 	case UNSIGNED('/'):
259 		if (!r) goto Div;
260 		v = l / r;
261 		break;
262 
263 	case SIGNED('%'):
264 		if (!r)
265 			goto Div;
266 		if (l == mask && sr == -1)
267 			goto Overflow;
268 		v = sl % sr;
269 		break;
270 
271 	case UNSIGNED('%'):
272 		if (!r) goto Div;
273 		v = l % r;
274 		break;
275 
276 	case SIGNED(SPECIAL_LEFTSHIFT):
277 	case UNSIGNED(SPECIAL_LEFTSHIFT):
278 		v = l << r;
279 		break;
280 
281 	case SIGNED(SPECIAL_RIGHTSHIFT):
282 		v = sl >> r;
283 		break;
284 
285 	case UNSIGNED(SPECIAL_RIGHTSHIFT):
286 		v = l >> r;
287 		break;
288 
289 	default:
290 		return 0;
291 	}
292 	mask = mask | (mask-1);
293 	expr->value = v & mask;
294 	expr->type = EXPR_VALUE;
295 	expr->taint = left->taint | right->taint;
296 	return 1;
297 Div:
298 	if (!conservative)
299 		warning(expr->pos, "division by zero");
300 	return 0;
301 Overflow:
302 	if (!conservative)
303 		warning(expr->pos, "constant integer operation overflow");
304 	return 0;
305 }
306 
simplify_cmp_binop(struct expression * expr,struct symbol * ctype)307 static int simplify_cmp_binop(struct expression *expr, struct symbol *ctype)
308 {
309 	struct expression *left = expr->left, *right = expr->right;
310 	unsigned long long l, r, mask;
311 	signed long long sl, sr;
312 
313 	if (left->type != EXPR_VALUE || right->type != EXPR_VALUE)
314 		return 0;
315 	l = left->value; r = right->value;
316 	mask = 1ULL << (ctype->bit_size-1);
317 	sl = l; sr = r;
318 	if (sl & mask)
319 		sl |= ~(mask-1);
320 	if (sr & mask)
321 		sr |= ~(mask-1);
322 	switch (expr->op) {
323 	case '<':		expr->value = sl < sr; break;
324 	case '>':		expr->value = sl > sr; break;
325 	case SPECIAL_LTE:	expr->value = sl <= sr; break;
326 	case SPECIAL_GTE:	expr->value = sl >= sr; break;
327 	case SPECIAL_EQUAL:	expr->value = l == r; break;
328 	case SPECIAL_NOTEQUAL:	expr->value = l != r; break;
329 	case SPECIAL_UNSIGNED_LT:expr->value = l < r; break;
330 	case SPECIAL_UNSIGNED_GT:expr->value = l > r; break;
331 	case SPECIAL_UNSIGNED_LTE:expr->value = l <= r; break;
332 	case SPECIAL_UNSIGNED_GTE:expr->value = l >= r; break;
333 	}
334 	expr->type = EXPR_VALUE;
335 	expr->taint = left->taint | right->taint;
336 	return 1;
337 }
338 
simplify_float_binop(struct expression * expr)339 static int simplify_float_binop(struct expression *expr)
340 {
341 	struct expression *left = expr->left, *right = expr->right;
342 	int rank = expr->ctype->rank;
343 	long double l, r, res;
344 
345 	if (left->type != EXPR_FVALUE || right->type != EXPR_FVALUE)
346 		return 0;
347 
348 	l = left->fvalue;
349 	r = right->fvalue;
350 
351 	if (rank > 0) {
352 		switch (expr->op) {
353 		case '+':	res = l + r; break;
354 		case '-':	res = l - r; break;
355 		case '*':	res = l * r; break;
356 		case '/':	if (!r) goto Div;
357 				res = l / r; break;
358 		default: return 0;
359 		}
360 	} else if (rank == 0) {
361 		switch (expr->op) {
362 		case '+':	res = (double) l + (double) r; break;
363 		case '-':	res = (double) l - (double) r; break;
364 		case '*':	res = (double) l * (double) r; break;
365 		case '/':	if (!r) goto Div;
366 				res = (double) l / (double) r; break;
367 		default: return 0;
368 		}
369 	} else {
370 		switch (expr->op) {
371 		case '+':	res = (float)l + (float)r; break;
372 		case '-':	res = (float)l - (float)r; break;
373 		case '*':	res = (float)l * (float)r; break;
374 		case '/':	if (!r) goto Div;
375 				res = (float)l / (float)r; break;
376 		default: return 0;
377 		}
378 	}
379 	expr->type = EXPR_FVALUE;
380 	expr->fvalue = res;
381 	return 1;
382 Div:
383 	if (!conservative)
384 		warning(expr->pos, "division by zero");
385 	return 0;
386 }
387 
simplify_float_cmp(struct expression * expr,struct symbol * ctype)388 static int simplify_float_cmp(struct expression *expr, struct symbol *ctype)
389 {
390 	struct expression *left = expr->left, *right = expr->right;
391 	long double l, r;
392 
393 	if (left->type != EXPR_FVALUE || right->type != EXPR_FVALUE)
394 		return 0;
395 
396 	l = left->fvalue;
397 	r = right->fvalue;
398 	switch (expr->op) {
399 	case '<':		expr->value = l < r; break;
400 	case '>':		expr->value = l > r; break;
401 	case SPECIAL_LTE:	expr->value = l <= r; break;
402 	case SPECIAL_GTE:	expr->value = l >= r; break;
403 	case SPECIAL_EQUAL:	expr->value = l == r; break;
404 	case SPECIAL_NOTEQUAL:	expr->value = l != r; break;
405 	}
406 	expr->type = EXPR_VALUE;
407 	expr->taint = 0;
408 	return 1;
409 }
410 
expand_binop(struct expression * expr)411 static int expand_binop(struct expression *expr)
412 {
413 	int cost;
414 
415 	cost = expand_expression(expr->left);
416 	cost += expand_expression(expr->right);
417 	if (simplify_int_binop(expr, expr->ctype))
418 		return 0;
419 	if (simplify_float_binop(expr))
420 		return 0;
421 	return cost + 1;
422 }
423 
expand_logical(struct expression * expr)424 static int expand_logical(struct expression *expr)
425 {
426 	struct expression *left = expr->left;
427 	struct expression *right;
428 	int cost, rcost;
429 
430 	/* Do immediate short-circuiting ... */
431 	cost = expand_expression(left);
432 	if (left->type == EXPR_VALUE) {
433 		if (expr->op == SPECIAL_LOGICAL_AND) {
434 			if (!left->value) {
435 				expr->type = EXPR_VALUE;
436 				expr->value = 0;
437 				expr->taint = left->taint;
438 				return 0;
439 			}
440 		} else {
441 			if (left->value) {
442 				expr->type = EXPR_VALUE;
443 				expr->value = 1;
444 				expr->taint = left->taint;
445 				return 0;
446 			}
447 		}
448 	}
449 
450 	right = expr->right;
451 	rcost = expand_expression(right);
452 	if (left->type == EXPR_VALUE && right->type == EXPR_VALUE) {
453 		/*
454 		 * We know the left value doesn't matter, since
455 		 * otherwise we would have short-circuited it..
456 		 */
457 		expr->type = EXPR_VALUE;
458 		expr->value = right->value != 0;
459 		expr->taint = left->taint | right->taint;
460 		return 0;
461 	}
462 
463 	/*
464 	 * If the right side is safe and cheaper than a branch,
465 	 * just avoid the branch and turn it into a regular binop
466 	 * style SAFELOGICAL.
467 	 */
468 	if (rcost < BRANCH_COST) {
469 		expr->type = EXPR_BINOP;
470 		rcost -= BRANCH_COST - 1;
471 	}
472 
473 	return cost + BRANCH_COST + rcost;
474 }
475 
expand_comma(struct expression * expr)476 static int expand_comma(struct expression *expr)
477 {
478 	int cost;
479 
480 	cost = expand_expression(expr->left);
481 	cost += expand_expression(expr->right);
482 	if (expr->left->type == EXPR_VALUE || expr->left->type == EXPR_FVALUE) {
483 		unsigned flags = expr->flags;
484 		unsigned taint;
485 		taint = expr->left->type == EXPR_VALUE ? expr->left->taint : 0;
486 		*expr = *expr->right;
487 		expr->flags = flags;
488 		if (expr->type == EXPR_VALUE)
489 			expr->taint |= Taint_comma | taint;
490 	}
491 	return cost;
492 }
493 
494 #define MOD_IGN (MOD_QUALIFIER)
495 
compare_types(int op,struct symbol * left,struct symbol * right)496 static int compare_types(int op, struct symbol *left, struct symbol *right)
497 {
498 	struct ctype c1 = {.base_type = left};
499 	struct ctype c2 = {.base_type = right};
500 	switch (op) {
501 	case SPECIAL_EQUAL:
502 		return !type_difference(&c1, &c2, MOD_IGN, MOD_IGN);
503 	case SPECIAL_NOTEQUAL:
504 		return type_difference(&c1, &c2, MOD_IGN, MOD_IGN) != NULL;
505 	case '<':
506 		return left->bit_size < right->bit_size;
507 	case '>':
508 		return left->bit_size > right->bit_size;
509 	case SPECIAL_LTE:
510 		return left->bit_size <= right->bit_size;
511 	case SPECIAL_GTE:
512 		return left->bit_size >= right->bit_size;
513 	}
514 	return 0;
515 }
516 
expand_compare(struct expression * expr)517 static int expand_compare(struct expression *expr)
518 {
519 	struct expression *left = expr->left, *right = expr->right;
520 	int cost;
521 
522 	cost = expand_expression(left);
523 	cost += expand_expression(right);
524 
525 	if (left && right) {
526 		/* Type comparison? */
527 		if (left->type == EXPR_TYPE && right->type == EXPR_TYPE) {
528 			int op = expr->op;
529 			expr->type = EXPR_VALUE;
530 			expr->value = compare_types(op, left->symbol, right->symbol);
531 			expr->taint = 0;
532 			return 0;
533 		}
534 		if (simplify_cmp_binop(expr, left->ctype))
535 			return 0;
536 		if (simplify_float_cmp(expr, left->ctype))
537 			return 0;
538 	}
539 	return cost + 1;
540 }
541 
expand_conditional(struct expression * expr)542 static int expand_conditional(struct expression *expr)
543 {
544 	struct expression *cond = expr->conditional;
545 	struct expression *valt = expr->cond_true;
546 	struct expression *valf = expr->cond_false;
547 	int cost, cond_cost;
548 
549 	cond_cost = expand_expression(cond);
550 	if (cond->type == EXPR_VALUE) {
551 		unsigned flags = expr->flags;
552 		if (!cond->value)
553 			valt = valf;
554 		if (!valt)
555 			valt = cond;
556 		cost = expand_expression(valt);
557 		*expr = *valt;
558 		expr->flags = flags;
559 		if (expr->type == EXPR_VALUE)
560 			expr->taint |= cond->taint;
561 		return cost;
562 	}
563 
564 	cost = expand_expression(valt);
565 	cost += expand_expression(valf);
566 
567 	if (cost < SELECT_COST) {
568 		expr->type = EXPR_SELECT;
569 		cost -= BRANCH_COST - 1;
570 	}
571 
572 	return cost + cond_cost + BRANCH_COST;
573 }
574 
check_assignment(struct expression * expr)575 static void check_assignment(struct expression *expr)
576 {
577 	struct expression *right;
578 
579 	switch (expr->op) {
580 	case SPECIAL_SHL_ASSIGN:
581 	case SPECIAL_SHR_ASSIGN:
582 		right = expr->right;
583 		if (right->type != EXPR_VALUE)
584 			break;
585 		check_shift_count(expr, right);
586 		break;
587 	}
588 	return;
589 }
590 
expand_assignment(struct expression * expr)591 static int expand_assignment(struct expression *expr)
592 {
593 	expand_expression(expr->left);
594 	expand_expression(expr->right);
595 
596 	if (!conservative)
597 		check_assignment(expr);
598 	return SIDE_EFFECTS;
599 }
600 
expand_addressof(struct expression * expr)601 static int expand_addressof(struct expression *expr)
602 {
603 	return expand_expression(expr->unop);
604 }
605 
606 ///
607 // lookup the type of a struct's memeber at the requested offset
find_member(struct symbol * sym,int offset)608 static struct symbol *find_member(struct symbol *sym, int offset)
609 {
610 	struct ptr_list *head, *list;
611 
612 	head = (struct ptr_list *) sym->symbol_list;
613 	list = head;
614 	if (!head)
615 		return NULL;
616 	do {
617 		int nr = list->nr;
618 		int i;
619 		for (i = 0; i < nr; i++) {
620 			struct symbol *ent = (struct symbol *) list->list[i];
621 			int curr = ent->offset;
622 			if (curr == offset)
623 				return ent;
624 			if (curr > offset)
625 				return NULL;
626 		}
627 	} while ((list = list->next) != head);
628 	return NULL;
629 }
630 
631 ///
632 // lookup a suitable default initializer value at the requested offset
default_initializer(struct symbol * sym,int offset)633 static struct expression *default_initializer(struct symbol *sym, int offset)
634 {
635 	static struct expression value;
636 	struct symbol *type;
637 
638 redo:
639 	switch (sym->type) {
640 	case SYM_NODE:
641 		sym = sym->ctype.base_type;
642 		goto redo;
643 	case SYM_STRUCT:
644 		type = find_member(sym, offset);
645 		if (!type)
646 			return NULL;
647 		break;
648 	case SYM_ARRAY:
649 		type = sym->ctype.base_type;
650 		break;
651 	default:
652 		return NULL;
653 	}
654 
655 	if (is_integral_type(type))
656 		value.type = EXPR_VALUE;
657 	else if (is_float_type(type))
658 		value.type = EXPR_FVALUE;
659 	else
660 		return NULL;
661 
662 	value.ctype = type;
663 	return &value;
664 }
665 
666 /*
667  * Look up a trustable initializer value at the requested offset.
668  *
669  * Return NULL if no such value can be found or statically trusted.
670  */
constant_symbol_value(struct symbol * sym,int offset)671 static struct expression *constant_symbol_value(struct symbol *sym, int offset)
672 {
673 	struct expression *value;
674 
675 	if (sym->ctype.modifiers & MOD_ACCESS)
676 		return NULL;
677 	value = sym->initializer;
678 	if (!value)
679 		return NULL;
680 	if (value->type == EXPR_INITIALIZER) {
681 		struct expression *entry;
682 		FOR_EACH_PTR(value->expr_list, entry) {
683 			if (entry->type != EXPR_POS) {
684 				if (offset)
685 					continue;
686 				return entry;
687 			}
688 			if (entry->init_offset < offset)
689 				continue;
690 			if (entry->init_offset > offset)
691 				break;
692 			return entry->init_expr;
693 		} END_FOR_EACH_PTR(entry);
694 
695 		value = default_initializer(sym, offset);
696 	}
697 	return value;
698 }
699 
expand_dereference(struct expression * expr)700 static int expand_dereference(struct expression *expr)
701 {
702 	struct expression *unop = expr->unop;
703 	unsigned int offset;
704 
705 	expand_expression(unop);
706 
707 	/*
708 	 * NOTE! We get a bogus warning right now for some special
709 	 * cases: apparently I've screwed up the optimization of
710 	 * a zero-offset dereference, and the ctype is wrong.
711 	 *
712 	 * Leave the warning in anyway, since this is also a good
713 	 * test for me to get the type evaluation right..
714 	 */
715 	if (expr->ctype->ctype.modifiers & MOD_NODEREF)
716 		warning(unop->pos, "dereference of noderef expression");
717 
718 	/*
719 	 * Is it "symbol" or "symbol + offset"?
720 	 */
721 	offset = 0;
722 	while (unop->type == EXPR_BINOP && unop->op == '+') {
723 		struct expression *right = unop->right;
724 		if (right->type != EXPR_VALUE)
725 			break;
726 		offset += right->value;
727 		unop = unop->left;
728 	}
729 
730 	if (unop->type == EXPR_SYMBOL) {
731 		struct symbol *sym = unop->symbol;
732 		struct symbol *ctype = expr->ctype;
733 		struct expression *value = constant_symbol_value(sym, offset);
734 
735 		/* Const symbol with a constant initializer? */
736 		if (value && value->ctype) {
737 			if (ctype->bit_size != value->ctype->bit_size)
738 				return UNSAFE;
739 			if (value->type == EXPR_VALUE) {
740 				if (!is_integral_type(ctype))
741 					return UNSAFE;
742 				if (is_bitfield_type(value->ctype))
743 					return UNSAFE;
744 				expr->type = EXPR_VALUE;
745 				expr->value = value->value;
746 				expr->taint = 0;
747 				return 0;
748 			} else if (value->type == EXPR_FVALUE) {
749 				if (!is_float_type(ctype))
750 					return UNSAFE;
751 				expr->type = EXPR_FVALUE;
752 				expr->fvalue = value->fvalue;
753 				return 0;
754 			}
755 		}
756 
757 		/* Direct symbol dereference? Cheap and safe */
758 		return (sym->ctype.modifiers & (MOD_STATIC | MOD_EXTERN)) ? 2 : 1;
759 	}
760 
761 	return UNSAFE;
762 }
763 
simplify_preop(struct expression * expr)764 static int simplify_preop(struct expression *expr)
765 {
766 	struct expression *op = expr->unop;
767 	unsigned long long v, mask;
768 
769 	if (op->type != EXPR_VALUE)
770 		return 0;
771 
772 	mask = 1ULL << (expr->ctype->bit_size-1);
773 	v = op->value;
774 	switch (expr->op) {
775 	case '+': break;
776 	case '-':
777 		if (v == mask && !(expr->ctype->ctype.modifiers & MOD_UNSIGNED))
778 			goto Overflow;
779 		v = -v;
780 		break;
781 	case '!': v = !v; break;
782 	case '~': v = ~v; break;
783 	default: return 0;
784 	}
785 	mask = mask | (mask-1);
786 	expr->value = v & mask;
787 	expr->type = EXPR_VALUE;
788 	expr->taint = op->taint;
789 	return 1;
790 
791 Overflow:
792 	if (!conservative)
793 		warning(expr->pos, "constant integer operation overflow");
794 	return 0;
795 }
796 
simplify_float_preop(struct expression * expr)797 static int simplify_float_preop(struct expression *expr)
798 {
799 	struct expression *op = expr->unop;
800 	long double v;
801 
802 	if (op->type != EXPR_FVALUE)
803 		return 0;
804 	v = op->fvalue;
805 	switch (expr->op) {
806 	case '+': break;
807 	case '-': v = -v; break;
808 	default: return 0;
809 	}
810 	expr->fvalue = v;
811 	expr->type = EXPR_FVALUE;
812 	return 1;
813 }
814 
815 /*
816  * Unary post-ops: x++ and x--
817  */
expand_postop(struct expression * expr)818 static int expand_postop(struct expression *expr)
819 {
820 	expand_expression(expr->unop);
821 	return SIDE_EFFECTS;
822 }
823 
expand_preop(struct expression * expr)824 static int expand_preop(struct expression *expr)
825 {
826 	int cost;
827 
828 	switch (expr->op) {
829 	case '*':
830 		return expand_dereference(expr);
831 
832 	case '&':
833 		return expand_addressof(expr);
834 
835 	case SPECIAL_INCREMENT:
836 	case SPECIAL_DECREMENT:
837 		/*
838 		 * From a type evaluation standpoint the preops are
839 		 * the same as the postops
840 		 */
841 		return expand_postop(expr);
842 
843 	default:
844 		break;
845 	}
846 	cost = expand_expression(expr->unop);
847 
848 	if (simplify_preop(expr))
849 		return 0;
850 	if (simplify_float_preop(expr))
851 		return 0;
852 	return cost + 1;
853 }
854 
expand_arguments(struct expression_list * head)855 static int expand_arguments(struct expression_list *head)
856 {
857 	int cost = 0;
858 	struct expression *expr;
859 
860 	FOR_EACH_PTR (head, expr) {
861 		cost += expand_expression(expr);
862 	} END_FOR_EACH_PTR(expr);
863 	return cost;
864 }
865 
expand_cast(struct expression * expr)866 static int expand_cast(struct expression *expr)
867 {
868 	int cost;
869 	struct expression *target = expr->cast_expression;
870 
871 	cost = expand_expression(target);
872 
873 	/* Simplify normal integer casts.. */
874 	if (target->type == EXPR_VALUE || target->type == EXPR_FVALUE) {
875 		cast_value(expr, expr->ctype, target, target->ctype);
876 		return 0;
877 	}
878 	return cost + 1;
879 }
880 
881 /*
882  * expand a call expression with a symbol. This
883  * should expand builtins.
884  */
expand_symbol_call(struct expression * expr,int cost)885 static int expand_symbol_call(struct expression *expr, int cost)
886 {
887 	struct expression *fn = expr->fn;
888 	struct symbol *ctype = fn->ctype;
889 
890 	expand_expression(fn);
891 
892 	if (fn->type != EXPR_PREOP)
893 		return SIDE_EFFECTS;
894 
895 	if (ctype->ctype.modifiers & MOD_INLINE) {
896 		struct symbol *def;
897 
898 		def = ctype->definition ? ctype->definition : ctype;
899 		if (inline_function(expr, def)) {
900 			struct symbol *fn = def->ctype.base_type;
901 			struct symbol *curr = current_fn;
902 
903 			current_fn = def;
904 			evaluate_statement(expr->statement);
905 			current_fn = curr;
906 
907 			fn->expanding = 1;
908 			cost = expand_expression(expr);
909 			fn->expanding = 0;
910 			return cost;
911 		}
912 	}
913 
914 	if (ctype->op && ctype->op->expand)
915 		return ctype->op->expand(expr, cost);
916 
917 	if (ctype->ctype.modifiers & MOD_PURE)
918 		return cost + 1;
919 
920 	return SIDE_EFFECTS;
921 }
922 
expand_call(struct expression * expr)923 static int expand_call(struct expression *expr)
924 {
925 	int cost;
926 	struct symbol *sym;
927 	struct expression *fn = expr->fn;
928 
929 	cost = expand_arguments(expr->args);
930 	sym = fn->ctype;
931 	if (!sym) {
932 		expression_error(expr, "function has no type");
933 		return SIDE_EFFECTS;
934 	}
935 	if (sym->type == SYM_NODE)
936 		return expand_symbol_call(expr, cost);
937 
938 	return SIDE_EFFECTS;
939 }
940 
expand_expression_list(struct expression_list * list)941 static int expand_expression_list(struct expression_list *list)
942 {
943 	int cost = 0;
944 	struct expression *expr;
945 
946 	FOR_EACH_PTR(list, expr) {
947 		cost += expand_expression(expr);
948 	} END_FOR_EACH_PTR(expr);
949 	return cost;
950 }
951 
952 /*
953  * We can simplify nested position expressions if
954  * this is a simple (single) positional expression.
955  */
expand_pos_expression(struct expression * expr)956 static int expand_pos_expression(struct expression *expr)
957 {
958 	struct expression *nested = expr->init_expr;
959 	unsigned long offset = expr->init_offset;
960 	int nr = expr->init_nr;
961 
962 	if (nr == 1) {
963 		switch (nested->type) {
964 		case EXPR_POS:
965 			offset += nested->init_offset;
966 			*expr = *nested;
967 			expr->init_offset = offset;
968 			nested = expr;
969 			break;
970 
971 		case EXPR_INITIALIZER: {
972 			struct expression *reuse = nested, *entry;
973 			*expr = *nested;
974 			FOR_EACH_PTR(expr->expr_list, entry) {
975 				if (entry->type == EXPR_POS) {
976 					entry->init_offset += offset;
977 				} else {
978 					if (!reuse) {
979 						/*
980 						 * This happens rarely, but it can happen
981 						 * with bitfields that are all at offset
982 						 * zero..
983 						 */
984 						reuse = alloc_expression(entry->pos, EXPR_POS);
985 					}
986 					reuse->type = EXPR_POS;
987 					reuse->ctype = entry->ctype;
988 					reuse->init_offset = offset;
989 					reuse->init_nr = 1;
990 					reuse->init_expr = entry;
991 					REPLACE_CURRENT_PTR(entry, reuse);
992 					reuse = NULL;
993 				}
994 			} END_FOR_EACH_PTR(entry);
995 			nested = expr;
996 			break;
997 		}
998 
999 		default:
1000 			break;
1001 		}
1002 	}
1003 	return expand_expression(nested);
1004 }
1005 
bit_offset(const struct expression * expr)1006 static unsigned long bit_offset(const struct expression *expr)
1007 {
1008 	unsigned long offset = 0;
1009 	while (expr->type == EXPR_POS) {
1010 		offset += bytes_to_bits(expr->init_offset);
1011 		expr = expr->init_expr;
1012 	}
1013 	if (expr && expr->ctype)
1014 		offset += expr->ctype->bit_offset;
1015 	return offset;
1016 }
1017 
bit_range(const struct expression * expr)1018 static unsigned long bit_range(const struct expression *expr)
1019 {
1020 	unsigned long range = 0;
1021 	unsigned long size = 0;
1022 	while (expr->type == EXPR_POS) {
1023 		unsigned long nr = expr->init_nr;
1024 		size = expr->ctype->bit_size;
1025 		range += (nr - 1) * size;
1026 		expr = expr->init_expr;
1027 	}
1028 	range += size;
1029 	return range;
1030 }
1031 
compare_expressions(const void * _a,const void * _b)1032 static int compare_expressions(const void *_a, const void *_b)
1033 {
1034 	const struct expression *a = _a;
1035 	const struct expression *b = _b;
1036 	unsigned long a_pos = bit_offset(a);
1037 	unsigned long b_pos = bit_offset(b);
1038 
1039 	return (a_pos < b_pos) ? -1 : (a_pos == b_pos) ? 0 : 1;
1040 }
1041 
sort_expression_list(struct expression_list ** list)1042 static void sort_expression_list(struct expression_list **list)
1043 {
1044 	sort_list((struct ptr_list **)list, compare_expressions);
1045 }
1046 
verify_nonoverlapping(struct expression_list ** list,struct expression * expr)1047 static void verify_nonoverlapping(struct expression_list **list, struct expression *expr)
1048 {
1049 	struct expression *a = NULL;
1050 	unsigned long max = 0;
1051 	unsigned long whole = expr->ctype->bit_size;
1052 	struct expression *b;
1053 
1054 	if (!Woverride_init)
1055 		return;
1056 
1057 	FOR_EACH_PTR(*list, b) {
1058 		unsigned long off, end;
1059 		if (!b->ctype || !b->ctype->bit_size)
1060 			continue;
1061 		off = bit_offset(b);
1062 		if (a && off < max) {
1063 			warning(a->pos, "Initializer entry defined twice");
1064 			info(b->pos, "  also defined here");
1065 			if (!Woverride_init_all)
1066 				return;
1067 		}
1068 		end = off + bit_range(b);
1069 		if (!a && !Woverride_init_whole_range) {
1070 			// If first entry is the whole range, do not let
1071 			// any warning about it (this allow to initialize
1072 			// an array with some default value and then override
1073 			// some specific entries).
1074 			if (off == 0 && end == whole)
1075 				continue;
1076 		}
1077 		if (end > max) {
1078 			max = end;
1079 			a = b;
1080 		}
1081 	} END_FOR_EACH_PTR(b);
1082 }
1083 
expand_expression(struct expression * expr)1084 static int expand_expression(struct expression *expr)
1085 {
1086 	if (!expr)
1087 		return 0;
1088 	if (!expr->ctype || expr->ctype == &bad_ctype)
1089 		return UNSAFE;
1090 
1091 	switch (expr->type) {
1092 	case EXPR_VALUE:
1093 	case EXPR_FVALUE:
1094 	case EXPR_STRING:
1095 		return 0;
1096 	case EXPR_TYPE:
1097 	case EXPR_SYMBOL:
1098 		return expand_symbol_expression(expr);
1099 	case EXPR_BINOP:
1100 		return expand_binop(expr);
1101 
1102 	case EXPR_LOGICAL:
1103 		return expand_logical(expr);
1104 
1105 	case EXPR_COMMA:
1106 		return expand_comma(expr);
1107 
1108 	case EXPR_COMPARE:
1109 		return expand_compare(expr);
1110 
1111 	case EXPR_ASSIGNMENT:
1112 		return expand_assignment(expr);
1113 
1114 	case EXPR_PREOP:
1115 		return expand_preop(expr);
1116 
1117 	case EXPR_POSTOP:
1118 		return expand_postop(expr);
1119 
1120 	case EXPR_CAST:
1121 	case EXPR_FORCE_CAST:
1122 	case EXPR_IMPLIED_CAST:
1123 		return expand_cast(expr);
1124 
1125 	case EXPR_CALL:
1126 		return expand_call(expr);
1127 
1128 	case EXPR_DEREF:
1129 		warning(expr->pos, "we should not have an EXPR_DEREF left at expansion time");
1130 		return UNSAFE;
1131 
1132 	case EXPR_SELECT:
1133 	case EXPR_CONDITIONAL:
1134 		return expand_conditional(expr);
1135 
1136 	case EXPR_STATEMENT: {
1137 		struct statement *stmt = expr->statement;
1138 		int cost = expand_statement(stmt);
1139 
1140 		if (stmt->type == STMT_EXPRESSION && stmt->expression)
1141 			*expr = *stmt->expression;
1142 		return cost;
1143 	}
1144 
1145 	case EXPR_LABEL:
1146 		return 0;
1147 
1148 	case EXPR_INITIALIZER:
1149 		sort_expression_list(&expr->expr_list);
1150 		verify_nonoverlapping(&expr->expr_list, expr);
1151 		return expand_expression_list(expr->expr_list);
1152 
1153 	case EXPR_IDENTIFIER:
1154 		return UNSAFE;
1155 
1156 	case EXPR_INDEX:
1157 		return UNSAFE;
1158 
1159 	case EXPR_SLICE:
1160 		return expand_expression(expr->base) + 1;
1161 
1162 	case EXPR_POS:
1163 		return expand_pos_expression(expr);
1164 
1165 	case EXPR_GENERIC:
1166 	case EXPR_SIZEOF:
1167 	case EXPR_PTRSIZEOF:
1168 	case EXPR_ALIGNOF:
1169 	case EXPR_OFFSETOF:
1170 		expression_error(expr, "internal front-end error: sizeof in expansion?");
1171 		return UNSAFE;
1172 	}
1173 	return SIDE_EFFECTS;
1174 }
1175 
expand_const_expression(struct expression * expr,const char * where)1176 static void expand_const_expression(struct expression *expr, const char *where)
1177 {
1178 	if (expr) {
1179 		expand_expression(expr);
1180 		if (expr->type != EXPR_VALUE) {
1181 			expression_error(expr, "Expected constant expression in %s", where);
1182 			expr->ctype = &int_ctype;
1183 			expr->type = EXPR_VALUE;
1184 			expr->value = 0;
1185 		}
1186 	}
1187 }
1188 
expand_symbol(struct symbol * sym)1189 int expand_symbol(struct symbol *sym)
1190 {
1191 	int retval;
1192 	struct symbol *base_type;
1193 
1194 	if (!sym)
1195 		return 0;
1196 	base_type = sym->ctype.base_type;
1197 	if (!base_type)
1198 		return 0;
1199 
1200 	retval = expand_expression(sym->initializer);
1201 	/* expand the body of the symbol */
1202 	if (base_type->type == SYM_FN) {
1203 		if (base_type->stmt)
1204 			expand_statement(base_type->stmt);
1205 	}
1206 	return retval;
1207 }
1208 
expand_return_expression(struct statement * stmt)1209 static void expand_return_expression(struct statement *stmt)
1210 {
1211 	expand_expression(stmt->expression);
1212 }
1213 
expand_if_statement(struct statement * stmt)1214 static int expand_if_statement(struct statement *stmt)
1215 {
1216 	struct expression *expr = stmt->if_conditional;
1217 
1218 	if (!expr || !expr->ctype || expr->ctype == &bad_ctype)
1219 		return UNSAFE;
1220 
1221 	expand_expression(expr);
1222 
1223 /* This is only valid if nobody jumps into the "dead" side */
1224 #if 0
1225 	/* Simplify constant conditionals without even evaluating the false side */
1226 	if (expr->type == EXPR_VALUE) {
1227 		struct statement *simple;
1228 		simple = expr->value ? stmt->if_true : stmt->if_false;
1229 
1230 		/* Nothing? */
1231 		if (!simple) {
1232 			stmt->type = STMT_NONE;
1233 			return 0;
1234 		}
1235 		expand_statement(simple);
1236 		*stmt = *simple;
1237 		return SIDE_EFFECTS;
1238 	}
1239 #endif
1240 	expand_statement(stmt->if_true);
1241 	expand_statement(stmt->if_false);
1242 	return SIDE_EFFECTS;
1243 }
1244 
expand_asm_statement(struct statement * stmt)1245 static int expand_asm_statement(struct statement *stmt)
1246 {
1247 	struct asm_operand *op;
1248 	int cost = 0;
1249 
1250 	FOR_EACH_PTR(stmt->asm_outputs, op) {
1251 		cost += expand_expression(op->expr);
1252 	} END_FOR_EACH_PTR(op);
1253 
1254 	FOR_EACH_PTR(stmt->asm_inputs, op) {
1255 		cost += expand_expression(op->expr);
1256 	} END_FOR_EACH_PTR(op);
1257 
1258 	return cost;
1259 }
1260 
1261 /*
1262  * Expanding a compound statement is really just
1263  * about adding up the costs of each individual
1264  * statement.
1265  *
1266  * We also collapse a simple compound statement:
1267  * this would trigger for simple inline functions,
1268  * except we would have to check the "return"
1269  * symbol usage. Next time.
1270  */
expand_compound(struct statement * stmt)1271 static int expand_compound(struct statement *stmt)
1272 {
1273 	struct statement *s, *last;
1274 	int cost, statements;
1275 
1276 	if (stmt->ret)
1277 		expand_symbol(stmt->ret);
1278 
1279 	last = stmt->args;
1280 	cost = expand_statement(last);
1281 	statements = last != NULL;
1282 	FOR_EACH_PTR(stmt->stmts, s) {
1283 		statements++;
1284 		last = s;
1285 		cost += expand_statement(s);
1286 	} END_FOR_EACH_PTR(s);
1287 
1288 	if (statements == 1 && !stmt->ret)
1289 		*stmt = *last;
1290 
1291 	return cost;
1292 }
1293 
expand_statement(struct statement * stmt)1294 static int expand_statement(struct statement *stmt)
1295 {
1296 	if (!stmt)
1297 		return 0;
1298 
1299 	switch (stmt->type) {
1300 	case STMT_DECLARATION: {
1301 		struct symbol *sym;
1302 		FOR_EACH_PTR(stmt->declaration, sym) {
1303 			expand_symbol(sym);
1304 		} END_FOR_EACH_PTR(sym);
1305 		return SIDE_EFFECTS;
1306 	}
1307 
1308 	case STMT_RETURN:
1309 		expand_return_expression(stmt);
1310 		return SIDE_EFFECTS;
1311 
1312 	case STMT_EXPRESSION:
1313 		return expand_expression(stmt->expression);
1314 
1315 	case STMT_COMPOUND:
1316 		return expand_compound(stmt);
1317 
1318 	case STMT_IF:
1319 		return expand_if_statement(stmt);
1320 
1321 	case STMT_ITERATOR:
1322 		expand_expression(stmt->iterator_pre_condition);
1323 		expand_expression(stmt->iterator_post_condition);
1324 		expand_statement(stmt->iterator_pre_statement);
1325 		expand_statement(stmt->iterator_statement);
1326 		expand_statement(stmt->iterator_post_statement);
1327 		return SIDE_EFFECTS;
1328 
1329 	case STMT_SWITCH:
1330 		expand_expression(stmt->switch_expression);
1331 		expand_statement(stmt->switch_statement);
1332 		return SIDE_EFFECTS;
1333 
1334 	case STMT_CASE:
1335 		expand_const_expression(stmt->case_expression, "case statement");
1336 		expand_const_expression(stmt->case_to, "case statement");
1337 		expand_statement(stmt->case_statement);
1338 		return SIDE_EFFECTS;
1339 
1340 	case STMT_LABEL:
1341 		expand_statement(stmt->label_statement);
1342 		return SIDE_EFFECTS;
1343 
1344 	case STMT_GOTO:
1345 		expand_expression(stmt->goto_expression);
1346 		return SIDE_EFFECTS;
1347 
1348 	case STMT_NONE:
1349 		break;
1350 	case STMT_ASM:
1351 		expand_asm_statement(stmt);
1352 		break;
1353 	case STMT_CONTEXT:
1354 		expand_expression(stmt->expression);
1355 		break;
1356 	case STMT_RANGE:
1357 		expand_expression(stmt->range_expression);
1358 		expand_expression(stmt->range_low);
1359 		expand_expression(stmt->range_high);
1360 		break;
1361 	}
1362 	return SIDE_EFFECTS;
1363 }
1364 
bad_integer_constant_expression(struct expression * expr)1365 static inline int bad_integer_constant_expression(struct expression *expr)
1366 {
1367 	if (!(expr->flags & CEF_ICE))
1368 		return 1;
1369 	if (expr->taint & Taint_comma)
1370 		return 1;
1371 	return 0;
1372 }
1373 
__get_expression_value(struct expression * expr,int strict)1374 static long long __get_expression_value(struct expression *expr, int strict)
1375 {
1376 	long long value, mask;
1377 	struct symbol *ctype;
1378 
1379 	if (!expr)
1380 		return 0;
1381 	ctype = evaluate_expression(expr);
1382 	if (!ctype) {
1383 		expression_error(expr, "bad constant expression type");
1384 		return 0;
1385 	}
1386 	expand_expression(expr);
1387 	if (expr->type != EXPR_VALUE) {
1388 		if (strict != 2)
1389 			expression_error(expr, "bad constant expression");
1390 		return 0;
1391 	}
1392 	if ((strict == 1) && bad_integer_constant_expression(expr)) {
1393 		expression_error(expr, "bad integer constant expression");
1394 		return 0;
1395 	}
1396 
1397 	value = expr->value;
1398 	mask = 1ULL << (ctype->bit_size-1);
1399 
1400 	if (value & mask) {
1401 		while (ctype->type != SYM_BASETYPE)
1402 			ctype = ctype->ctype.base_type;
1403 		if (!(ctype->ctype.modifiers & MOD_UNSIGNED))
1404 			value = value | mask | ~(mask-1);
1405 	}
1406 	return value;
1407 }
1408 
get_expression_value(struct expression * expr)1409 long long get_expression_value(struct expression *expr)
1410 {
1411 	return __get_expression_value(expr, 0);
1412 }
1413 
const_expression_value(struct expression * expr)1414 long long const_expression_value(struct expression *expr)
1415 {
1416 	return __get_expression_value(expr, 1);
1417 }
1418 
get_expression_value_silent(struct expression * expr)1419 long long get_expression_value_silent(struct expression *expr)
1420 {
1421 
1422 	return __get_expression_value(expr, 2);
1423 }
1424 
expr_truth_value(struct expression * expr)1425 int expr_truth_value(struct expression *expr)
1426 {
1427 	const int saved = conservative;
1428 	struct symbol *ctype;
1429 
1430 	if (!expr)
1431 		return 0;
1432 
1433 	ctype = evaluate_expression(expr);
1434 	if (!ctype)
1435 		return -1;
1436 
1437 	conservative = 1;
1438 	expand_expression(expr);
1439 	conservative = saved;
1440 
1441 redo:
1442 	switch (expr->type) {
1443 	case EXPR_COMMA:
1444 		expr = expr->right;
1445 		goto redo;
1446 	case EXPR_VALUE:
1447 		return expr->value != 0;
1448 	case EXPR_FVALUE:
1449 		return expr->fvalue != 0;
1450 	default:
1451 		return -1;
1452 	}
1453 }
1454 
is_zero_constant(struct expression * expr)1455 int is_zero_constant(struct expression *expr)
1456 {
1457 	const int saved = conservative;
1458 	conservative = 1;
1459 	expand_expression(expr);
1460 	conservative = saved;
1461 	return expr->type == EXPR_VALUE && !expr->value;
1462 }
1463