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;