Print this page
11972 resync smatch
*** 42,51 ****
--- 42,52 ----
struct smatch_state merged = { .name = "merged" };
struct smatch_state true_state = { .name = "true" };
struct smatch_state false_state = { .name = "false" };
static struct stree *cur_stree; /* current states */
+ static struct stree *fast_overlay;
static struct stree_stack *true_stack; /* states after a t/f branch */
static struct stree_stack *false_stack;
static struct stree_stack *pre_cond_stack; /* states before a t/f branch */
*** 78,87 ****
--- 79,98 ----
if (!cur_stree)
return 1;
return 0;
}
+ void __set_cur_stree_readonly(void)
+ {
+ read_only++;
+ }
+
+ void __set_cur_stree_writable(void)
+ {
+ read_only--;
+ }
+
struct sm_state *set_state(int owner, const char *name, struct symbol *sym, struct smatch_state *state)
{
struct sm_state *ret;
if (!name || !state)
*** 128,141 ****
free:
free_string(name);
return ret;
}
! void __swap_cur_stree(struct stree *stree)
{
! free_stree(&cur_stree);
cur_stree = stree;
}
void __push_fake_cur_stree(void)
{
push_stree(&fake_cur_stree_stack, NULL);
--- 139,154 ----
free:
free_string(name);
return ret;
}
! struct stree *__swap_cur_stree(struct stree *stree)
{
! struct stree *orig = cur_stree;
!
cur_stree = stree;
+ return orig;
}
void __push_fake_cur_stree(void)
{
push_stree(&fake_cur_stree_stack, NULL);
*** 158,176 ****
free_stree(&stree);
}
void __set_fake_cur_stree_fast(struct stree *stree)
{
! push_stree(&pre_cond_stack, cur_stree);
! cur_stree = stree;
! read_only = 1;
}
void __pop_fake_cur_stree_fast(void)
{
! cur_stree = pop_stree(&pre_cond_stack);
! read_only = 0;
}
void __merge_stree_into_cur(struct stree *stree)
{
struct sm_state *sm;
--- 171,192 ----
free_stree(&stree);
}
void __set_fake_cur_stree_fast(struct stree *stree)
{
! if (fast_overlay) {
! sm_perror("cannot nest fast overlay");
! return;
! }
! fast_overlay = stree;
! set_fast_math_only();
}
void __pop_fake_cur_stree_fast(void)
{
! fast_overlay = NULL;
! clear_fast_math_only();
}
void __merge_stree_into_cur(struct stree *stree)
{
struct sm_state *sm;
*** 287,297 ****
recursion = 0;
}
struct smatch_state *__get_state(int owner, const char *name, struct symbol *sym)
{
! return get_state_stree(cur_stree, owner, name, sym);
}
struct smatch_state *get_state(int owner, const char *name, struct symbol *sym)
{
call_get_state_hooks(owner, name, sym);
--- 303,318 ----
recursion = 0;
}
struct smatch_state *__get_state(int owner, const char *name, struct symbol *sym)
{
! struct sm_state *sm;
!
! sm = get_sm_state(owner, name, sym);
! if (!sm)
! return NULL;
! return sm->state;
}
struct smatch_state *get_state(int owner, const char *name, struct symbol *sym)
{
call_get_state_hooks(owner, name, sym);
*** 341,350 ****
--- 362,377 ----
return ret;
}
struct sm_state *get_sm_state(int owner, const char *name, struct symbol *sym)
{
+ struct sm_state *ret;
+
+ ret = get_sm_state_stree(fast_overlay, owner, name, sym);
+ if (ret)
+ return ret;
+
return get_sm_state_stree(cur_stree, owner, name, sym);
}
struct sm_state *get_sm_state_expr(int owner, struct expression *expr)
{
*** 591,633 ****
}
}
void save_all_states(void)
{
! __add_ptr_list(&backup, cur_stree, 0);
cur_stree = NULL;
! __add_ptr_list(&backup, true_stack, 0);
true_stack = NULL;
! __add_ptr_list(&backup, false_stack, 0);
false_stack = NULL;
! __add_ptr_list(&backup, pre_cond_stack, 0);
pre_cond_stack = NULL;
! __add_ptr_list(&backup, cond_true_stack, 0);
cond_true_stack = NULL;
! __add_ptr_list(&backup, cond_false_stack, 0);
cond_false_stack = NULL;
! __add_ptr_list(&backup, fake_cur_stree_stack, 0);
fake_cur_stree_stack = NULL;
! __add_ptr_list(&backup, break_stack, 0);
break_stack = NULL;
! __add_ptr_list(&backup, fake_break_stack, 0);
fake_break_stack = NULL;
! __add_ptr_list(&backup, switch_stack, 0);
switch_stack = NULL;
! __add_ptr_list(&backup, remaining_cases, 0);
remaining_cases = NULL;
! __add_ptr_list(&backup, default_stack, 0);
default_stack = NULL;
! __add_ptr_list(&backup, continue_stack, 0);
continue_stack = NULL;
! __add_ptr_list(&backup, goto_stack, 0);
goto_stack = NULL;
}
static void *pop_backup(void)
{
--- 618,660 ----
}
}
void save_all_states(void)
{
! __add_ptr_list(&backup, cur_stree);
cur_stree = NULL;
! __add_ptr_list(&backup, true_stack);
true_stack = NULL;
! __add_ptr_list(&backup, false_stack);
false_stack = NULL;
! __add_ptr_list(&backup, pre_cond_stack);
pre_cond_stack = NULL;
! __add_ptr_list(&backup, cond_true_stack);
cond_true_stack = NULL;
! __add_ptr_list(&backup, cond_false_stack);
cond_false_stack = NULL;
! __add_ptr_list(&backup, fake_cur_stree_stack);
fake_cur_stree_stack = NULL;
! __add_ptr_list(&backup, break_stack);
break_stack = NULL;
! __add_ptr_list(&backup, fake_break_stack);
fake_break_stack = NULL;
! __add_ptr_list(&backup, switch_stack);
switch_stack = NULL;
! __add_ptr_list(&backup, remaining_cases);
remaining_cases = NULL;
! __add_ptr_list(&backup, default_stack);
default_stack = NULL;
! __add_ptr_list(&backup, continue_stack);
continue_stack = NULL;
! __add_ptr_list(&backup, goto_stack);
goto_stack = NULL;
}
static void *pop_backup(void)
{