2 * Copyright (C) 2009 Dan Carpenter.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt
19 * The idea here is that you have an expression and you
20 * want to know what the type is for that.
24 #include "smatch_slist.h"
26 struct symbol
*get_real_base_type(struct symbol
*sym
)
32 ret
= get_base_type(sym
);
35 if (ret
->type
== SYM_RESTRICT
|| ret
->type
== SYM_NODE
)
36 return get_real_base_type(ret
);
40 int type_bits(struct symbol
*type
)
44 if (type
->type
== SYM_PTR
) /* Sparse doesn't set this for &pointers */
45 return bits_in_pointer
;
47 examine_symbol_type(type
);
48 return type
->bit_size
;
51 int type_bytes(struct symbol
*type
)
53 int bits
= type_bits(type
);
57 return bits_to_bytes(bits
);
60 int type_positive_bits(struct symbol
*type
)
64 if (type_unsigned(type
))
65 return type_bits(type
);
66 return type_bits(type
) - 1;
69 static struct symbol
*get_binop_type(struct expression
*expr
)
71 struct symbol
*left
, *right
;
73 left
= get_type(expr
->left
);
77 if (expr
->op
== SPECIAL_LEFTSHIFT
||
78 expr
->op
== SPECIAL_RIGHTSHIFT
) {
79 if (type_positive_bits(left
) < 31)
83 if (left
->type
== SYM_PTR
|| left
->type
== SYM_ARRAY
)
86 right
= get_type(expr
->right
);
90 if (right
->type
== SYM_PTR
|| right
->type
== SYM_ARRAY
)
93 if (type_positive_bits(left
) < 31 && type_positive_bits(right
) < 31)
96 if (type_positive_bits(left
) > type_positive_bits(right
))
101 static struct symbol
*get_type_symbol(struct expression
*expr
)
103 if (!expr
|| expr
->type
!= EXPR_SYMBOL
|| !expr
->symbol
)
106 return get_real_base_type(expr
->symbol
);
109 static struct symbol
*get_member_symbol(struct symbol_list
*symbol_list
, struct ident
*member
)
111 struct symbol
*tmp
, *sub
;
113 FOR_EACH_PTR(symbol_list
, tmp
) {
115 sub
= get_real_base_type(tmp
);
116 sub
= get_member_symbol(sub
->symbol_list
, member
);
121 if (tmp
->ident
== member
)
123 } END_FOR_EACH_PTR(tmp
);
128 static struct symbol
*get_symbol_from_deref(struct expression
*expr
)
130 struct ident
*member
;
133 if (!expr
|| expr
->type
!= EXPR_DEREF
)
136 member
= expr
->member
;
137 sym
= get_type(expr
->deref
);
139 // sm_msg("could not find struct type");
142 if (sym
->type
== SYM_PTR
)
143 sym
= get_real_base_type(sym
);
144 sym
= get_member_symbol(sym
->symbol_list
, member
);
147 return get_real_base_type(sym
);
150 static struct symbol
*get_return_type(struct expression
*expr
)
154 tmp
= get_type(expr
->fn
);
157 /* this is to handle __builtin_constant_p() */
158 if (tmp
->type
!= SYM_FN
)
159 tmp
= get_base_type(tmp
);
160 return get_real_base_type(tmp
);
163 static struct symbol
*get_expr_stmt_type(struct statement
*stmt
)
165 if (stmt
->type
!= STMT_COMPOUND
)
167 stmt
= last_ptr_list((struct ptr_list
*)stmt
->stmts
);
168 if (stmt
->type
== STMT_LABEL
)
169 stmt
= stmt
->label_statement
;
170 if (stmt
->type
!= STMT_EXPRESSION
)
172 return get_type(stmt
->expression
);
175 static struct symbol
*get_select_type(struct expression
*expr
)
177 struct symbol
*one
, *two
;
179 one
= get_type(expr
->cond_true
);
180 two
= get_type(expr
->cond_false
);
184 * This is a hack. If the types are not equiv then we
185 * really don't know the type. But I think guessing is
188 if (type_positive_bits(one
) > type_positive_bits(two
))
193 struct symbol
*get_pointer_type(struct expression
*expr
)
197 sym
= get_type(expr
);
200 if (sym
->type
== SYM_NODE
) {
201 sym
= get_real_base_type(sym
);
205 if (sym
->type
!= SYM_PTR
&& sym
->type
!= SYM_ARRAY
)
207 return get_real_base_type(sym
);
210 static struct symbol
*fake_pointer_sym(struct expression
*expr
)
215 sym
= alloc_symbol(expr
->pos
, SYM_PTR
);
217 base
= get_type(expr
);
220 sym
->ctype
.base_type
= base
;
224 struct symbol
*get_type(struct expression
*expr
)
228 expr
= strip_parens(expr
);
235 switch (expr
->type
) {
240 ret
= get_type_symbol(expr
);
243 ret
= get_symbol_from_deref(expr
);
248 ret
= fake_pointer_sym(expr
);
249 else if (expr
->op
== '*')
250 ret
= get_pointer_type(expr
->unop
);
252 ret
= get_type(expr
->unop
);
254 case EXPR_ASSIGNMENT
:
255 ret
= get_type(expr
->left
);
258 case EXPR_FORCE_CAST
:
259 case EXPR_IMPLIED_CAST
:
260 ret
= get_real_base_type(expr
->cast_type
);
264 ret
= get_binop_type(expr
);
267 ret
= get_return_type(expr
);
270 ret
= get_expr_stmt_type(expr
->statement
);
272 case EXPR_CONDITIONAL
:
274 ret
= get_select_type(expr
);
286 if (ret
&& ret
->type
== SYM_TYPEOF
)
287 ret
= get_type(ret
->initializer
);
293 int type_unsigned(struct symbol
*base_type
)
297 if (base_type
->ctype
.modifiers
& MOD_UNSIGNED
)
302 int type_signed(struct symbol
*base_type
)
306 if (base_type
->ctype
.modifiers
& MOD_SIGNED
)
311 int expr_unsigned(struct expression
*expr
)
315 sym
= get_type(expr
);
318 if (type_unsigned(sym
))
323 int expr_signed(struct expression
*expr
)
327 sym
= get_type(expr
);
330 if (type_signed(sym
))
335 int returns_unsigned(struct symbol
*sym
)
339 sym
= get_base_type(sym
);
340 if (!sym
|| sym
->type
!= SYM_FN
)
342 sym
= get_base_type(sym
);
343 return type_unsigned(sym
);
346 int is_pointer(struct expression
*expr
)
350 sym
= get_type(expr
);
353 if (sym
== &string_ctype
)
355 if (sym
->type
== SYM_PTR
)
360 int returns_pointer(struct symbol
*sym
)
364 sym
= get_base_type(sym
);
365 if (!sym
|| sym
->type
!= SYM_FN
)
367 sym
= get_base_type(sym
);
368 if (sym
->type
== SYM_PTR
)
373 sval_t
sval_type_max(struct symbol
*base_type
)
377 if (!base_type
|| !type_bits(base_type
))
378 base_type
= &llong_ctype
;
379 ret
.type
= base_type
;
381 ret
.value
= (~0ULL) >> (64 - type_positive_bits(base_type
));
385 sval_t
sval_type_min(struct symbol
*base_type
)
389 if (!base_type
|| !type_bits(base_type
))
390 base_type
= &llong_ctype
;
391 ret
.type
= base_type
;
393 if (type_unsigned(base_type
)) {
398 ret
.value
= (~0ULL) << type_positive_bits(base_type
);
403 int nr_bits(struct expression
*expr
)
407 type
= get_type(expr
);
410 return type_bits(type
);
413 int is_void_pointer(struct expression
*expr
)
417 type
= get_type(expr
);
418 if (!type
|| type
->type
!= SYM_PTR
)
420 type
= get_real_base_type(type
);
421 if (type
== &void_ctype
)
426 int is_char_pointer(struct expression
*expr
)
430 type
= get_type(expr
);
431 if (!type
|| type
->type
!= SYM_PTR
)
433 type
= get_real_base_type(type
);
434 if (type
== &char_ctype
)
439 int is_string(struct expression
*expr
)
441 expr
= strip_expr(expr
);
442 if (!expr
|| expr
->type
!= EXPR_STRING
)
449 int is_static(struct expression
*expr
)
455 name
= expr_to_str_sym(expr
, &sym
);
459 if (sym
->ctype
.modifiers
& MOD_STATIC
)
466 int is_local_variable(struct expression
*expr
)
471 name
= expr_to_var_sym(expr
, &sym
);
473 if (!sym
|| !sym
->scope
|| !sym
->scope
->token
)
475 if (cmp_pos(sym
->scope
->token
->pos
, cur_func_sym
->pos
) < 0)
482 int types_equiv(struct symbol
*one
, struct symbol
*two
)
488 if (one
->type
!= two
->type
)
490 if (one
->type
== SYM_PTR
)
491 return types_equiv(get_real_base_type(one
), get_real_base_type(two
));
492 if (type_positive_bits(one
) != type_positive_bits(two
))
499 return !!(cur_func_sym
->ctype
.modifiers
& MOD_STATIC
);
502 const char *global_static(void)
504 if (cur_func_sym
->ctype
.modifiers
& MOD_STATIC
)
510 struct symbol
*cur_func_return_type(void)
514 sym
= get_real_base_type(cur_func_sym
);
515 if (!sym
|| sym
->type
!= SYM_FN
)
517 sym
= get_real_base_type(sym
);
521 struct symbol
*get_arg_type(struct expression
*fn
, int arg
)
523 struct symbol
*fn_type
;
525 struct symbol
*arg_type
;
528 fn_type
= get_type(fn
);
531 if (fn_type
->type
== SYM_PTR
)
532 fn_type
= get_real_base_type(fn_type
);
533 if (fn_type
->type
!= SYM_FN
)
537 FOR_EACH_PTR(fn_type
->arguments
, tmp
) {
538 arg_type
= get_real_base_type(tmp
);
543 } END_FOR_EACH_PTR(tmp
);
548 static struct symbol
*get_member_from_string(struct symbol_list
*symbol_list
, char *name
)
550 struct symbol
*tmp
, *sub
;
553 if (strncmp(name
, ".", 1) == 0)
555 if (strncmp(name
, "->", 2) == 0)
558 FOR_EACH_PTR(symbol_list
, tmp
) {
560 sub
= get_real_base_type(tmp
);
561 sub
= get_member_from_string(sub
->symbol_list
, name
);
567 if (strcmp(tmp
->ident
->name
, name
) == 0)
570 chunk_len
= strlen(tmp
->ident
->name
);
571 if (strncmp(tmp
->ident
->name
, name
, chunk_len
) == 0 &&
572 (name
[chunk_len
] == '.' || name
[chunk_len
] == '-')) {
573 sub
= get_real_base_type(tmp
);
574 return get_member_from_string(sub
->symbol_list
, name
+ chunk_len
);
577 } END_FOR_EACH_PTR(tmp
);
582 struct symbol
*get_member_type_from_key(struct expression
*expr
, char *key
)
586 if (strcmp(key
, "$") == 0)
587 return get_type(expr
);
589 if (strcmp(key
, "*$") == 0) {
590 sym
= get_type(expr
);
591 if (!sym
|| sym
->type
!= SYM_PTR
)
593 return get_real_base_type(sym
);
596 sym
= get_type(expr
);
599 if (sym
->type
== SYM_PTR
)
600 sym
= get_real_base_type(sym
);
603 sym
= get_member_from_string(sym
->symbol_list
, key
);
606 return get_real_base_type(sym
);
609 int is_struct(struct expression
*expr
)
613 type
= get_type(expr
);
614 if (type
&& type
->type
== SYM_STRUCT
)
623 {&bool_ctype
, "bool"},
624 {&void_ctype
, "void"},
625 {&type_ctype
, "type"},
626 {&char_ctype
, "char"},
627 {&schar_ctype
, "schar"},
628 {&uchar_ctype
, "uchar"},
629 {&short_ctype
, "short"},
630 {&sshort_ctype
, "sshort"},
631 {&ushort_ctype
, "ushort"},
633 {&sint_ctype
, "sint"},
634 {&uint_ctype
, "uint"},
635 {&long_ctype
, "long"},
636 {&slong_ctype
, "slong"},
637 {&ulong_ctype
, "ulong"},
638 {&llong_ctype
, "llong"},
639 {&sllong_ctype
, "sllong"},
640 {&ullong_ctype
, "ullong"},
641 {&lllong_ctype
, "lllong"},
642 {&slllong_ctype
, "slllong"},
643 {&ulllong_ctype
, "ulllong"},
644 {&float_ctype
, "float"},
645 {&double_ctype
, "double"},
646 {&ldouble_ctype
, "ldouble"},
647 {&string_ctype
, "string"},
649 {&lazy_ptr_ctype
, "lazy_ptr"},
650 {&incomplete_ctype
, "incomplete"},
651 {&label_ctype
, "label"},
653 {&null_ctype
, "null"},
656 static const char *base_type_str(struct symbol
*sym
)
660 for (i
= 0; i
< ARRAY_SIZE(base_types
); i
++) {
661 if (sym
== base_types
[i
].sym
)
662 return base_types
[i
].name
;
667 static int type_str_helper(char *buf
, int size
, struct symbol
*type
)
672 return snprintf(buf
, size
, "<unknown>");
674 if (type
->type
== SYM_BASETYPE
) {
675 return snprintf(buf
, size
, base_type_str(type
));
676 } else if (type
->type
== SYM_PTR
) {
677 type
= get_real_base_type(type
);
678 n
= type_str_helper(buf
, size
, type
);
681 return n
+ snprintf(buf
+ n
, size
- n
, "*");
682 } else if (type
->type
== SYM_ARRAY
) {
683 type
= get_real_base_type(type
);
684 n
= type_str_helper(buf
, size
, type
);
687 return n
+ snprintf(buf
+ n
, size
- n
, "[]");
688 } else if (type
->type
== SYM_STRUCT
) {
689 return snprintf(buf
, size
, "struct %s", type
->ident
? type
->ident
->name
: "");
690 } else if (type
->type
== SYM_UNION
) {
692 return snprintf(buf
, size
, "union %s", type
->ident
->name
);
694 return snprintf(buf
, size
, "anonymous union");
695 } else if (type
->type
== SYM_FN
) {
696 struct symbol
*arg
, *return_type
, *arg_type
;
699 return_type
= get_real_base_type(type
);
700 n
= type_str_helper(buf
, size
, return_type
);
703 n
+= snprintf(buf
+ n
, size
- n
, "(*)(");
708 FOR_EACH_PTR(type
->arguments
, arg
) {
710 n
+= snprintf(buf
+ n
, size
- n
, ", ");
713 arg_type
= get_real_base_type(arg
);
714 n
+= type_str_helper(buf
+ n
, size
- n
, arg_type
);
717 } END_FOR_EACH_PTR(arg
);
719 return n
+ snprintf(buf
+ n
, size
- n
, ")");
720 } else if (type
->type
== SYM_NODE
) {
721 n
= snprintf(buf
, size
, "node {");
724 type
= get_real_base_type(type
);
725 n
+= type_str_helper(buf
+ n
, size
- n
, type
);
728 return n
+ snprintf(buf
+ n
, size
- n
, "}");
730 return snprintf(buf
, size
, "<type %d>", type
->type
);
734 char *type_to_str(struct symbol
*type
)
736 static char buf
[256];
739 type_str_helper(buf
, sizeof(buf
), type
);