Print this page
11972 resync smatch

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_mtag_data.c
          +++ new/usr/src/tools/smatch/src/smatch_mtag_data.c
↓ open down ↓ 61 lines elided ↑ open up ↑
  62   62          snprintf(buf, sizeof(buf), "__param_%s.arg", name);
  63   63  
  64   64          FOR_EACH_SM(vals, tmp) {
  65   65                  if (strcmp(tmp->name, buf) == 0)
  66   66                          return 1;
  67   67          } END_FOR_EACH_SM(tmp);
  68   68  
  69   69          return 0;
  70   70  }
  71   71  
       72 +static bool is_ignored_macro(struct expression *expr)
       73 +{
       74 +        char *macro;
       75 +
       76 +        macro = get_macro_name(expr->pos);
       77 +        if (!macro)
       78 +                return false;
       79 +        if (strcmp(macro, "EXPORT_SYMBOL") == 0)
       80 +                return true;
       81 +        return false;
       82 +}
       83 +
  72   84  static void insert_mtag_data(mtag_t tag, int offset, struct range_list *rl)
  73   85  {
  74   86          rl = clone_rl_permanent(rl);
  75   87  
  76   88          mem_sql(NULL, NULL, "delete from mtag_data where tag = %lld and offset = %d and type = %d",
  77   89                  tag, offset, DATA_VALUE);
  78   90          mem_sql(NULL, NULL, "insert into mtag_data values (%lld, %d, %d, '%lu');",
  79   91                  tag, offset, DATA_VALUE, (unsigned long)rl);
  80   92  }
  81   93  
  82      -void update_mtag_data(struct expression *expr)
       94 +static bool invalid_type(struct symbol *type)
  83   95  {
  84      -        struct range_list *orig, *new, *rl;
       96 +        if (!type)
       97 +                return true;
       98 +        if (type == &void_ctype)
       99 +                return true;
      100 +        if (type->type == SYM_STRUCT ||
      101 +            type->type == SYM_ARRAY ||
      102 +            type->type == SYM_UNION)
      103 +                return true;
      104 +        return false;
      105 +}
      106 +
      107 +void update_mtag_data(struct expression *expr, struct smatch_state *state)
      108 +{
      109 +        struct range_list *orig, *new;
  85  110          struct symbol *type;
  86  111          char *name;
  87  112          mtag_t tag;
  88  113          int offset;
  89  114  
      115 +        if (!expr)
      116 +                return;
      117 +        if (is_local_variable(expr))
      118 +                return;
      119 +        if (is_ignored_macro(expr))
      120 +                return;
  90  121          name = expr_to_var(expr);
  91  122          if (is_kernel_param(name)) {
  92  123                  free_string(name);
  93  124                  return;
  94  125          }
  95  126          free_string(name);
  96  127  
  97  128          if (!expr_to_mtag_offset(expr, &tag, &offset))
  98  129                  return;
  99  130  
 100  131          type = get_type(expr);
 101      -        if ((offset == 0) &&
 102      -            (!type || type == &void_ctype ||
 103      -             type->type == SYM_STRUCT || type->type == SYM_UNION || type->type == SYM_ARRAY))
      132 +        if (offset == 0 && invalid_type(type))
 104  133                  return;
 105  134  
 106      -        get_absolute_rl(expr, &rl);
 107      -
 108  135          orig = select_orig(tag, offset);
 109      -        new = rl_union(orig, rl);
      136 +        new = rl_union(orig, estate_rl(state));
 110  137          insert_mtag_data(tag, offset, new);
 111  138  }
 112  139  
 113  140  static void match_global_assign(struct expression *expr)
 114  141  {
 115  142          struct range_list *rl;
 116  143          mtag_t tag;
 117  144          int offset;
 118  145          char *name;
 119  146  
      147 +        if (is_ignored_macro(expr))
      148 +                return;
 120  149          name = expr_to_var(expr->left);
 121  150          if (is_kernel_param(name)) {
 122  151                  free_string(name);
 123  152                  return;
 124  153          }
 125  154          free_string(name);
 126  155  
 127  156          if (!expr_to_mtag_offset(expr->left, &tag, &offset))
 128  157                  return;
 129  158  
↓ open down ↓ 51 lines elided ↑ open up ↑
 181  210  static struct db_cache_results cached_results[8];
 182  211  
 183  212  static int get_rl_from_mtag_offset(mtag_t tag, int offset, struct symbol *type, struct range_list **rl)
 184  213  {
 185  214          struct db_info db_info = {};
 186  215          mtag_t merged = tag | offset;
 187  216          static int idx;
 188  217          int ret;
 189  218          int i;
 190  219  
 191      -        if (!type || type == &void_ctype ||
 192      -            (type->type == SYM_STRUCT || type->type == SYM_ARRAY || type->type == SYM_UNION))
 193      -                return 0;
 194      -
 195  220          for (i = 0; i < ARRAY_SIZE(cached_results); i++) {
 196  221                  if (merged == cached_results[i].tag) {
 197  222                          if (cached_results[i].rl) {
 198  223                                  *rl = cached_results[i].rl;
 199  224                                  return 1;
 200  225                          }
 201  226                          return 0;
 202  227                  }
 203  228          }
 204  229  
↓ open down ↓ 23 lines elided ↑ open up ↑
 228  253  {
 229  254          memset(cached_results, 0, sizeof(cached_results));
 230  255  }
 231  256  
 232  257  int get_mtag_rl(struct expression *expr, struct range_list **rl)
 233  258  {
 234  259          struct symbol *type;
 235  260          mtag_t tag;
 236  261          int offset;
 237  262  
      263 +        if (is_local_variable(expr))
      264 +                return 0;
 238  265          if (!expr_to_mtag_offset(expr, &tag, &offset))
 239  266                  return 0;
 240  267          if (offset >= MTAG_OFFSET_MASK)
 241  268                  return 0;
 242  269  
 243  270          type = get_type(expr);
 244      -        if (!type)
      271 +        if (invalid_type(type))
 245  272                  return 0;
 246  273  
 247  274          return get_rl_from_mtag_offset(tag, offset, type, rl);
 248  275  }
 249  276  
 250  277  void register_mtag_data(int id)
 251  278  {
 252  279          my_id = id;
 253  280  
 254  281          add_hook(&clear_cache, FUNC_DEF_HOOK);
 255  282  
 256  283  //      if (!option_info)
 257  284  //              return;
 258  285          add_hook(&match_global_assign, GLOBAL_ASSIGNMENT_HOOK);
 259  286          add_hook(&match_end_file, END_FILE_HOOK);
 260  287  }
 261  288  
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX