2 #include "smatch_extra.h"
4 __ALLOCATOR(struct expression
, "temporary expr", tmp_expression
);
6 static struct position
get_cur_pos(void)
8 static struct position pos
;
9 static struct position none
;
10 struct expression
*expr
;
11 struct statement
*stmt
;
13 expr
= last_ptr_list((struct ptr_list
*)big_expression_stack
);
14 stmt
= last_ptr_list((struct ptr_list
*)big_statement_stack
);
24 struct expression
*alloc_tmp_expression(struct position pos
, int type
)
26 struct expression
*expr
= __alloc_tmp_expression(0);
32 void free_tmp_expressions(void)
34 clear_tmp_expression_alloc();
37 struct expression
*zero_expr(void)
39 struct expression
*zero
;
41 zero
= alloc_tmp_expression(get_cur_pos(), EXPR_VALUE
);
43 zero
->ctype
= &int_ctype
;
47 struct expression
*value_expr(long long val
)
49 struct expression
*expr
;
54 expr
= alloc_tmp_expression(get_cur_pos(), EXPR_VALUE
);
56 expr
->ctype
= &llong_ctype
;
60 struct expression
*member_expression(struct expression
*deref
, int op
, struct ident
*member
)
62 struct expression
*expr
;
64 expr
= alloc_tmp_expression(deref
->pos
, EXPR_DEREF
);
67 expr
->member
= member
;
68 expr
->member_offset
= -1;
72 struct expression
*deref_expression(struct expression
*expr
)
74 struct expression
*preop
;
76 preop
= alloc_tmp_expression(expr
->pos
, EXPR_PREOP
);
82 struct expression
*assign_expression(struct expression
*left
, struct expression
*right
)
84 struct expression
*expr
;
86 expr
= alloc_tmp_expression(right
->pos
, EXPR_ASSIGNMENT
);
93 struct expression
*binop_expression(struct expression
*left
, int op
, struct expression
*right
)
95 struct expression
*expr
;
97 expr
= alloc_tmp_expression(right
->pos
, EXPR_BINOP
);
104 struct expression
*array_element_expression(struct expression
*array
, struct expression
*offset
)
106 struct expression
*expr
;
108 expr
= binop_expression(array
, '+', offset
);
109 return deref_expression(expr
);
112 struct expression
*symbol_expression(struct symbol
*sym
)
114 struct expression
*expr
;
116 expr
= alloc_tmp_expression(sym
->pos
, EXPR_SYMBOL
);
118 expr
->symbol_name
= sym
->ident
;
122 struct expression
*compare_expression(struct expression
*left
, int op
, struct expression
*right
)
124 struct expression
*expr
;
126 expr
= alloc_tmp_expression(get_cur_pos(), EXPR_COMPARE
);
133 struct expression
*gen_expression_from_key(struct expression
*arg
, const char *key
)
135 struct expression
*ret
;
136 struct token
*token
, *end
;
142 /* The idea is that we can parse either $0->foo or $->foo */
146 while (*p
>= '0' && *p
<= '9')
148 len
= snprintf(buf
, sizeof(buf
), "%s\n", p
);
149 alloc
= alloc_string(buf
);
151 token
= tokenize_buffer(alloc
, len
, &end
);
154 if (token_type(token
) != TOKEN_STREAMBEGIN
)
159 while (token_type(token
) == TOKEN_SPECIAL
&&
160 token
->special
== SPECIAL_DEREFERENCE
) {
162 if (token_type(token
) != TOKEN_IDENT
)
164 ret
= deref_expression(ret
);
165 ret
= member_expression(ret
, '*', token
->ident
);
169 if (token_type(token
) != TOKEN_STREAMEND
)
175 void expr_set_parent_expr(struct expression
*expr
, struct expression
*parent
)
180 expr
->parent
= (unsigned long)parent
| 0x1UL
;
183 void expr_set_parent_stmt(struct expression
*expr
, struct statement
*parent
)
187 expr
->parent
= (unsigned long)parent
;
190 struct expression
*expr_get_parent_expr(struct expression
*expr
)
194 if (!(expr
->parent
& 0x1UL
))
196 return (struct expression
*)(expr
->parent
& ~0x1UL
);
199 struct statement
*expr_get_parent_stmt(struct expression
*expr
)
203 if (expr
->parent
& 0x1UL
)
205 return (struct statement
*)expr
->parent
;