Print this page
11506 smatch resync

*** 34,48 **** *rl = strtoul(argv[0], NULL, 10); return 0; } ! static struct range_list *select_orig_rl(sval_t sval) { struct range_list *rl = NULL; - mtag_t tag = sval.uvalue & ~MTAG_OFFSET_MASK; - int offset = sval.uvalue & MTAG_OFFSET_MASK; mem_sql(&save_rl, &rl, "select value from mtag_data where tag = %lld and offset = %d;", tag, offset); return rl; } --- 34,46 ---- *rl = strtoul(argv[0], NULL, 10); return 0; } ! static struct range_list *select_orig(mtag_t tag, int offset) { struct range_list *rl = NULL; mem_sql(&save_rl, &rl, "select value from mtag_data where tag = %lld and offset = %d;", tag, offset); return rl; }
*** 69,83 **** } END_FOR_EACH_SM(tmp); return 0; } ! void insert_mtag_data(sval_t sval, struct range_list *rl) { - mtag_t tag = sval.uvalue & ~MTAG_OFFSET_MASK; - int offset = sval.uvalue & MTAG_OFFSET_MASK; - rl = clone_rl_permanent(rl); mem_sql(NULL, NULL, "delete from mtag_data where tag = %lld and offset = %d and type = %d", tag, offset, DATA_VALUE); mem_sql(NULL, NULL, "insert into mtag_data values (%lld, %d, %d, '%lu');", --- 67,78 ---- } END_FOR_EACH_SM(tmp); return 0; } ! static void insert_mtag_data(mtag_t tag, int offset, struct range_list *rl) { rl = clone_rl_permanent(rl); mem_sql(NULL, NULL, "delete from mtag_data where tag = %lld and offset = %d and type = %d", tag, offset, DATA_VALUE); mem_sql(NULL, NULL, "insert into mtag_data values (%lld, %d, %d, '%lu');",
*** 85,132 **** } void update_mtag_data(struct expression *expr) { struct range_list *orig, *new, *rl; char *name; ! sval_t sval; name = expr_to_var(expr); if (is_kernel_param(name)) { free_string(name); return; } free_string(name); ! if (!get_mtag_addr_sval(expr, &sval)) return; get_absolute_rl(expr, &rl); ! orig = select_orig_rl(sval); new = rl_union(orig, rl); ! insert_mtag_data(sval, new); } static void match_global_assign(struct expression *expr) { struct range_list *rl; ! sval_t sval; char *name; name = expr_to_var(expr->left); if (is_kernel_param(name)) { free_string(name); return; } free_string(name); ! if (!get_mtag_addr_sval(expr->left, &sval)) return; get_absolute_rl(expr->right, &rl); ! insert_mtag_data(sval, rl); } static int save_mtag_data(void *_unused, int argc, char **argv, char **azColName) { struct range_list *rl; --- 80,136 ---- } void update_mtag_data(struct expression *expr) { struct range_list *orig, *new, *rl; + struct symbol *type; char *name; ! mtag_t tag; ! int offset; name = expr_to_var(expr); if (is_kernel_param(name)) { free_string(name); return; } free_string(name); ! if (!expr_to_mtag_offset(expr, &tag, &offset)) return; + type = get_type(expr); + if ((offset == 0) && + (!type || type == &void_ctype || + type->type == SYM_STRUCT || type->type == SYM_UNION || type->type == SYM_ARRAY)) + return; + get_absolute_rl(expr, &rl); ! orig = select_orig(tag, offset); new = rl_union(orig, rl); ! insert_mtag_data(tag, offset, new); } static void match_global_assign(struct expression *expr) { struct range_list *rl; ! mtag_t tag; ! int offset; char *name; name = expr_to_var(expr->left); if (is_kernel_param(name)) { free_string(name); return; } free_string(name); ! if (!expr_to_mtag_offset(expr->left, &tag, &offset)) return; get_absolute_rl(expr->right, &rl); ! insert_mtag_data(tag, offset, rl); } static int save_mtag_data(void *_unused, int argc, char **argv, char **azColName) { struct range_list *rl;
*** 169,208 **** return 0; } struct db_cache_results { ! sval_t sval; struct range_list *rl; }; static struct db_cache_results cached_results[8]; ! static int get_rl_from_mtag_sval(sval_t sval, struct symbol *type, struct range_list **rl) { struct db_info db_info = {}; ! mtag_t tag; ! int offset; static int idx; int ret; int i; for (i = 0; i < ARRAY_SIZE(cached_results); i++) { ! if (sval.uvalue == cached_results[i].sval.uvalue) { if (cached_results[i].rl) { *rl = cached_results[i].rl; return 1; } return 0; } } - tag = sval.uvalue & ~MTAG_OFFSET_MASK; - offset = sval.uvalue & MTAG_OFFSET_MASK; - if (offset == MTAG_OFFSET_MASK) { - ret = 0; - goto update_cache; - } db_info.type = type; run_sql(get_vals, &db_info, "select value from mtag_data where tag = %lld and offset = %d and type = %d;", tag, offset, DATA_VALUE); --- 173,209 ---- return 0; } struct db_cache_results { ! mtag_t tag; struct range_list *rl; }; static struct db_cache_results cached_results[8]; ! static int get_rl_from_mtag_offset(mtag_t tag, int offset, struct symbol *type, struct range_list **rl) { struct db_info db_info = {}; ! mtag_t merged = tag | offset; static int idx; int ret; int i; + if (!type || type == &void_ctype || + (type->type == SYM_STRUCT || type->type == SYM_ARRAY || type->type == SYM_UNION)) + return 0; + for (i = 0; i < ARRAY_SIZE(cached_results); i++) { ! if (merged == cached_results[i].tag) { if (cached_results[i].rl) { *rl = cached_results[i].rl; return 1; } return 0; } } db_info.type = type; run_sql(get_vals, &db_info, "select value from mtag_data where tag = %lld and offset = %d and type = %d;", tag, offset, DATA_VALUE);
*** 214,224 **** *rl = db_info.rl; ret = 1; update_cache: ! cached_results[idx].sval = sval; cached_results[idx].rl = db_info.rl; idx = (idx + 1) % ARRAY_SIZE(cached_results); return ret; } --- 215,225 ---- *rl = db_info.rl; ret = 1; update_cache: ! cached_results[idx].tag = merged; cached_results[idx].rl = db_info.rl; idx = (idx + 1) % ARRAY_SIZE(cached_results); return ret; }
*** 229,248 **** } int get_mtag_rl(struct expression *expr, struct range_list **rl) { struct symbol *type; ! sval_t sval; ! if (!get_mtag_addr_sval(expr, &sval)) return 0; type = get_type(expr); if (!type) return 0; ! return get_rl_from_mtag_sval(sval, type, rl); } void register_mtag_data(int id) { my_id = id; --- 230,252 ---- } int get_mtag_rl(struct expression *expr, struct range_list **rl) { struct symbol *type; ! mtag_t tag; ! int offset; ! if (!expr_to_mtag_offset(expr, &tag, &offset)) return 0; + if (offset >= MTAG_OFFSET_MASK) + return 0; type = get_type(expr); if (!type) return 0; ! return get_rl_from_mtag_offset(tag, offset, type, rl); } void register_mtag_data(int id) { my_id = id;