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.
25 struct symbol
*get_real_base_type(struct symbol
*sym
)
31 ret
= get_base_type(sym
);
32 if (ret
&& ret
->type
== SYM_RESTRICT
)
33 return get_real_base_type(ret
);
37 int type_bits(struct symbol
*type
)
41 if (type
->type
== SYM_PTR
) /* Sparse doesn't set this for &pointers */
42 return bits_in_pointer
;
44 examine_symbol_type(type
);
45 return type
->bit_size
;
48 int type_bytes(struct symbol
*type
)
50 int bits
= type_bits(type
);
54 return bits_to_bytes(bits
);
57 int type_positive_bits(struct symbol
*type
)
61 if (type_unsigned(type
))
62 return type_bits(type
);
63 return type_bits(type
) - 1;
66 static struct symbol
*get_binop_type(struct expression
*expr
)
68 struct symbol
*left
, *right
;
70 left
= get_type(expr
->left
);
71 right
= get_type(expr
->right
);
76 if (left
->type
== SYM_PTR
|| left
->type
== SYM_ARRAY
)
78 if (right
->type
== SYM_PTR
|| right
->type
== SYM_ARRAY
)
81 if (expr
->op
== SPECIAL_LEFTSHIFT
||
82 expr
->op
== SPECIAL_RIGHTSHIFT
) {
83 if (type_positive_bits(left
) < 31)
88 if (type_positive_bits(left
) < 31 && type_positive_bits(right
) < 31)
91 if (type_positive_bits(left
) > type_positive_bits(right
))
96 static struct symbol
*get_type_symbol(struct expression
*expr
)
98 if (!expr
|| expr
->type
!= EXPR_SYMBOL
|| !expr
->symbol
)
101 return get_real_base_type(expr
->symbol
);
104 static struct symbol
*get_member_symbol(struct symbol_list
*symbol_list
, struct ident
*member
)
106 struct symbol
*tmp
, *sub
;
108 FOR_EACH_PTR(symbol_list
, tmp
) {
110 sub
= get_real_base_type(tmp
);
111 sub
= get_member_symbol(sub
->symbol_list
, member
);
116 if (tmp
->ident
== member
)
118 } END_FOR_EACH_PTR(tmp
);
123 static struct symbol
*get_symbol_from_deref(struct expression
*expr
)
125 struct ident
*member
;
128 if (!expr
|| expr
->type
!= EXPR_DEREF
)
131 member
= expr
->member
;
132 sym
= get_type(expr
->deref
);
134 // sm_msg("could not find struct type");
137 if (sym
->type
== SYM_PTR
)
138 sym
= get_real_base_type(sym
);
139 sym
= get_member_symbol(sym
->symbol_list
, member
);
142 return get_real_base_type(sym
);
145 static struct symbol
*get_return_type(struct expression
*expr
)
149 tmp
= get_type(expr
->fn
);
152 return get_real_base_type(tmp
);
155 static struct symbol
*get_expr_stmt_type(struct statement
*stmt
)
157 if (stmt
->type
!= STMT_COMPOUND
)
159 stmt
= last_ptr_list((struct ptr_list
*)stmt
->stmts
);
160 if (!stmt
|| stmt
->type
!= STMT_EXPRESSION
)
162 return get_type(stmt
->expression
);
165 static struct symbol
*get_select_type(struct expression
*expr
)
167 struct symbol
*one
, *two
;
169 one
= get_type(expr
->cond_true
);
170 two
= get_type(expr
->cond_false
);
174 * This is a hack. If the types are not equiv then we
175 * really don't know the type. But I think guessing is
178 if (type_positive_bits(one
) > type_positive_bits(two
))
183 struct symbol
*get_pointer_type(struct expression
*expr
)
187 sym
= get_type(expr
);
188 if (!sym
|| (sym
->type
!= SYM_PTR
&& sym
->type
!= SYM_ARRAY
))
190 return get_real_base_type(sym
);
193 static struct symbol
*fake_pointer_sym(struct expression
*expr
)
198 sym
= alloc_symbol(expr
->pos
, SYM_PTR
);
200 base
= get_type(expr
);
203 sym
->ctype
.base_type
= base
;
207 struct symbol
*get_type(struct expression
*expr
)
211 expr
= strip_parens(expr
);
213 switch (expr
->type
) {
215 return &string_ctype
;
217 return get_type_symbol(expr
);
219 return get_symbol_from_deref(expr
);
223 return fake_pointer_sym(expr
);
225 return get_pointer_type(expr
->unop
);
226 return get_type(expr
->unop
);
227 case EXPR_ASSIGNMENT
:
228 return get_type(expr
->left
);
230 case EXPR_FORCE_CAST
:
231 case EXPR_IMPLIED_CAST
:
232 return get_real_base_type(expr
->cast_type
);
235 return get_binop_type(expr
);
237 return get_return_type(expr
);
239 return get_expr_stmt_type(expr
->statement
);
240 case EXPR_CONDITIONAL
:
242 return get_select_type(expr
);
248 // sm_msg("unhandled type %d", expr->type);
254 int type_unsigned(struct symbol
*base_type
)
258 if (base_type
->ctype
.modifiers
& MOD_UNSIGNED
)
263 int type_signed(struct symbol
*base_type
)
267 if (base_type
->ctype
.modifiers
& MOD_UNSIGNED
)
272 int expr_unsigned(struct expression
*expr
)
276 sym
= get_type(expr
);
279 if (type_unsigned(sym
))
284 int returns_unsigned(struct symbol
*sym
)
288 sym
= get_base_type(sym
);
289 if (!sym
|| sym
->type
!= SYM_FN
)
291 sym
= get_base_type(sym
);
292 return type_unsigned(sym
);
295 int is_pointer(struct expression
*expr
)
299 sym
= get_type(expr
);
302 if (sym
== &string_ctype
)
304 if (sym
->type
== SYM_PTR
)
309 int returns_pointer(struct symbol
*sym
)
313 sym
= get_base_type(sym
);
314 if (!sym
|| sym
->type
!= SYM_FN
)
316 sym
= get_base_type(sym
);
317 if (sym
->type
== SYM_PTR
)
322 sval_t
sval_type_max(struct symbol
*base_type
)
326 ret
.value
= (~0ULL) >> 1;
327 ret
.type
= base_type
;
329 if (!base_type
|| !type_bits(base_type
))
332 ret
.value
= (~0ULL) >> (64 - type_positive_bits(base_type
));
336 sval_t
sval_type_min(struct symbol
*base_type
)
340 if (!base_type
|| !type_bits(base_type
))
341 base_type
= &llong_ctype
;
342 ret
.type
= base_type
;
344 if (type_unsigned(base_type
)) {
349 ret
.value
= (~0ULL) << type_positive_bits(base_type
);
354 int nr_bits(struct expression
*expr
)
358 type
= get_type(expr
);
361 return type_bits(type
);
364 int is_void_pointer(struct expression
*expr
)
368 type
= get_type(expr
);
369 if (!type
|| type
->type
!= SYM_PTR
)
371 type
= get_real_base_type(type
);
372 if (type
== &void_ctype
)
377 int is_char_pointer(struct expression
*expr
)
381 type
= get_type(expr
);
382 if (!type
|| type
->type
!= SYM_PTR
)
384 type
= get_real_base_type(type
);
385 if (type
== &char_ctype
)
390 int is_string(struct expression
*expr
)
392 expr
= strip_expr(expr
);
393 if (!expr
|| expr
->type
!= EXPR_STRING
)
400 int is_static(struct expression
*expr
)
406 name
= expr_to_str_sym(expr
, &sym
);
410 if (sym
->ctype
.modifiers
& MOD_STATIC
)
417 int types_equiv(struct symbol
*one
, struct symbol
*two
)
423 if (one
->type
!= two
->type
)
425 if (one
->type
== SYM_PTR
)
426 return types_equiv(get_real_base_type(one
), get_real_base_type(two
));
427 if (type_positive_bits(one
) != type_positive_bits(two
))
434 return !!(cur_func_sym
->ctype
.modifiers
& MOD_STATIC
);
437 const char *global_static(void)
439 if (cur_func_sym
->ctype
.modifiers
& MOD_STATIC
)
445 struct symbol
*cur_func_return_type(void)
449 sym
= get_real_base_type(cur_func_sym
);
450 if (!sym
|| sym
->type
!= SYM_FN
)
452 sym
= get_real_base_type(sym
);
456 struct symbol
*get_arg_type(struct expression
*fn
, int arg
)
458 struct symbol
*fn_type
;
460 struct symbol
*arg_type
;
463 fn_type
= get_type(fn
);
466 if (fn_type
->type
== SYM_PTR
)
467 fn_type
= get_real_base_type(fn_type
);
468 if (fn_type
->type
!= SYM_FN
)
472 FOR_EACH_PTR(fn_type
->arguments
, tmp
) {
473 arg_type
= get_real_base_type(tmp
);
478 } END_FOR_EACH_PTR(tmp
);
483 static struct symbol
*get_member_from_string(struct symbol_list
*symbol_list
, char *name
)
485 struct symbol
*tmp
, *sub
;
488 if (strncmp(name
, ".", 1) == 0)
490 if (strncmp(name
, "->", 2) == 0)
493 FOR_EACH_PTR(symbol_list
, tmp
) {
495 sub
= get_real_base_type(tmp
);
496 sub
= get_member_from_string(sub
->symbol_list
, name
);
502 if (strcmp(tmp
->ident
->name
, name
) == 0)
505 chunk_len
= strlen(tmp
->ident
->name
);
506 if (strncmp(tmp
->ident
->name
, name
, chunk_len
) == 0 &&
507 (name
[chunk_len
] == '.' || name
[chunk_len
] == '-')) {
508 sub
= get_real_base_type(tmp
);
509 return get_member_from_string(sub
->symbol_list
, name
+ chunk_len
);
512 } END_FOR_EACH_PTR(tmp
);
517 struct symbol
*get_member_type_from_key(struct expression
*expr
, char *key
)
522 if (strcmp(key
, "$$") == 0)
523 return get_type(expr
);
525 if (strcmp(key
, "*$$") == 0) {
526 sym
= get_type(expr
);
527 if (!sym
|| sym
->type
!= SYM_PTR
)
529 return get_real_base_type(sym
);
532 name
= expr_to_str_sym(expr
, &sym
);
536 sym
= get_real_base_type(sym
);
537 if (sym
->type
== SYM_PTR
)
538 sym
= get_real_base_type(sym
);
541 sym
= get_member_from_string(sym
->symbol_list
, key
);
544 return get_real_base_type(sym
);
547 int is_struct(struct expression
*expr
)
551 type
= get_type(expr
);
552 if (type
&& type
->type
== SYM_STRUCT
)
561 {&bool_ctype
, "bool"},
562 {&void_ctype
, "void"},
563 {&type_ctype
, "type"},
564 {&char_ctype
, "char"},
565 {&schar_ctype
, "schar"},
566 {&uchar_ctype
, "uchar"},
567 {&short_ctype
, "short"},
568 {&sshort_ctype
, "sshort"},
569 {&ushort_ctype
, "ushort"},
571 {&sint_ctype
, "sint"},
572 {&uint_ctype
, "uint"},
573 {&long_ctype
, "long"},
574 {&slong_ctype
, "slong"},
575 {&ulong_ctype
, "ulong"},
576 {&llong_ctype
, "llong"},
577 {&sllong_ctype
, "sllong"},
578 {&ullong_ctype
, "ullong"},
579 {&lllong_ctype
, "lllong"},
580 {&slllong_ctype
, "slllong"},
581 {&ulllong_ctype
, "ulllong"},
582 {&float_ctype
, "float"},
583 {&double_ctype
, "double"},
584 {&ldouble_ctype
, "ldouble"},
585 {&string_ctype
, "string"},
587 {&lazy_ptr_ctype
, "lazy_ptr"},
588 {&incomplete_ctype
, "incomplete"},
589 {&label_ctype
, "label"},
591 {&null_ctype
, "null"},
594 static const char *base_type_str(struct symbol
*sym
)
598 for (i
= 0; i
< ARRAY_SIZE(base_types
); i
++) {
599 if (sym
== base_types
[i
].sym
)
600 return base_types
[i
].name
;
605 static int type_str_helper(char *buf
, int size
, struct symbol
*sym
)
610 type
= get_real_base_type(sym
);
612 return snprintf(buf
, size
, "<unknown>");
614 if (type
->type
== SYM_BASETYPE
) {
615 return snprintf(buf
, size
, base_type_str(type
));
616 } else if (type
->type
== SYM_PTR
) {
617 n
= type_str_helper(buf
, size
, type
);
620 return n
+ snprintf(buf
+ n
, size
- n
, "*");
621 } else if (type
->type
== SYM_STRUCT
) {
622 return snprintf(buf
, size
, "struct %s", type
->ident
? type
->ident
->name
: "");
624 return snprintf(buf
, size
, "<type %d>", type
->type
);
628 char *type_to_str(struct symbol
*sym
)
630 static char buf
[256];
633 type_str_helper(buf
, sizeof(buf
), sym
);