flow: handle EXPR_OFFSETOF and EXPR_ALIGNOF
[smatch.git] / check_debug.c
blob061cbfcd794600b47d998a73c79f69b7adfb955e
1 /*
2 * sparse/check_debug.c
4 * Copyright (C) 2009 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
8 */
10 #include "smatch.h"
11 #include "smatch_slist.h"
12 #include "smatch_extra.h"
14 static int my_id;
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);
21 __print_slist(slist);
22 free_slist(&slist);
25 static void match_cur_slist(const char *fn, struct expression *expr, void *info)
27 __print_cur_slist();
30 static void match_print_value(const char *fn, struct expression *expr, void *info)
32 struct state_list *slist;
33 struct sm_state *tmp;
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);
39 return;
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);
47 free_slist(&slist);
50 static void match_print_implied(const char *fn, struct expression *expr, void *info)
52 struct expression *arg;
53 struct range_list *rl = NULL;
54 char *name;
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));
61 free_string(name);
64 static void match_print_implied_min(const char *fn, struct expression *expr, void *info)
66 struct expression *arg;
67 long long val;
68 char *name;
70 arg = get_argument_from_call_expr(expr->args, 0);
71 if (!get_implied_min(arg, &val))
72 val = whole_range.min;
74 name = get_variable_from_expr_complex(arg, NULL);
75 sm_msg("implied min: %s = %lld", name, val);
76 free_string(name);
79 static void match_print_implied_max(const char *fn, struct expression *expr, void *info)
81 struct expression *arg;
82 long long val;
83 char *name;
85 arg = get_argument_from_call_expr(expr->args, 0);
86 if (!get_implied_max(arg, &val))
87 val = whole_range.max;
89 name = get_variable_from_expr_complex(arg, NULL);
90 sm_msg("implied max: %s = %lld", name, val);
91 free_string(name);
94 static void print_possible(struct sm_state *sm)
96 struct sm_state *tmp;
98 sm_msg("Possible values for %s", sm->name);
99 FOR_EACH_PTR(sm->possible, tmp) {
100 printf("%s\n", tmp->state->name);
101 } END_FOR_EACH_PTR(tmp);
102 sm_msg("===");
105 static void match_possible(const char *fn, struct expression *expr, void *info)
107 struct state_list *slist;
108 struct sm_state *tmp;
109 struct expression *arg_expr;
111 arg_expr = get_argument_from_call_expr(expr->args, 0);
112 if (arg_expr->type != EXPR_STRING) {
113 sm_msg("error: the argument to %s is supposed to be a string literal", fn);
114 return;
117 slist = get_all_states(SMATCH_EXTRA);
118 FOR_EACH_PTR(slist, tmp) {
119 if (!strcmp(tmp->name, arg_expr->string->data))
120 print_possible(tmp);
121 } END_FOR_EACH_PTR(tmp);
122 free_slist(&slist);
125 static void match_note(const char *fn, struct expression *expr, void *info)
127 struct expression *arg_expr;
129 arg_expr = get_argument_from_call_expr(expr->args, 0);
130 if (arg_expr->type != EXPR_STRING) {
131 sm_msg("error: the argument to %s is supposed to be a string literal", fn);
132 return;
134 sm_msg("%s", arg_expr->string->data);
137 static void print_related(struct sm_state *sm)
139 struct relation *rel;
141 if (!estate_related(sm->state))
142 return;
144 sm_prefix();
145 sm_printf("%s: ", sm->name);
146 FOR_EACH_PTR(estate_related(sm->state), rel) {
147 sm_printf("%s %s ", show_special(rel->op), rel->name);
148 } END_FOR_EACH_PTR(rel);
149 sm_printf("\n");
152 static void match_dump_related(const char *fn, struct expression *expr, void *info)
154 struct state_list *slist;
155 struct sm_state *tmp;
157 slist = get_all_states(SMATCH_EXTRA);
158 FOR_EACH_PTR(slist, tmp) {
159 print_related(tmp);
160 } END_FOR_EACH_PTR(tmp);
161 free_slist(&slist);
164 static void match_debug_on(const char *fn, struct expression *expr, void *info)
166 option_debug = 1;
169 static void match_debug_off(const char *fn, struct expression *expr, void *info)
171 option_debug = 0;
173 void check_debug(int id)
175 my_id = id;
176 add_function_hook("__smatch_all_values", &match_all_values, NULL);
177 add_function_hook("__smatch_value", &match_print_value, NULL);
178 add_function_hook("__smatch_implied", &match_print_implied, NULL);
179 add_function_hook("__smatch_implied_min", &match_print_implied_min, NULL);
180 add_function_hook("__smatch_implied_max", &match_print_implied_max, NULL);
181 add_function_hook("__smatch_possible", &match_possible, NULL);
182 add_function_hook("__smatch_cur_slist", &match_cur_slist, NULL);
183 add_function_hook("__smatch_note", &match_note, NULL);
184 add_function_hook("__smatch_dump_related", &match_dump_related, NULL);
185 add_function_hook("__smatch_debug_on", &match_debug_on, NULL);
186 add_function_hook("__smatch_debug_off", &match_debug_off, NULL);