From 2bed2b72e759fde770bff0ba40af76b1c5d89baa Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 26 Mar 2009 11:01:27 +0300 Subject: [PATCH] implied: add get_implications() for scripts to use. It gives a slist of what cur_slist would looks like assuming that a condition was true or false. Signed-off-by: Dan Carpenter --- smatch.h | 3 +++ smatch_implied.c | 22 ++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/smatch.h b/smatch.h index 78533ba9..279d9bff 100644 --- a/smatch.h +++ b/smatch.h @@ -166,6 +166,9 @@ void __split_whole_condition(struct expression *expr); /* smatch_implied.c */ extern int debug_implied_states; extern int option_no_implied; +void get_implications(char *name, struct symbol *sym, int comparison, int num, + struct state_list **true_states, + struct state_list **false_states); /* smatch_extras.c */ #define SMATCH_EXTRA 1 /* this is my_id from smatch extra set in smatch.c */ diff --git a/smatch_implied.c b/smatch_implied.c index 9ccac41a..edaf83d6 100644 --- a/smatch_implied.c +++ b/smatch_implied.c @@ -227,11 +227,11 @@ static void get_eq_neq(struct sm_state *sm_state, int comparison, int num, struct state_list_stack *false_stack = NULL; if (left) - DIMPLIED("checking implications: (%s %s %d)\n", sm_state->name, - show_special(comparison), num); + DIMPLIED("%d checking implications: (%s %s %d)\n", get_lineno(), + sm_state->name, show_special(comparison), num); else - DIMPLIED("checking implications: (%d %s %s)\n", num, - show_special(comparison), sm_state->name); + DIMPLIED("%d checking implications: (%d %s %s)\n", get_lineno(), + num, show_special(comparison), sm_state->name); FOR_EACH_PTR(sm_state->my_pools, list) { s = get_sm_state_slist(list, sm_state->name, sm_state->owner, @@ -352,6 +352,20 @@ static void implied_states_hook(struct expression *expr) free_slist(&implied_false); } +void get_implications(char *name, struct symbol *sym, int comparison, int num, + struct state_list **true_states, + struct state_list **false_states) +{ + struct sm_state *sm; + + sm = get_sm_state(name, SMATCH_EXTRA, sym); + if (!sm) + return; + if (slist_has_state(sm->possible, &undefined)) + return; + get_eq_neq(sm, comparison, num, 1, true_states, false_states); +} + void register_implications(int id) { add_hook(&implied_states_hook, CONDITION_HOOK); -- 2.11.4.GIT