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

@@ -140,14 +140,17 @@
             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)));
+                /*
+                 * 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,10 +808,35 @@
                 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,26 +863,27 @@
 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)
+static void separate_implication_states(struct stree **implied_true,
+                                         struct stree **implied_false,
+                                         int owner)
 {
         struct sm_state *sm;
 
-        /* We process extra states later to preserve the implications. */
+        /* We process these states later to preserve the implications. */
         FOR_EACH_SM(*implied_true, sm) {
-                if (sm->owner == SMATCH_EXTRA)
+                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 == SMATCH_EXTRA)
+                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,15 +891,20 @@
 
 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))
+        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_extra_states(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,10 +1170,10 @@
 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(&set_extra_implied_states, CONDITION_HOOK);
         add_hook(&__stored_condition, CONDITION_HOOK);
         add_hook(&match_end_func, END_FUNC_HOOK);
 }