From: Dan Carpenter Date: Fri, 14 Dec 2012 12:01:46 +0000 (+0300) Subject: extra: estate: move merge_estate() from extra to estate X-Git-Tag: 1.57~119 X-Git-Url: https://repo.or.cz/w/smatch.git/commitdiff_plain/e8e9267500a47d70a8bddcec3f9f31ed71ef0346 extra: estate: move merge_estate() from extra to estate I want to use this function in a later check. It fits very nicely into smatch_estate.c as well. Signed-off-by: Dan Carpenter --- diff --git a/smatch_estate.c b/smatch_estate.c index a58706fd..c31b9dc5 100644 --- a/smatch_estate.c +++ b/smatch_estate.c @@ -22,6 +22,25 @@ #include "smatch_slist.h" #include "smatch_extra.h" +struct smatch_state *merge_estates(struct smatch_state *s1, struct smatch_state *s2) +{ + struct smatch_state *tmp; + struct range_list *value_ranges; + struct related_list *rlist; + + if (estates_equiv(s1, s2)) + return s1; + + value_ranges = range_list_union(estate_ranges(s1), estate_ranges(s2)); + tmp = alloc_estate_range_list(value_ranges); + rlist = get_shared_relations(estate_related(s1), estate_related(s2)); + set_related(tmp, rlist); + if (estate_has_hard_max(s1) && estate_has_hard_max(s2)) + estate_set_hard_max(tmp); + + return tmp; +} + struct data_info *get_dinfo(struct smatch_state *state) { if (!state) diff --git a/smatch_extra.c b/smatch_extra.c index dba2c7dc..aa3f5e15 100644 --- a/smatch_extra.c +++ b/smatch_extra.c @@ -144,25 +144,6 @@ struct smatch_state *add_filter(struct smatch_state *orig, sval_t sval) return filter_range(orig, sval, sval); } -static struct smatch_state *merge_func(struct smatch_state *s1, struct smatch_state *s2) -{ - struct smatch_state *tmp; - struct range_list *value_ranges; - struct related_list *rlist; - - if (estates_equiv(s1, s2)) - return s1; - - value_ranges = range_list_union(estate_ranges(s1), estate_ranges(s2)); - tmp = alloc_estate_range_list(value_ranges); - rlist = get_shared_relations(estate_related(s1), estate_related(s2)); - set_related(tmp, rlist); - if (estate_has_hard_max(s1) && estate_has_hard_max(s2)) - estate_set_hard_max(tmp); - - return tmp; -} - static struct sm_state *handle_canonical_while_count_down(struct statement *loop) { struct expression *iter_var; @@ -1173,7 +1154,7 @@ void register_smatch_extra(int id) { my_id = id; - add_merge_hook(my_id, &merge_func); + add_merge_hook(my_id, &merge_estates); add_unmatched_state_hook(my_id, &unmatched_state); add_hook(&match_function_def, FUNC_DEF_HOOK); add_hook(&match_declarations, DECLARATION_HOOK); diff --git a/smatch_extra.h b/smatch_extra.h index d742553f..41ab4142 100644 --- a/smatch_extra.h +++ b/smatch_extra.h @@ -71,6 +71,7 @@ void __extra_pre_loop_hook_after(struct sm_state *sm, struct expression *condition); /* also implemented in smatch_extra */ +struct smatch_state *merge_estates(struct smatch_state *s1, struct smatch_state *s2); int estates_equiv(struct smatch_state *one, struct smatch_state *two); struct smatch_state *clone_estate(struct smatch_state *state); struct sm_state *set_extra_mod(const char *name, struct symbol *sym, struct smatch_state *state);