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
;
43 return type
->bit_size
;
46 int type_positive_bits(struct symbol
*type
)
50 if (type_unsigned(type
))
51 return type_bits(type
);
52 return type_bits(type
) - 1;
55 static struct symbol
*get_binop_type(struct expression
*expr
)
57 struct symbol
*left
, *right
;
59 left
= get_type(expr
->left
);
60 right
= get_type(expr
->right
);
65 if (left
->type
== SYM_PTR
|| left
->type
== SYM_ARRAY
)
67 if (right
->type
== SYM_PTR
|| right
->type
== SYM_ARRAY
)
70 if (expr
->op
== SPECIAL_LEFTSHIFT
||
71 expr
->op
== SPECIAL_RIGHTSHIFT
) {
72 if (type_positive_bits(left
) < 31)
77 if (type_positive_bits(left
) < 31 && type_positive_bits(right
) < 31)
80 if (type_positive_bits(left
) > type_positive_bits(right
))
85 static struct symbol
*get_type_symbol(struct expression
*expr
)
87 if (!expr
|| expr
->type
!= EXPR_SYMBOL
|| !expr
->symbol
)
90 return get_real_base_type(expr
->symbol
);
93 static struct symbol
*get_member_symbol(struct symbol_list
*symbol_list
, struct ident
*member
)
95 struct symbol
*tmp
, *sub
;
97 FOR_EACH_PTR(symbol_list
, tmp
) {
99 sub
= get_real_base_type(tmp
);
100 sub
= get_member_symbol(sub
->symbol_list
, member
);
105 if (tmp
->ident
== member
)
107 } END_FOR_EACH_PTR(tmp
);
112 static struct symbol
*get_symbol_from_deref(struct expression
*expr
)
114 struct ident
*member
;
117 if (!expr
|| expr
->type
!= EXPR_DEREF
)
120 member
= expr
->member
;
121 sym
= get_type(expr
->deref
);
123 // sm_msg("could not find struct type");
126 if (sym
->type
== SYM_PTR
)
127 sym
= get_real_base_type(sym
);
128 sym
= get_member_symbol(sym
->symbol_list
, member
);
131 return get_real_base_type(sym
);
134 static struct symbol
*get_return_type(struct expression
*expr
)
138 tmp
= get_type(expr
->fn
);
141 return get_real_base_type(tmp
);
144 static struct symbol
*get_expr_stmt_type(struct statement
*stmt
)
146 if (stmt
->type
!= STMT_COMPOUND
)
148 stmt
= last_ptr_list((struct ptr_list
*)stmt
->stmts
);
149 if (!stmt
|| stmt
->type
!= STMT_EXPRESSION
)
151 return get_type(stmt
->expression
);
154 static struct symbol
*get_select_type(struct expression
*expr
)
156 struct symbol
*one
, *two
;
158 one
= get_type(expr
->cond_true
);
159 two
= get_type(expr
->cond_false
);
163 * This is a hack. If the types are not equiv then we
164 * really don't know the type. But I think guessing is
167 if (type_positive_bits(one
) > type_positive_bits(two
))
172 struct symbol
*get_pointer_type(struct expression
*expr
)
176 sym
= get_type(expr
);
177 if (!sym
|| (sym
->type
!= SYM_PTR
&& sym
->type
!= SYM_ARRAY
))
179 return get_real_base_type(sym
);
182 static struct symbol
*fake_pointer_sym(struct expression
*expr
)
187 sym
= alloc_symbol(expr
->pos
, SYM_PTR
);
189 base
= get_type(expr
);
192 sym
->ctype
.base_type
= base
;
196 struct symbol
*get_type(struct expression
*expr
)
200 expr
= strip_parens(expr
);
202 switch (expr
->type
) {
204 return &string_ctype
;
206 return get_type_symbol(expr
);
208 return get_symbol_from_deref(expr
);
212 return fake_pointer_sym(expr
);
214 return get_pointer_type(expr
->unop
);
215 return get_type(expr
->unop
);
216 case EXPR_ASSIGNMENT
:
217 return get_type(expr
->left
);
219 case EXPR_FORCE_CAST
:
220 case EXPR_IMPLIED_CAST
:
221 return get_real_base_type(expr
->cast_type
);
224 return get_binop_type(expr
);
226 return get_return_type(expr
);
228 return get_expr_stmt_type(expr
->statement
);
229 case EXPR_CONDITIONAL
:
231 return get_select_type(expr
);
237 // sm_msg("unhandled type %d", expr->type);
243 int type_unsigned(struct symbol
*base_type
)
247 if (base_type
->ctype
.modifiers
& MOD_UNSIGNED
)
252 int type_signed(struct symbol
*base_type
)
256 if (base_type
->ctype
.modifiers
& MOD_UNSIGNED
)
261 int expr_unsigned(struct expression
*expr
)
265 sym
= get_type(expr
);
268 if (type_unsigned(sym
))
273 int returns_unsigned(struct symbol
*sym
)
277 sym
= get_base_type(sym
);
278 if (!sym
|| sym
->type
!= SYM_FN
)
280 sym
= get_base_type(sym
);
281 return type_unsigned(sym
);
284 int is_pointer(struct expression
*expr
)
288 sym
= get_type(expr
);
291 if (sym
== &string_ctype
)
293 if (sym
->type
== SYM_PTR
)
298 int returns_pointer(struct symbol
*sym
)
302 sym
= get_base_type(sym
);
303 if (!sym
|| sym
->type
!= SYM_FN
)
305 sym
= get_base_type(sym
);
306 if (sym
->type
== SYM_PTR
)
311 sval_t
sval_type_max(struct symbol
*base_type
)
315 ret
.value
= (~0ULL) >> 1;
316 ret
.type
= base_type
;
318 if (!base_type
|| !base_type
->bit_size
)
321 ret
.value
= (~0ULL) >> (64 - type_positive_bits(base_type
));
325 sval_t
sval_type_min(struct symbol
*base_type
)
329 if (!base_type
|| !base_type
->bit_size
)
330 base_type
= &llong_ctype
;
331 ret
.type
= base_type
;
333 if (type_unsigned(base_type
)) {
338 ret
.value
= (~0ULL) << type_positive_bits(base_type
);
343 int nr_bits(struct expression
*expr
)
347 type
= get_type(expr
);
350 return type_bits(type
);
353 int is_void_pointer(struct expression
*expr
)
357 type
= get_type(expr
);
358 if (!type
|| type
->type
!= SYM_PTR
)
360 type
= get_real_base_type(type
);
361 if (type
== &void_ctype
)
366 int is_char_pointer(struct expression
*expr
)
370 type
= get_type(expr
);
371 if (!type
|| type
->type
!= SYM_PTR
)
373 type
= get_real_base_type(type
);
374 if (type
== &char_ctype
)
379 int is_static(struct expression
*expr
)
385 name
= expr_to_str_sym(expr
, &sym
);
389 if (sym
->ctype
.modifiers
& MOD_STATIC
)
396 int types_equiv(struct symbol
*one
, struct symbol
*two
)
402 if (one
->type
!= two
->type
)
404 if (one
->type
== SYM_PTR
)
405 return types_equiv(get_real_base_type(one
), get_real_base_type(two
));
406 if (type_positive_bits(one
) != type_positive_bits(two
))
413 return !!(cur_func_sym
->ctype
.modifiers
& MOD_STATIC
);
416 const char *global_static()
418 if (cur_func_sym
->ctype
.modifiers
& MOD_STATIC
)
424 struct symbol
*cur_func_return_type(void)
428 sym
= get_real_base_type(cur_func_sym
);
429 if (!sym
|| sym
->type
!= SYM_FN
)
431 sym
= get_real_base_type(sym
);
435 struct symbol
*get_arg_type(struct expression
*fn
, int arg
)
437 struct symbol
*fn_type
;
439 struct symbol
*arg_type
;
442 fn_type
= get_type(fn
);
445 if (fn_type
->type
== SYM_PTR
)
446 fn_type
= get_real_base_type(fn_type
);
447 if (fn_type
->type
!= SYM_FN
)
451 FOR_EACH_PTR(fn_type
->arguments
, tmp
) {
452 arg_type
= get_real_base_type(tmp
);
457 } END_FOR_EACH_PTR(tmp
);
462 static struct symbol
*get_member_from_string(struct symbol_list
*symbol_list
, char *name
)
464 struct symbol
*tmp
, *sub
;
467 if (strncmp(name
, ".", 1) == 0)
469 if (strncmp(name
, "->", 2) == 0)
472 FOR_EACH_PTR(symbol_list
, tmp
) {
474 sub
= get_real_base_type(tmp
);
475 sub
= get_member_from_string(sub
->symbol_list
, name
);
481 if (strcmp(tmp
->ident
->name
, name
) == 0)
484 chunk_len
= strlen(tmp
->ident
->name
);
485 if (strncmp(tmp
->ident
->name
, name
, chunk_len
) == 0 &&
486 (name
[chunk_len
] == '.' || name
[chunk_len
] == '-')) {
487 sub
= get_real_base_type(tmp
);
488 return get_member_from_string(sub
->symbol_list
, name
+ chunk_len
);
491 } END_FOR_EACH_PTR(tmp
);
496 struct symbol
*get_member_type_from_key(struct expression
*expr
, char *key
)
501 if (strcmp(key
, "$$") == 0)
502 return get_type(expr
);
504 if (strcmp(key
, "*$$") == 0) {
505 sym
= get_type(expr
);
506 if (!sym
|| sym
->type
!= SYM_PTR
)
508 return get_real_base_type(sym
);
511 name
= expr_to_str_sym(expr
, &sym
);
515 sym
= get_real_base_type(sym
);
516 if (sym
->type
== SYM_PTR
)
517 sym
= get_real_base_type(sym
);
520 sym
= get_member_from_string(sym
->symbol_list
, key
);
523 return get_real_base_type(sym
);