Print this page
11506 smatch resync

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_equiv.c
          +++ new/usr/src/tools/smatch/src/smatch_equiv.c
↓ open down ↓ 94 lines elided ↑ open up ↑
  95   95                  } else {
  96   96                          NEXT_PTR_LIST(two_rel);
  97   97                  }
  98   98          }
  99   99          FINISH_PTR_LIST(two_rel);
 100  100          FINISH_PTR_LIST(one_rel);
 101  101  
 102  102          return ret;
 103  103  }
 104  104  
 105      -static void debug_addition(struct related_list *rlist, const char *name)
 106      -{
 107      -        struct relation *tmp;
 108      -
 109      -        if (!option_debug_related)
 110      -                return;
 111      -
 112      -        sm_prefix();
 113      -        sm_printf("(");
 114      -        FOR_EACH_PTR(rlist, tmp) {
 115      -                sm_printf("%s ", tmp->name);
 116      -        } END_FOR_EACH_PTR(tmp);
 117      -        sm_printf(") <-- %s\n", name);
 118      -}
 119      -
 120  105  static void add_related(struct related_list **rlist, const char *name, struct symbol *sym)
 121  106  {
 122  107          struct relation *rel;
 123  108          struct relation *new;
 124  109          struct relation tmp = {
 125  110                  .name = (char *)name,
 126  111                  .sym = sym
 127  112          };
 128  113  
 129      -        debug_addition(*rlist, name);
 130      -
 131  114          FOR_EACH_PTR(*rlist, rel) {
 132  115                  if (cmp_relation(rel, &tmp) < 0)
 133  116                          continue;
 134  117                  if (cmp_relation(rel, &tmp) == 0)
 135  118                          return;
 136  119                  new = alloc_relation(name, sym);
 137  120                  INSERT_CURRENT(new, rel);
 138  121                  return;
 139  122          } END_FOR_EACH_PTR(rel);
 140  123          new = alloc_relation(name, sym);
↓ open down ↓ 64 lines elided ↑ open up ↑
 205  188          get_dinfo(estate)->related = rlist;
 206  189  }
 207  190  
 208  191  /*
 209  192   * set_equiv() is only used for assignments where we set one variable
 210  193   * equal to the other.  a = b;.  It's not used for if conditions where
 211  194   * a == b.
 212  195   */
 213  196  void set_equiv(struct expression *left, struct expression *right)
 214  197  {
 215      -        struct sm_state *right_sm, *left_sm;
      198 +        struct sm_state *right_sm, *left_sm, *other_sm;
 216  199          struct relation *rel;
 217  200          char *left_name;
 218  201          struct symbol *left_sym;
 219  202          struct related_list *rlist;
      203 +        char *other_name;
      204 +        struct symbol *other_sym;
 220  205  
 221  206          left_name = expr_to_var_sym(left, &left_sym);
 222  207          if (!left_name || !left_sym)
 223  208                  goto free;
 224  209  
      210 +        other_name = get_other_name_sym(left_name, left_sym, &other_sym);
      211 +
 225  212          right_sm = get_sm_state_expr(SMATCH_EXTRA, right);
      213 +        if (!right_sm) {
      214 +                struct range_list *rl;
      215 +
      216 +                if (!get_implied_rl(right, &rl))
      217 +                        rl = alloc_whole_rl(get_type(right));
      218 +                right_sm = set_state_expr(SMATCH_EXTRA, right, alloc_estate_rl(rl));
      219 +        }
 226  220          if (!right_sm)
 227      -                right_sm = set_state_expr(SMATCH_EXTRA, right, alloc_estate_whole(get_type(right)));
 228      -        if (!right_sm)
 229  221                  goto free;
 230  222  
 231  223          /* This block is because we want to preserve the implications. */
 232  224          left_sm = clone_sm(right_sm);
 233  225          left_sm->name = alloc_string(left_name);
 234  226          left_sm->sym = left_sym;
 235  227          left_sm->state = clone_estate_cast(get_type(left), right_sm->state);
      228 +        /* FIXME: The expression we're passing is wrong */
 236  229          set_extra_mod_helper(left_name, left_sym, left, left_sm->state);
 237  230          __set_sm(left_sm);
 238  231  
      232 +        if (other_name && other_sym) {
      233 +                other_sm = clone_sm(right_sm);
      234 +                other_sm->name = alloc_string(other_name);
      235 +                other_sm->sym = other_sym;
      236 +                other_sm->state = clone_estate_cast(get_type(left), left_sm->state);
      237 +                set_extra_mod_helper(other_name, other_sym, NULL, other_sm->state);
      238 +                __set_sm(other_sm);
      239 +        }
      240 +
 239  241          rlist = clone_related_list(estate_related(right_sm->state));
 240  242          add_related(&rlist, right_sm->name, right_sm->sym);
 241  243          add_related(&rlist, left_name, left_sym);
      244 +        if (other_name && other_sym)
      245 +                add_related(&rlist, other_name, other_sym);
 242  246  
 243  247          FOR_EACH_PTR(rlist, rel) {
 244  248                  struct sm_state *old_sm, *new_sm;
 245  249  
 246  250                  old_sm = get_sm_state(SMATCH_EXTRA, rel->name, rel->sym);
 247  251                  if (!old_sm)  /* shouldn't happen */
 248  252                          continue;
 249  253                  new_sm = clone_sm(old_sm);
 250  254                  new_sm->state = clone_estate(old_sm->state);
 251  255                  get_dinfo(new_sm->state)->related = rlist;
↓ open down ↓ 20 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX