4 * Copyright (C) 2009 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
11 #include "smatch_slist.h"
12 #include "smatch_extra.h"
16 static void match_all_values(const char *fn
, struct expression
*expr
, void *info
)
18 struct state_list
*slist
;
20 slist
= get_all_states(SMATCH_EXTRA
);
25 static void match_cur_slist(const char *fn
, struct expression
*expr
, void *info
)
30 static void match_print_value(const char *fn
, struct expression
*expr
, void *info
)
32 struct state_list
*slist
;
34 struct expression
*arg_expr
;
36 arg_expr
= get_argument_from_call_expr(expr
->args
, 0);
37 if (arg_expr
->type
!= EXPR_STRING
) {
38 sm_msg("error: the argument to %s is supposed to be a string literal", fn
);
42 slist
= get_all_states(SMATCH_EXTRA
);
43 FOR_EACH_PTR(slist
, tmp
) {
44 if (!strcmp(tmp
->name
, arg_expr
->string
->data
))
45 sm_msg("%s = %s", tmp
->name
, tmp
->state
->name
);
46 } END_FOR_EACH_PTR(tmp
);
50 static void match_print_implied(const char *fn
, struct expression
*expr
, void *info
)
52 struct expression
*arg
;
53 struct range_list
*rl
= NULL
;
56 arg
= get_argument_from_call_expr(expr
->args
, 0);
57 get_implied_range_list(arg
, &rl
);
59 name
= get_variable_from_expr_complex(arg
, NULL
);
60 sm_msg("implied: %s = '%s'", name
, show_ranges(rl
));
64 static void match_print_implied_min(const char *fn
, struct expression
*expr
, void *info
)
66 struct expression
*arg
;
70 arg
= get_argument_from_call_expr(expr
->args
, 0);
71 name
= get_variable_from_expr_complex(arg
, NULL
);
73 if (get_implied_min(arg
, &sval
))
74 sm_msg("implied min: %s = %s", name
, sval_to_str(sval
));
76 sm_msg("implied min: %s = <unknown>", name
);
81 static void match_print_implied_max(const char *fn
, struct expression
*expr
, void *info
)
83 struct expression
*arg
;
87 arg
= get_argument_from_call_expr(expr
->args
, 0);
88 name
= get_variable_from_expr_complex(arg
, NULL
);
90 if (get_implied_max(arg
, &sval
))
91 sm_msg("implied max: %s = %s", name
, sval_to_str(sval
));
93 sm_msg("implied max: %s = <unknown>", name
);
98 static void match_print_hard_max(const char *fn
, struct expression
*expr
, void *info
)
100 struct expression
*arg
;
104 arg
= get_argument_from_call_expr(expr
->args
, 0);
105 name
= get_variable_from_expr_complex(arg
, NULL
);
107 if (get_hard_max(arg
, &sval
))
108 sm_msg("hard max: %s = %s", name
, sval_to_str(sval
));
110 sm_msg("hard max: %s = <unknown>", name
);
115 static void match_print_fuzzy_max(const char *fn
, struct expression
*expr
, void *info
)
117 struct expression
*arg
;
121 arg
= get_argument_from_call_expr(expr
->args
, 0);
122 name
= get_variable_from_expr_complex(arg
, NULL
);
124 if (get_fuzzy_max(arg
, &sval
))
125 sm_msg("fuzzy max: %s = %s", name
, sval_to_str(sval
));
127 sm_msg("fuzzy max: %s = <unknown>", name
);
132 static void match_print_absolute_min(const char *fn
, struct expression
*expr
, void *info
)
134 struct expression
*arg
;
138 arg
= get_argument_from_call_expr(expr
->args
, 0);
139 name
= get_variable_from_expr_complex(arg
, NULL
);
141 if (get_absolute_min(arg
, &sval
))
142 sm_msg("absolute min: %s = %s", name
, sval_to_str(sval
));
144 sm_msg("absolute min: %s = <unknown>", name
);
149 static void match_print_absolute_max(const char *fn
, struct expression
*expr
, void *info
)
151 struct expression
*arg
;
155 arg
= get_argument_from_call_expr(expr
->args
, 0);
156 get_absolute_max(arg
, &sval
);
158 name
= get_variable_from_expr_complex(arg
, NULL
);
159 sm_msg("absolute max: %s = %s", name
, sval_to_str(sval
));
163 static void match_sval_info(const char *fn
, struct expression
*expr
, void *info
)
165 struct expression
*arg
;
169 arg
= get_argument_from_call_expr(expr
->args
, 0);
170 name
= get_variable_from_expr_complex(arg
, NULL
);
172 if (!get_implied_value(arg
, &sval
)) {
173 sm_msg("no sval for '%s'", name
);
177 sm_msg("implied: %s %c%d ->value = %llx", name
, sval_unsigned(sval
) ? 'u' : 's', sval_bits(sval
), sval
.value
);
182 static void print_possible(struct sm_state
*sm
)
184 struct sm_state
*tmp
;
186 sm_msg("Possible values for %s", sm
->name
);
187 FOR_EACH_PTR(sm
->possible
, tmp
) {
188 printf("%s\n", tmp
->state
->name
);
189 } END_FOR_EACH_PTR(tmp
);
193 static void match_possible(const char *fn
, struct expression
*expr
, void *info
)
195 struct state_list
*slist
;
196 struct sm_state
*tmp
;
197 struct expression
*arg_expr
;
199 arg_expr
= get_argument_from_call_expr(expr
->args
, 0);
200 if (arg_expr
->type
!= EXPR_STRING
) {
201 sm_msg("error: the argument to %s is supposed to be a string literal", fn
);
205 slist
= get_all_states(SMATCH_EXTRA
);
206 FOR_EACH_PTR(slist
, tmp
) {
207 if (!strcmp(tmp
->name
, arg_expr
->string
->data
))
209 } END_FOR_EACH_PTR(tmp
);
213 static void match_buf_size(const char *fn
, struct expression
*expr
, void *info
)
215 struct expression
*arg
;
219 arg
= get_argument_from_call_expr(expr
->args
, 0);
220 elements
= get_array_size(arg
);
221 bytes
= get_array_size_bytes(arg
);
223 name
= get_variable_from_expr_complex(arg
, NULL
);
224 sm_msg("buf size: '%s' %d elements, %d bytes", name
, elements
, bytes
);
228 static void match_note(const char *fn
, struct expression
*expr
, void *info
)
230 struct expression
*arg_expr
;
232 arg_expr
= get_argument_from_call_expr(expr
->args
, 0);
233 if (arg_expr
->type
!= EXPR_STRING
) {
234 sm_msg("error: the argument to %s is supposed to be a string literal", fn
);
237 sm_msg("%s", arg_expr
->string
->data
);
240 static void print_related(struct sm_state
*sm
)
242 struct relation
*rel
;
244 if (!estate_related(sm
->state
))
248 sm_printf("%s: ", sm
->name
);
249 FOR_EACH_PTR(estate_related(sm
->state
), rel
) {
250 sm_printf("%s %s ", show_special(rel
->op
), rel
->name
);
251 } END_FOR_EACH_PTR(rel
);
255 static void match_dump_related(const char *fn
, struct expression
*expr
, void *info
)
257 struct state_list
*slist
;
258 struct sm_state
*tmp
;
260 slist
= get_all_states(SMATCH_EXTRA
);
261 FOR_EACH_PTR(slist
, tmp
) {
263 } END_FOR_EACH_PTR(tmp
);
267 static void match_debug_on(const char *fn
, struct expression
*expr
, void *info
)
272 static void match_debug_off(const char *fn
, struct expression
*expr
, void *info
)
277 void check_debug(int id
)
280 add_function_hook("__smatch_all_values", &match_all_values
, NULL
);
281 add_function_hook("__smatch_value", &match_print_value
, NULL
);
282 add_function_hook("__smatch_implied", &match_print_implied
, NULL
);
283 add_function_hook("__smatch_implied_min", &match_print_implied_min
, NULL
);
284 add_function_hook("__smatch_implied_max", &match_print_implied_max
, NULL
);
285 add_function_hook("__smatch_hard_max", &match_print_hard_max
, NULL
);
286 add_function_hook("__smatch_fuzzy_max", &match_print_fuzzy_max
, NULL
);
287 add_function_hook("__smatch_absolute_min", &match_print_absolute_min
, NULL
);
288 add_function_hook("__smatch_absolute_max", &match_print_absolute_max
, NULL
);
289 add_function_hook("__smatch_sval_info", &match_sval_info
, NULL
);
290 add_function_hook("__smatch_possible", &match_possible
, NULL
);
291 add_function_hook("__smatch_cur_slist", &match_cur_slist
, NULL
);
292 add_function_hook("__smatch_buf_size", &match_buf_size
, NULL
);
293 add_function_hook("__smatch_note", &match_note
, NULL
);
294 add_function_hook("__smatch_dump_related", &match_dump_related
, NULL
);
295 add_function_hook("__smatch_debug_on", &match_debug_on
, NULL
);
296 add_function_hook("__smatch_debug_off", &match_debug_off
, NULL
);