Print this page
11506 smatch resync

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_param_to_mtag_data.c
          +++ new/usr/src/tools/smatch/src/smatch_param_to_mtag_data.c
↓ open down ↓ 68 lines elided ↑ open up ↑
  69   69  {
  70   70          /* Basically ignore undefined states */
  71   71          if (s1 == &undefined)
  72   72                  return s2;
  73   73          if (s2 == &undefined)
  74   74                  return s1;
  75   75  
  76   76          return &merged;
  77   77  }
  78   78  
       79 +static bool is_local_var(struct expression *expr)
       80 +{
       81 +        struct symbol *sym;
       82 +
       83 +        if (!expr || expr->type != EXPR_SYMBOL)
       84 +                return false;
       85 +        sym = expr->symbol;
       86 +        if (!(sym->ctype.modifiers & MOD_TOPLEVEL))
       87 +                return true;
       88 +        return false;
       89 +}
       90 +
  79   91  static void match_assign(struct expression *expr)
  80   92  {
  81   93          struct expression *left;
  82   94          struct symbol *right_sym;
  83   95          char *name;
  84   96          mtag_t tag;
  85   97          int offset;
  86   98          int param;
  87   99  
  88  100          if (expr->op != '=')
  89  101                  return;
  90  102          left = strip_expr(expr->left);
      103 +        if (is_local_var(left))
      104 +                return;
  91  105          right_sym = expr_to_sym(expr->right);
  92  106          if (!right_sym)
  93  107                  return;
  94  108  
  95  109          param = get_param_num_from_sym(right_sym);
  96  110          if (param < 0)
  97  111                  return;
  98  112          // FIXME:  modify param_has_filter_data() to take a name/sym
  99  113          if (!expr_to_mtag_offset(left, &tag, &offset))
 100  114                  return;
 101  115          name = expr_to_str(left);
 102  116          if (!name)
 103  117                  return;
 104  118          set_state_expr(my_id, expr->right, alloc_tag_data_state(tag, name, offset));
 105  119          free_string(name);
 106  120  }
 107  121  
 108      -#if 0
 109      -static void save_mtag_to_map(struct expression *expr, mtag_t tag, int offset, int param, char *key, char *value)
 110      -{
 111      -        struct expression *arg, *gen_expr;
 112      -        mtag_t arg_tag;
 113      -
 114      -        arg = get_argument_from_call_expr(expr->args, param);
 115      -        if (!arg)
 116      -                return;
 117      -
 118      -        gen_expr = gen_expression_from_key(arg, key);
 119      -        if (!gen_expr)
 120      -                return;
 121      -
 122      -        if (!get_mtag(gen_expr, &arg_tag))
 123      -                arg_tag = 0;
 124      -
 125      -        if (local_debug)
 126      -                sm_msg("finding mtag for '%s' %lld", expr_to_str(gen_expr), arg_tag);
 127      -}
 128      -#endif
 129      -
 130  122  static void propogate_assignment(struct expression *expr, mtag_t tag, int offset, int param, char *key)
 131  123  {
 132  124          struct expression *arg;
 133  125          int orig_param;
 134  126          char buf[32];
 135  127          char *name;
 136  128          struct symbol *sym;
 137  129  
 138  130          arg = get_argument_from_call_expr(expr->args, param);
 139  131          if (!arg)
↓ open down ↓ 11 lines elided ↑ open up ↑
 151  143  free:
 152  144          free_string(name);
 153  145  }
 154  146  
 155  147  static void assign_to_alias(struct expression *expr, int param, mtag_t tag, int offset, char *key)
 156  148  {
 157  149          struct expression *arg, *gen_expr;
 158  150          struct range_list *rl;
 159  151          mtag_t arg_tag;
 160  152          mtag_t alias;
      153 +        int arg_offset;
 161  154  
 162  155          arg = get_argument_from_call_expr(expr->args, param);
 163  156          if (!arg)
 164  157                  return;
 165  158  
 166  159          gen_expr = gen_expression_from_key(arg, key);
 167  160          if (!gen_expr)
 168  161                  return;
 169  162  
 170  163          get_absolute_rl(gen_expr, &rl);
 171  164  
 172  165          if (!create_mtag_alias(tag, expr, &alias))
 173  166                  return;
 174  167  
 175  168  //      insert_mtag_data(alias, offset, rl);
 176  169  
 177      -        if (get_mtag(gen_expr, &arg_tag))
      170 +        // FIXME:  is arg_offset handled correctly?
      171 +        if (expr_to_mtag_offset(gen_expr, &arg_tag, &arg_offset) && arg_offset == 0)
 178  172                  sql_insert_mtag_map(arg_tag, -offset, alias);
 179  173  }
 180  174  
 181  175  static void call_does_mtag_assign(struct expression *expr, int param, char *key, char *value)
 182  176  {
 183  177          char *p;
 184  178          mtag_t tag;
 185  179          int offset;
 186  180  
 187  181          while (expr->type == EXPR_ASSIGNMENT)
↓ open down ↓ 34 lines elided ↑ open up ↑
 222  216                  data = sm->state->data;
 223  217                  snprintf(buf, sizeof(buf), "%lld+%d", data->tag, data->offset);
 224  218                  sql_insert_return_states(return_id, return_ranges, MTAG_ASSIGN, param, param_name, buf);
 225  219          } END_FOR_EACH_SM(sm);
 226  220  }
 227  221  
 228  222  void register_param_to_mtag_data(int id)
 229  223  {
 230  224          my_id = id;
 231  225  
      226 +        set_dynamic_states(my_id);
 232  227          add_hook(&match_assign, ASSIGNMENT_HOOK);
 233  228          select_return_states_hook(MTAG_ASSIGN, &call_does_mtag_assign);
 234  229          add_merge_hook(my_id, &merge_tag_info);
 235  230          add_split_return_callback(&print_stored_to_mtag);
 236  231  }
 237  232  
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX