Print this page
12166 resync smatch to 0.6.1-rc1-il-3

*** 140,153 **** rl_equiv(orig_rl, true_rl) || rl_equiv(orig_rl, false_rl) || rl_equiv(estate_rl(sm->state), true_rl) || rl_equiv(estate_rl(sm->state), false_rl)) return 0; if (rl_intersection(true_rl, false_rl)) { ! sm_perror("parsing (%s (%s) %s %s)", ! sm->name, sm->state->name, show_special(comparison), show_rl(rl)); ! sm_msg("true_rl = %s false_rl = %s intersection = %s", ! show_rl(true_rl), show_rl(false_rl), show_rl(rl_intersection(true_rl, false_rl))); return 0; } if (implied_debug) sm_msg("fake_history: %s vs %s. %s %s %s. --> T: %s F: %s", --- 140,156 ---- rl_equiv(orig_rl, true_rl) || rl_equiv(orig_rl, false_rl) || rl_equiv(estate_rl(sm->state), true_rl) || rl_equiv(estate_rl(sm->state), false_rl)) return 0; if (rl_intersection(true_rl, false_rl)) { ! /* ! * Normally these won't intersect, but one exception is when ! * we're dealing with mtags. We have a long list of mtags and ! * then negate the list. Now it's over the limit for mtag list ! * length and we squash it down to 4096-ptr_max. So then it's ! * possible for the true and false rl to overlap. ! */ return 0; } if (implied_debug) sm_msg("fake_history: %s vs %s. %s %s %s. --> T: %s F: %s",
*** 805,814 **** --- 808,842 ---- return handle_comparison(expr, implied_true, implied_false); else return handle_zero_comparison(expr, implied_true, implied_false); } + static int handled_by_parsed_conditions(struct expression *expr, + struct stree **implied_true, + struct stree **implied_false) + { + struct state_list *true_stack = NULL; + struct state_list *false_stack = NULL; + struct stree *pre_stree; + struct sm_state *sm; + + sm = parsed_condition_implication_hook(expr, &true_stack, &false_stack); + if (!sm) + return 0; + + pre_stree = clone_stree(__get_cur_stree()); + + *implied_true = filter_stack(sm, pre_stree, false_stack, true_stack); + *implied_false = filter_stack(sm, pre_stree, true_stack, false_stack); + + free_stree(&pre_stree); + free_slist(&true_stack); + free_slist(&false_stack); + + return 1; + } + static int handled_by_stored_conditions(struct expression *expr, struct stree **implied_true, struct stree **implied_false) { struct state_list *true_stack = NULL;
*** 835,860 **** static struct stree *saved_implied_true; static struct stree *saved_implied_false; static struct stree *extra_saved_implied_true; static struct stree *extra_saved_implied_false; ! static void separate_extra_states(struct stree **implied_true, ! struct stree **implied_false) { struct sm_state *sm; ! /* We process extra states later to preserve the implications. */ FOR_EACH_SM(*implied_true, sm) { ! if (sm->owner == SMATCH_EXTRA) overwrite_sm_state_stree(&extra_saved_implied_true, sm); } END_FOR_EACH_SM(sm); FOR_EACH_SM(extra_saved_implied_true, sm) { delete_state_stree(implied_true, sm->owner, sm->name, sm->sym); } END_FOR_EACH_SM(sm); FOR_EACH_SM(*implied_false, sm) { ! if (sm->owner == SMATCH_EXTRA) overwrite_sm_state_stree(&extra_saved_implied_false, sm); } END_FOR_EACH_SM(sm); FOR_EACH_SM(extra_saved_implied_false, sm) { delete_state_stree(implied_false, sm->owner, sm->name, sm->sym); } END_FOR_EACH_SM(sm); --- 863,889 ---- static struct stree *saved_implied_true; static struct stree *saved_implied_false; static struct stree *extra_saved_implied_true; static struct stree *extra_saved_implied_false; ! static void separate_implication_states(struct stree **implied_true, ! struct stree **implied_false, ! int owner) { struct sm_state *sm; ! /* We process these states later to preserve the implications. */ FOR_EACH_SM(*implied_true, sm) { ! if (sm->owner == owner) overwrite_sm_state_stree(&extra_saved_implied_true, sm); } END_FOR_EACH_SM(sm); FOR_EACH_SM(extra_saved_implied_true, sm) { delete_state_stree(implied_true, sm->owner, sm->name, sm->sym); } END_FOR_EACH_SM(sm); FOR_EACH_SM(*implied_false, sm) { ! if (sm->owner == owner) overwrite_sm_state_stree(&extra_saved_implied_false, sm); } END_FOR_EACH_SM(sm); FOR_EACH_SM(extra_saved_implied_false, sm) { delete_state_stree(implied_false, sm->owner, sm->name, sm->sym); } END_FOR_EACH_SM(sm);
*** 862,876 **** static void get_tf_states(struct expression *expr, struct stree **implied_true, struct stree **implied_false) { ! if (handled_by_comparison_hook(expr, implied_true, implied_false)) return; if (handled_by_extra_states(expr, implied_true, implied_false)) { ! separate_extra_states(implied_true, implied_false); return; } if (handled_by_stored_conditions(expr, implied_true, implied_false)) return; --- 891,910 ---- static void get_tf_states(struct expression *expr, struct stree **implied_true, struct stree **implied_false) { ! if (handled_by_parsed_conditions(expr, implied_true, implied_false)) return; + if (handled_by_comparison_hook(expr, implied_true, implied_false)) { + separate_implication_states(implied_true, implied_false, comparison_id); + return; + } + if (handled_by_extra_states(expr, implied_true, implied_false)) { ! separate_implication_states(implied_true, implied_false, SMATCH_EXTRA); return; } if (handled_by_stored_conditions(expr, implied_true, implied_false)) return;
*** 1136,1145 **** void register_implications(int id) { add_hook(&save_implications_hook, CONDITION_HOOK); add_hook(&set_implied_states, CONDITION_HOOK); add_hook(&__extra_match_condition, CONDITION_HOOK); - add_hook(&set_extra_implied_states, CONDITION_HOOK); add_hook(&__comparison_match_condition, CONDITION_HOOK); add_hook(&__stored_condition, CONDITION_HOOK); add_hook(&match_end_func, END_FUNC_HOOK); } --- 1170,1179 ---- void register_implications(int id) { add_hook(&save_implications_hook, CONDITION_HOOK); add_hook(&set_implied_states, CONDITION_HOOK); add_hook(&__extra_match_condition, CONDITION_HOOK); add_hook(&__comparison_match_condition, CONDITION_HOOK); + add_hook(&set_extra_implied_states, CONDITION_HOOK); add_hook(&__stored_condition, CONDITION_HOOK); add_hook(&match_end_func, END_FUNC_HOOK); }