Print this page
11972 resync smatch

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_states.c
          +++ new/usr/src/tools/smatch/src/smatch_states.c
↓ open down ↓ 36 lines elided ↑ open up ↑
  37   37  #include "smatch_slist.h"
  38   38  #include "smatch_extra.h"
  39   39  
  40   40  struct smatch_state undefined = { .name = "undefined" };
  41   41  struct smatch_state ghost = { .name = "ghost" };
  42   42  struct smatch_state merged = { .name = "merged" };
  43   43  struct smatch_state true_state = { .name = "true" };
  44   44  struct smatch_state false_state = { .name = "false" };
  45   45  
  46   46  static struct stree *cur_stree; /* current states */
       47 +static struct stree *fast_overlay;
  47   48  
  48   49  static struct stree_stack *true_stack; /* states after a t/f branch */
  49   50  static struct stree_stack *false_stack;
  50   51  static struct stree_stack *pre_cond_stack; /* states before a t/f branch */
  51   52  
  52   53  static struct stree_stack *cond_true_stack; /* states affected by a branch */
  53   54  static struct stree_stack *cond_false_stack;
  54   55  
  55   56  static struct stree_stack *fake_cur_stree_stack;
  56   57  static int read_only;
↓ open down ↓ 16 lines elided ↑ open up ↑
  73   74          __print_stree(cur_stree);
  74   75  }
  75   76  
  76   77  int unreachable(void)
  77   78  {
  78   79          if (!cur_stree)
  79   80                  return 1;
  80   81          return 0;
  81   82  }
  82   83  
       84 +void __set_cur_stree_readonly(void)
       85 +{
       86 +        read_only++;
       87 +}
       88 +
       89 +void __set_cur_stree_writable(void)
       90 +{
       91 +        read_only--;
       92 +}
       93 +
  83   94  struct sm_state *set_state(int owner, const char *name, struct symbol *sym, struct smatch_state *state)
  84   95  {
  85   96          struct sm_state *ret;
  86   97  
  87   98          if (!name || !state)
  88   99                  return NULL;
  89  100  
  90  101          if (read_only)
  91  102                  sm_perror("cur_stree is read only.");
  92  103  
↓ open down ↓ 30 lines elided ↑ open up ↑
 123  134          expr = strip_expr(expr);
 124  135          name = expr_to_var_sym(expr, &sym);
 125  136          if (!name || !sym)
 126  137                  goto free;
 127  138          ret = set_state(owner, name, sym, state);
 128  139  free:
 129  140          free_string(name);
 130  141          return ret;
 131  142  }
 132  143  
 133      -void __swap_cur_stree(struct stree *stree)
      144 +struct stree *__swap_cur_stree(struct stree *stree)
 134  145  {
 135      -        free_stree(&cur_stree);
      146 +        struct stree *orig = cur_stree;
      147 +
 136  148          cur_stree = stree;
      149 +        return orig;
 137  150  }
 138  151  
 139  152  void __push_fake_cur_stree(void)
 140  153  {
 141  154          push_stree(&fake_cur_stree_stack, NULL);
 142  155          __save_pre_cond_states();
 143  156  }
 144  157  
 145  158  struct stree *__pop_fake_cur_stree(void)
 146  159  {
↓ open down ↓ 6 lines elided ↑ open up ↑
 153  166  void __free_fake_cur_stree(void)
 154  167  {
 155  168          struct stree *stree;
 156  169  
 157  170          stree = __pop_fake_cur_stree();
 158  171          free_stree(&stree);
 159  172  }
 160  173  
 161  174  void __set_fake_cur_stree_fast(struct stree *stree)
 162  175  {
 163      -        push_stree(&pre_cond_stack, cur_stree);
 164      -        cur_stree = stree;
 165      -        read_only = 1;
      176 +        if (fast_overlay) {
      177 +                sm_perror("cannot nest fast overlay");
      178 +                return;
      179 +        }
      180 +        fast_overlay = stree;
      181 +        set_fast_math_only();
 166  182  }
 167  183  
 168  184  void __pop_fake_cur_stree_fast(void)
 169  185  {
 170      -        cur_stree = pop_stree(&pre_cond_stack);
 171      -        read_only = 0;
      186 +        fast_overlay = NULL;
      187 +        clear_fast_math_only();
 172  188  }
 173  189  
 174  190  void __merge_stree_into_cur(struct stree *stree)
 175  191  {
 176  192          struct sm_state *sm;
 177  193          struct sm_state *orig;
 178  194          struct sm_state *merged;
 179  195  
 180  196          FOR_EACH_SM(stree, sm) {
 181  197                  orig = get_sm_state(sm->owner, sm->name, sm->sym);
↓ open down ↓ 100 lines elided ↑ open up ↑
 282  298  
 283  299          FOR_EACH_PTR(get_state_hooks, fn) {
 284  300                  (*fn)(owner, name, sym);
 285  301          } END_FOR_EACH_PTR(fn);
 286  302  
 287  303          recursion = 0;
 288  304  }
 289  305  
 290  306  struct smatch_state *__get_state(int owner, const char *name, struct symbol *sym)
 291  307  {
 292      -        return get_state_stree(cur_stree, owner, name, sym);
      308 +        struct sm_state *sm;
      309 +
      310 +        sm = get_sm_state(owner, name, sym);
      311 +        if (!sm)
      312 +                return NULL;
      313 +        return sm->state;
 293  314  }
 294  315  
 295  316  struct smatch_state *get_state(int owner, const char *name, struct symbol *sym)
 296  317  {
 297  318          call_get_state_hooks(owner, name, sym);
 298  319  
 299  320          return __get_state(owner, name, sym);
 300  321  }
 301  322  
 302  323  struct smatch_state *get_state_expr(int owner, struct expression *expr)
↓ open down ↓ 33 lines elided ↑ open up ↑
 336  357          if (!name || !sym)
 337  358                  goto free;
 338  359          ret = get_possible_states(owner, name, sym);
 339  360  free:
 340  361          free_string(name);
 341  362          return ret;
 342  363  }
 343  364  
 344  365  struct sm_state *get_sm_state(int owner, const char *name, struct symbol *sym)
 345  366  {
      367 +        struct sm_state *ret;
      368 +
      369 +        ret = get_sm_state_stree(fast_overlay, owner, name, sym);
      370 +        if (ret)
      371 +                return ret;
      372 +
 346  373          return get_sm_state_stree(cur_stree, owner, name, sym);
 347  374  }
 348  375  
 349  376  struct sm_state *get_sm_state_expr(int owner, struct expression *expr)
 350  377  {
 351  378          char *name;
 352  379          struct symbol *sym;
 353  380          struct sm_state *ret = NULL;
 354  381  
 355  382          expr = strip_expr(expr);
↓ open down ↓ 230 lines elided ↑ open up ↑
 586  613  static void check_stree_stack_free(struct stree_stack **stack)
 587  614  {
 588  615          if (*stack) {
 589  616                  sm_perror("stack not empty");
 590  617                  free_stack_and_strees(stack);
 591  618          }
 592  619  }
 593  620  
 594  621  void save_all_states(void)
 595  622  {
 596      -        __add_ptr_list(&backup, cur_stree, 0);
      623 +        __add_ptr_list(&backup, cur_stree);
 597  624          cur_stree = NULL;
 598  625  
 599      -        __add_ptr_list(&backup, true_stack, 0);
      626 +        __add_ptr_list(&backup, true_stack);
 600  627          true_stack = NULL;
 601      -        __add_ptr_list(&backup, false_stack, 0);
      628 +        __add_ptr_list(&backup, false_stack);
 602  629          false_stack = NULL;
 603      -        __add_ptr_list(&backup, pre_cond_stack, 0);
      630 +        __add_ptr_list(&backup, pre_cond_stack);
 604  631          pre_cond_stack = NULL;
 605  632  
 606      -        __add_ptr_list(&backup, cond_true_stack, 0);
      633 +        __add_ptr_list(&backup, cond_true_stack);
 607  634          cond_true_stack = NULL;
 608      -        __add_ptr_list(&backup, cond_false_stack, 0);
      635 +        __add_ptr_list(&backup, cond_false_stack);
 609  636          cond_false_stack = NULL;
 610  637  
 611      -        __add_ptr_list(&backup, fake_cur_stree_stack, 0);
      638 +        __add_ptr_list(&backup, fake_cur_stree_stack);
 612  639          fake_cur_stree_stack = NULL;
 613  640  
 614      -        __add_ptr_list(&backup, break_stack, 0);
      641 +        __add_ptr_list(&backup, break_stack);
 615  642          break_stack = NULL;
 616      -        __add_ptr_list(&backup, fake_break_stack, 0);
      643 +        __add_ptr_list(&backup, fake_break_stack);
 617  644          fake_break_stack = NULL;
 618  645  
 619      -        __add_ptr_list(&backup, switch_stack, 0);
      646 +        __add_ptr_list(&backup, switch_stack);
 620  647          switch_stack = NULL;
 621      -        __add_ptr_list(&backup, remaining_cases, 0);
      648 +        __add_ptr_list(&backup, remaining_cases);
 622  649          remaining_cases = NULL;
 623      -        __add_ptr_list(&backup, default_stack, 0);
      650 +        __add_ptr_list(&backup, default_stack);
 624  651          default_stack = NULL;
 625      -        __add_ptr_list(&backup, continue_stack, 0);
      652 +        __add_ptr_list(&backup, continue_stack);
 626  653          continue_stack = NULL;
 627  654  
 628      -        __add_ptr_list(&backup, goto_stack, 0);
      655 +        __add_ptr_list(&backup, goto_stack);
 629  656          goto_stack = NULL;
 630  657  }
 631  658  
 632  659  static void *pop_backup(void)
 633  660  {
 634  661          void *ret;
 635  662  
 636  663          ret = last_ptr_list(backup);
 637  664          delete_ptr_list_last(&backup);
 638  665          return ret;
↓ open down ↓ 505 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX