Print this page
new smatch

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_slist.c
          +++ new/usr/src/tools/smatch/src/smatch_slist.c
↓ open down ↓ 33 lines elided ↑ open up ↑
  34   34  const char *show_sm(struct sm_state *sm)
  35   35  {
  36   36          static char buf[256];
  37   37          struct sm_state *tmp;
  38   38          int pos;
  39   39          int i;
  40   40  
  41   41          if (!sm)
  42   42                  return "<none>";
  43   43  
  44      -        pos = snprintf(buf, sizeof(buf), "[%s] '%s' = '%s'",
  45      -                       check_name(sm->owner), sm->name, show_state(sm->state));
       44 +        pos = snprintf(buf, sizeof(buf), "[%s] %s = '%s'%s",
       45 +                       check_name(sm->owner), sm->name, show_state(sm->state),
       46 +                       sm->merged ? " [merged]" : "");
  46   47          if (pos > sizeof(buf))
  47   48                  goto truncate;
  48   49  
  49   50          if (ptr_list_size((struct ptr_list *)sm->possible) == 1)
  50   51                  return buf;
  51   52  
  52   53          pos += snprintf(buf + pos, sizeof(buf) - pos, " (");
  53   54          if (pos > sizeof(buf))
  54   55                  goto truncate;
  55   56          i = 0;
↓ open down ↓ 628 lines elided ↑ open up ↑
 684  685  
 685  686  static void match_states_stree(struct stree **one, struct stree **two)
 686  687  {
 687  688          struct smatch_state *tmp_state;
 688  689          struct sm_state *sm;
 689  690          struct state_list *add_to_one = NULL;
 690  691          struct state_list *add_to_two = NULL;
 691  692          AvlIter one_iter;
 692  693          AvlIter two_iter;
 693  694  
      695 +        __set_cur_stree_readonly();
      696 +
 694  697          avl_iter_begin(&one_iter, *one, FORWARD);
 695  698          avl_iter_begin(&two_iter, *two, FORWARD);
 696  699  
 697  700          for (;;) {
 698  701                  if (!one_iter.sm && !two_iter.sm)
 699  702                          break;
 700  703                  if (cmp_tracker(one_iter.sm, two_iter.sm) < 0) {
 701  704                          __set_fake_cur_stree_fast(*two);
      705 +                        __in_unmatched_hook++;
 702  706                          tmp_state = __client_unmatched_state_function(one_iter.sm);
      707 +                        __in_unmatched_hook--;
 703  708                          __pop_fake_cur_stree_fast();
 704  709                          sm = alloc_state_no_name(one_iter.sm->owner, one_iter.sm->name,
 705  710                                                    one_iter.sm->sym, tmp_state);
 706  711                          add_ptr_list(&add_to_two, sm);
 707  712                          avl_iter_next(&one_iter);
 708  713                  } else if (cmp_tracker(one_iter.sm, two_iter.sm) == 0) {
 709  714                          avl_iter_next(&one_iter);
 710  715                          avl_iter_next(&two_iter);
 711  716                  } else {
 712  717                          __set_fake_cur_stree_fast(*one);
      718 +                        __in_unmatched_hook++;
 713  719                          tmp_state = __client_unmatched_state_function(two_iter.sm);
      720 +                        __in_unmatched_hook--;
 714  721                          __pop_fake_cur_stree_fast();
 715  722                          sm = alloc_state_no_name(two_iter.sm->owner, two_iter.sm->name,
 716  723                                                    two_iter.sm->sym, tmp_state);
 717  724                          add_ptr_list(&add_to_one, sm);
 718  725                          avl_iter_next(&two_iter);
 719  726                  }
 720  727          }
 721  728  
      729 +        __set_cur_stree_writable();
      730 +
 722  731          FOR_EACH_PTR(add_to_one, sm) {
 723  732                  avl_insert(one, sm);
 724  733          } END_FOR_EACH_PTR(sm);
 725  734  
 726  735          FOR_EACH_PTR(add_to_two, sm) {
 727  736                  avl_insert(two, sm);
 728  737          } END_FOR_EACH_PTR(sm);
 729  738  
 730  739          free_slist(&add_to_one);
 731  740          free_slist(&add_to_two);
 732  741  }
 733  742  
 734  743  static void call_pre_merge_hooks(struct stree **one, struct stree **two)
 735  744  {
 736      -        struct sm_state *sm, *other;
      745 +        struct sm_state *sm, *cur;
      746 +        struct stree *new;
 737  747  
 738      -        save_all_states();
      748 +        __in_unmatched_hook++;
 739  749  
 740      -        __swap_cur_stree(*one);
      750 +        __set_fake_cur_stree_fast(*one);
      751 +        __push_fake_cur_stree();
 741  752          FOR_EACH_SM(*two, sm) {
 742      -                other = get_sm_state(sm->owner, sm->name, sm->sym);
 743      -                if (other == sm)
      753 +                cur = get_sm_state(sm->owner, sm->name, sm->sym);
      754 +                if (cur == sm)
 744  755                          continue;
 745      -                call_pre_merge_hook(sm);
      756 +                call_pre_merge_hook(cur, sm);
 746  757          } END_FOR_EACH_SM(sm);
 747      -        *one = clone_stree(__get_cur_stree());
      758 +        new = __pop_fake_cur_stree();
      759 +        overwrite_stree(new, one);
      760 +        free_stree(&new);
      761 +        __pop_fake_cur_stree_fast();
 748  762  
 749      -        __swap_cur_stree(*two);
      763 +        __set_fake_cur_stree_fast(*two);
      764 +        __push_fake_cur_stree();
 750  765          FOR_EACH_SM(*one, sm) {
 751      -                other = get_sm_state(sm->owner, sm->name, sm->sym);
 752      -                if (other == sm)
      766 +                cur = get_sm_state(sm->owner, sm->name, sm->sym);
      767 +                if (cur == sm)
 753  768                          continue;
 754      -                call_pre_merge_hook(sm);
      769 +                call_pre_merge_hook(cur, sm);
 755  770          } END_FOR_EACH_SM(sm);
 756      -        *two = clone_stree(__get_cur_stree());
      771 +        new = __pop_fake_cur_stree();
      772 +        overwrite_stree(new, two);
      773 +        free_stree(&new);
      774 +        __pop_fake_cur_stree_fast();
 757  775  
 758      -        restore_all_states();
      776 +        __in_unmatched_hook--;
 759  777  }
 760  778  
 761  779  static void clone_pool_havers_stree(struct stree **stree)
 762  780  {
 763  781          struct sm_state *sm, *tmp;
 764  782          struct state_list *slist = NULL;
 765  783  
 766  784          FOR_EACH_SM(*stree, sm) {
 767  785                  if (sm->pool) {
 768  786                          tmp = clone_sm(sm);
↓ open down ↓ 300 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX