146 cache_sql(&get_vals, &db_info, "select value from sink_info where sink_name = '%s' and type = %d;",
147 name, DATA_VALUE);
148 return db_info.rl;
149 }
150
151 static void update_cache(char *name, int is_static, struct range_list *rl)
152 {
153 cache_sql(NULL, NULL, "delete from sink_info where sink_name = '%s' and type = %d;",
154 name, DATA_VALUE);
155 cache_sql(NULL, NULL, "insert into sink_info values ('%s', %d, '%s', %d, '', '%s');",
156 get_filename(), is_static, name, DATA_VALUE, show_rl(rl));
157 }
158
159 static void match_assign(struct expression *expr)
160 {
161 struct expression *left, *array;
162 struct range_list *orig_rl, *rl;
163 struct symbol *type;
164 char *name;
165
166 type = get_type(expr->right);
167 if (!type || type->type != SYM_BASETYPE)
168 return;
169
170 left = strip_expr(expr->left);
171 if (!is_array(left))
172 return;
173 array = get_array_base(left);
174 name = get_array_name(array);
175 if (!name)
176 return;
177
178 if (expr->op != '=') {
179 rl = alloc_whole_rl(type);
180 } else {
181 get_absolute_rl(expr->right, &rl);
182 rl = cast_rl(type, rl);
183 orig_rl = get_saved_rl(type, name);
184 rl = rl_union(orig_rl, rl);
185 }
186
187 update_cache(name, is_file_local(array), rl);
188 }
189
190 void register_array_values(int id)
191 {
192 my_id = id;
193
194 add_hook(&match_assign, ASSIGNMENT_HOOK);
195 add_hook(&match_assign, GLOBAL_ASSIGNMENT_HOOK);
196 }
|
146 cache_sql(&get_vals, &db_info, "select value from sink_info where sink_name = '%s' and type = %d;",
147 name, DATA_VALUE);
148 return db_info.rl;
149 }
150
151 static void update_cache(char *name, int is_static, struct range_list *rl)
152 {
153 cache_sql(NULL, NULL, "delete from sink_info where sink_name = '%s' and type = %d;",
154 name, DATA_VALUE);
155 cache_sql(NULL, NULL, "insert into sink_info values ('%s', %d, '%s', %d, '', '%s');",
156 get_filename(), is_static, name, DATA_VALUE, show_rl(rl));
157 }
158
159 static void match_assign(struct expression *expr)
160 {
161 struct expression *left, *array;
162 struct range_list *orig_rl, *rl;
163 struct symbol *type;
164 char *name;
165
166 type = get_type(expr->left);
167 if (!type || type->type != SYM_BASETYPE)
168 return;
169
170 left = strip_expr(expr->left);
171 if (!is_array(left))
172 return;
173 array = get_array_base(left);
174 name = get_array_name(array);
175 if (!name)
176 return;
177
178 if (expr->op != '=') {
179 rl = alloc_whole_rl(get_type(expr->right));
180 rl = cast_rl(type, rl);
181 } else {
182 get_absolute_rl(expr->right, &rl);
183 rl = cast_rl(type, rl);
184 orig_rl = get_saved_rl(type, name);
185 rl = rl_union(orig_rl, rl);
186 }
187
188 update_cache(name, is_file_local(array), rl);
189 }
190
191 void register_array_values(int id)
192 {
193 my_id = id;
194
195 add_hook(&match_assign, ASSIGNMENT_HOOK);
196 add_hook(&match_assign, GLOBAL_ASSIGNMENT_HOOK);
197 }
|