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

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_implied.c
          +++ new/usr/src/tools/smatch/src/smatch_implied.c
↓ open down ↓ 134 lines elided ↑ open up ↑
 135  135  
 136  136          true_rl = rl_truncate_cast(estate_type(sm->state), true_rl);
 137  137          false_rl = rl_truncate_cast(estate_type(sm->state), false_rl);
 138  138          if (is_whole_rl(true_rl) || is_whole_rl(false_rl) ||
 139  139              !true_rl || !false_rl ||
 140  140              rl_equiv(orig_rl, true_rl) || rl_equiv(orig_rl, false_rl) ||
 141  141              rl_equiv(estate_rl(sm->state), true_rl) || rl_equiv(estate_rl(sm->state), false_rl))
 142  142                  return 0;
 143  143  
 144  144          if (rl_intersection(true_rl, false_rl)) {
 145      -                sm_perror("parsing (%s (%s) %s %s)",
 146      -                        sm->name, sm->state->name, show_special(comparison), show_rl(rl));
 147      -                sm_msg("true_rl = %s false_rl = %s intersection = %s",
 148      -                       show_rl(true_rl), show_rl(false_rl), show_rl(rl_intersection(true_rl, false_rl)));
      145 +                /*
      146 +                 * Normally these won't intersect, but one exception is when
      147 +                 * we're dealing with mtags.  We have a long list of mtags and
      148 +                 * then negate the list.  Now it's over the limit for mtag list
      149 +                 * length and we squash it down to 4096-ptr_max.  So then it's
      150 +                 * possible for the true and false rl to overlap.
      151 +                 */
 149  152                  return 0;
 150  153          }
 151  154  
 152  155          if (implied_debug)
 153  156                  sm_msg("fake_history: %s vs %s.  %s %s %s. --> T: %s F: %s",
 154  157                         sm->name, show_rl(rl), sm->state->name, show_special(comparison), show_rl(rl),
 155  158                         show_rl(true_rl), show_rl(false_rl));
 156  159  
 157  160          true_sm = clone_sm(sm);
 158  161          false_sm = clone_sm(sm);
↓ open down ↓ 641 lines elided ↑ open up ↑
 800  803          /* If the expression is known then it has no implications.  */
 801  804          if (get_implied_value(expr, &sval))
 802  805                  return true;
 803  806  
 804  807          if (expr->type == EXPR_COMPARE)
 805  808                  return handle_comparison(expr, implied_true, implied_false);
 806  809          else
 807  810                  return handle_zero_comparison(expr, implied_true, implied_false);
 808  811  }
 809  812  
      813 +static int handled_by_parsed_conditions(struct expression *expr,
      814 +                                        struct stree **implied_true,
      815 +                                        struct stree **implied_false)
      816 +{
      817 +        struct state_list *true_stack = NULL;
      818 +        struct state_list *false_stack = NULL;
      819 +        struct stree *pre_stree;
      820 +        struct sm_state *sm;
      821 +
      822 +        sm = parsed_condition_implication_hook(expr, &true_stack, &false_stack);
      823 +        if (!sm)
      824 +                return 0;
      825 +
      826 +        pre_stree = clone_stree(__get_cur_stree());
      827 +
      828 +        *implied_true = filter_stack(sm, pre_stree, false_stack, true_stack);
      829 +        *implied_false = filter_stack(sm, pre_stree, true_stack, false_stack);
      830 +
      831 +        free_stree(&pre_stree);
      832 +        free_slist(&true_stack);
      833 +        free_slist(&false_stack);
      834 +
      835 +        return 1;
      836 +}
      837 +
 810  838  static int handled_by_stored_conditions(struct expression *expr,
 811  839                                          struct stree **implied_true,
 812  840                                          struct stree **implied_false)
 813  841  {
 814  842          struct state_list *true_stack = NULL;
 815  843          struct state_list *false_stack = NULL;
 816  844          struct stree *pre_stree;
 817  845          struct sm_state *sm;
 818  846  
 819  847          sm = stored_condition_implication_hook(expr, &true_stack, &false_stack);
↓ open down ↓ 10 lines elided ↑ open up ↑
 830  858          free_slist(&false_stack);
 831  859  
 832  860          return 1;
 833  861  }
 834  862  
 835  863  static struct stree *saved_implied_true;
 836  864  static struct stree *saved_implied_false;
 837  865  static struct stree *extra_saved_implied_true;
 838  866  static struct stree *extra_saved_implied_false;
 839  867  
 840      -static void separate_extra_states(struct stree **implied_true,
 841      -                                  struct stree **implied_false)
      868 +static void separate_implication_states(struct stree **implied_true,
      869 +                                         struct stree **implied_false,
      870 +                                         int owner)
 842  871  {
 843  872          struct sm_state *sm;
 844  873  
 845      -        /* We process extra states later to preserve the implications. */
      874 +        /* We process these states later to preserve the implications. */
 846  875          FOR_EACH_SM(*implied_true, sm) {
 847      -                if (sm->owner == SMATCH_EXTRA)
      876 +                if (sm->owner == owner)
 848  877                          overwrite_sm_state_stree(&extra_saved_implied_true, sm);
 849  878          } END_FOR_EACH_SM(sm);
 850  879          FOR_EACH_SM(extra_saved_implied_true, sm) {
 851  880                  delete_state_stree(implied_true, sm->owner, sm->name, sm->sym);
 852  881          } END_FOR_EACH_SM(sm);
 853  882  
 854  883          FOR_EACH_SM(*implied_false, sm) {
 855      -                if (sm->owner == SMATCH_EXTRA)
      884 +                if (sm->owner == owner)
 856  885                          overwrite_sm_state_stree(&extra_saved_implied_false, sm);
 857  886          } END_FOR_EACH_SM(sm);
 858  887          FOR_EACH_SM(extra_saved_implied_false, sm) {
 859  888                  delete_state_stree(implied_false, sm->owner, sm->name, sm->sym);
 860  889          } END_FOR_EACH_SM(sm);
 861  890  }
 862  891  
 863  892  static void get_tf_states(struct expression *expr,
 864  893                            struct stree **implied_true,
 865  894                            struct stree **implied_false)
 866  895  {
 867      -        if (handled_by_comparison_hook(expr, implied_true, implied_false))
      896 +        if (handled_by_parsed_conditions(expr, implied_true, implied_false))
 868  897                  return;
 869  898  
      899 +        if (handled_by_comparison_hook(expr, implied_true, implied_false)) {
      900 +                separate_implication_states(implied_true, implied_false, comparison_id);
      901 +                return;
      902 +        }
      903 +
 870  904          if (handled_by_extra_states(expr, implied_true, implied_false)) {
 871      -                separate_extra_states(implied_true, implied_false);
      905 +                separate_implication_states(implied_true, implied_false, SMATCH_EXTRA);
 872  906                  return;
 873  907          }
 874  908  
 875  909          if (handled_by_stored_conditions(expr, implied_true, implied_false))
 876  910                  return;
 877  911  }
 878  912  
 879  913  static void save_implications_hook(struct expression *expr)
 880  914  {
 881  915          if (going_too_slow())
↓ open down ↓ 249 lines elided ↑ open up ↑
1131 1165  }
1132 1166  
1133 1167  void __extra_match_condition(struct expression *expr);
1134 1168  void __comparison_match_condition(struct expression *expr);
1135 1169  void __stored_condition(struct expression *expr);
1136 1170  void register_implications(int id)
1137 1171  {
1138 1172          add_hook(&save_implications_hook, CONDITION_HOOK);
1139 1173          add_hook(&set_implied_states, CONDITION_HOOK);
1140 1174          add_hook(&__extra_match_condition, CONDITION_HOOK);
1141      -        add_hook(&set_extra_implied_states, CONDITION_HOOK);
1142 1175          add_hook(&__comparison_match_condition, CONDITION_HOOK);
     1176 +        add_hook(&set_extra_implied_states, CONDITION_HOOK);
1143 1177          add_hook(&__stored_condition, CONDITION_HOOK);
1144 1178          add_hook(&match_end_func, END_FUNC_HOOK);
1145 1179  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX