From be30804e85507024ca7240d8edb9408d6c8da8a9 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Fri, 27 Feb 2009 09:11:41 +0300 Subject: [PATCH] Add function __set_true_false_sm() This is going to be used by smatch_implied.c. For smatch_implied we really want to preserve ->pools. Also we want to be able to handle merged states seeing as how some scripts care more about ->possible more than the current state. Signed-off-by: Dan Carpenter --- smatch.h | 12 ++++++++++++ smatch_slist.c | 13 +++++++++++-- smatch_slist.h | 13 +++---------- smatch_states.c | 19 +++++++++++++++++++ 4 files changed, 45 insertions(+), 12 deletions(-) diff --git a/smatch.h b/smatch.h index c59e83d2..0272f8e4 100644 --- a/smatch.h +++ b/smatch.h @@ -29,6 +29,16 @@ extern struct smatch_state merged; extern struct smatch_state true_state; extern struct smatch_state false_state; +struct sm_state { + char *name; + unsigned int owner; + struct symbol *sym; + struct smatch_state *state; + struct history_list *line_history; + struct state_list_stack *pools; + struct state_list *possible; +}; + enum hook_type { EXPR_HOOK, STMT_HOOK, @@ -146,6 +156,8 @@ int known_condition_false(struct expression *expr); extern int debug_states; struct state_list *__get_cur_slist(); +void __set_true_false_sm(struct sm_state *true_state, + struct sm_state *false_state); void nullify_path(); void __unnullify_path(); int __path_is_null(); diff --git a/smatch_slist.c b/smatch_slist.c index ad947468..43b9268e 100644 --- a/smatch_slist.c +++ b/smatch_slist.c @@ -326,8 +326,7 @@ struct smatch_state *get_state_slist(struct state_list *slist, return NULL; } -static void overwrite_sm_state(struct state_list **slist, - struct sm_state *state) +void overwrite_sm_state(struct state_list **slist, struct sm_state *state) { struct sm_state *tmp; struct sm_state *new = clone_state(state); //fixme. why? @@ -349,6 +348,16 @@ static void overwrite_sm_state(struct state_list **slist, add_ptr_list(slist, new); } +void overwrite_sm_state_stack(struct state_list_stack **stack, + struct sm_state *state) +{ + struct state_list *slist; + + slist = pop_slist(stack); + overwrite_sm_state(&slist, state); + push_slist(stack, slist); +} + void set_state_slist(struct state_list **slist, const char *name, int owner, struct symbol *sym, struct smatch_state *state) { diff --git a/smatch_slist.h b/smatch_slist.h index 1102684b..0e99d0a5 100644 --- a/smatch_slist.h +++ b/smatch_slist.h @@ -3,16 +3,6 @@ struct state_history { }; DECLARE_PTR_LIST(history_list, struct state_history); -struct sm_state { - char *name; - unsigned int owner; - struct symbol *sym; - struct smatch_state *state; - struct history_list *line_history; - struct state_list_stack *pools; - struct state_list *possible; -}; - DECLARE_ALLOCATOR(sm_state); DECLARE_PTR_LIST(state_list, struct sm_state); DECLARE_PTR_LIST(state_list_stack, struct state_list); @@ -48,6 +38,9 @@ struct smatch_state *get_state_slist(struct state_list *slist, const char *name, struct sm_state *get_sm_state_slist(struct state_list *slist, const char *name, int owner, struct symbol *sym); +void overwrite_sm_state(struct state_list **slist, struct sm_state *state); +void overwrite_sm_state_stack(struct state_list_stack **stack, + struct sm_state *state); void set_state_slist(struct state_list **slist, const char *name, int owner, struct symbol *sym, struct smatch_state *state); diff --git a/smatch_states.c b/smatch_states.c index 1358729f..f60cd6b2 100644 --- a/smatch_states.c +++ b/smatch_states.c @@ -181,6 +181,25 @@ void set_true_false_states(const char *name, int owner, struct symbol *sym, set_state_stack(&cond_false_stack, name, owner, sym, false_state); } +void __set_true_false_sm(struct sm_state *true_state, + struct sm_state *false_state) +{ + if (unreachable()) + return; + + if (!cond_false_stack || !cond_true_stack) { + printf("Error: missing true/false stacks\n"); + return; + } + + if (true_state) { + overwrite_sm_state(&cur_slist, true_state); + overwrite_sm_state_stack(&cond_true_stack, true_state); + } + if (false_state) + overwrite_sm_state_stack(&cond_false_stack, false_state); +} + void nullify_path() { del_slist(&cur_slist); -- 2.11.4.GIT