Print this page
12166 resync smatch to 0.6.1-rc1-il-3

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_sval.c
          +++ new/usr/src/tools/smatch/src/smatch_sval.c
↓ open down ↓ 66 lines elided ↑ open up ↑
  67   67          sval_t ret;
  68   68  
  69   69          if (!type)
  70   70                  type = &llong_ctype;
  71   71  
  72   72          ret.type = type;
  73   73          ret.value = val;
  74   74          return ret;
  75   75  }
  76   76  
       77 +sval_t sval_type_fval(struct symbol *type, long double fval)
       78 +{
       79 +        sval_t ret;
       80 +
       81 +        ret.type = &ldouble_ctype;
       82 +        ret.ldvalue = fval;
       83 +        return sval_cast(type, ret);
       84 +}
       85 +
  77   86  sval_t sval_from_val(struct expression *expr, long long val)
  78   87  {
  79   88          sval_t ret;
  80   89  
  81   90          ret = sval_blank(expr);
  82   91          ret.value = val;
  83   92          ret = sval_cast(get_type(expr), ret);
  84   93  
  85   94          return ret;
  86   95  }
  87   96  
       97 +sval_t sval_from_fval(struct expression *expr, long double fval)
       98 +{
       99 +        sval_t ret;
      100 +
      101 +        ret.type = &ldouble_ctype;
      102 +        ret.ldvalue = fval;
      103 +        ret = sval_cast(get_type(expr), ret);
      104 +
      105 +        return ret;
      106 +}
      107 +
  88  108  int sval_is_ptr(sval_t sval)
  89  109  {
  90  110          if (!sval.type)
  91  111                  return 0;
  92  112          return (sval.type->type == SYM_PTR || sval.type->type == SYM_ARRAY);
  93  113  }
  94  114  
      115 +bool sval_is_fp(sval_t sval)
      116 +{
      117 +        return type_is_fp(sval.type);
      118 +}
      119 +
  95  120  int sval_unsigned(sval_t sval)
  96  121  {
  97  122          if (is_ptr_type(sval.type))
  98  123                  return true;
  99  124          return type_unsigned(sval.type);
 100  125  }
 101  126  
 102  127  int sval_signed(sval_t sval)
 103  128  {
 104  129          return !type_unsigned(sval.type);
↓ open down ↓ 22 lines elided ↑ open up ↑
 127  152          if (sval.value < 0)
 128  153                  return 1;
 129  154          return 0;
 130  155  }
 131  156  
 132  157  int sval_is_positive(sval_t sval)
 133  158  {
 134  159          return !sval_is_negative(sval);
 135  160  }
 136  161  
      162 +static bool fp_is_min(sval_t sval)
      163 +{
      164 +        if (sval.type == &float_ctype)
      165 +                return sval.fvalue == -FLT_MAX;
      166 +        if (sval.type == &double_ctype)
      167 +                return sval.dvalue == -DBL_MAX;
      168 +        if (sval.type == &ldouble_ctype)
      169 +                return sval.ldvalue == -LDBL_MAX;
      170 +        sm_perror("%s: bad type: '%s'", __func__, type_to_str(sval.type));
      171 +        return false;
      172 +}
      173 +
 137  174  int sval_is_min(sval_t sval)
 138  175  {
 139  176          sval_t min = sval_type_min(sval.type);
 140  177  
      178 +        if (sval_is_fp(sval))
      179 +                return fp_is_min(sval);
      180 +
 141  181          if (sval_unsigned(sval)) {
 142  182                  if (sval.uvalue == 0)
 143  183                          return 1;
 144  184                  return 0;
 145  185          }
 146  186          /* return true for less than min as well */
 147  187          return (sval.value <= min.value);
 148  188  }
 149  189  
      190 +static bool fp_is_max(sval_t sval)
      191 +{
      192 +        if (sval.type == &float_ctype)
      193 +                return sval.fvalue == FLT_MAX;
      194 +        if (sval.type == &double_ctype)
      195 +                return sval.dvalue == DBL_MAX;
      196 +        if (sval.type == &ldouble_ctype)
      197 +                return sval.ldvalue == LDBL_MAX;
      198 +        sm_perror("%s: bad type: '%s'", __func__, type_to_str(sval.type));
      199 +        return false;
      200 +}
      201 +
 150  202  int sval_is_max(sval_t sval)
 151  203  {
 152  204          sval_t max = sval_type_max(sval.type);
 153  205  
      206 +        if (sval_is_fp(sval))
      207 +                return fp_is_max(sval);
      208 +
 154  209          if (sval_unsigned(sval))
 155  210                  return (sval.uvalue >= max.value);
 156  211          return (sval.value >= max.value);
 157  212  }
 158  213  
 159  214  int sval_is_a_min(sval_t sval)
 160  215  {
 161  216          if (sval_is_min(sval))
 162  217                  return 1;
      218 +
      219 +        if (sval_is_fp(sval))
      220 +                return 0;
      221 +
 163  222          if (sval_signed(sval) && sval.value == SHRT_MIN)
 164  223                  return 1;
 165  224          if (sval_signed(sval) && sval.value == INT_MIN)
 166  225                  return 1;
 167  226          if (sval_signed(sval) && sval.value == LLONG_MIN)
 168  227                  return 1;
 169  228          return 0;
 170  229  }
 171  230  
 172  231  int sval_is_a_max(sval_t sval)
 173  232  {
 174  233          if (sval_is_max(sval))
 175  234                  return 1;
      235 +
      236 +        if (sval_is_fp(sval))
      237 +                return 0;
      238 +
 176  239          if (sval.uvalue == SHRT_MAX)
 177  240                  return 1;
 178  241          if (sval.uvalue == INT_MAX)
 179  242                  return 1;
 180  243          if (sval.uvalue == LLONG_MAX)
 181  244                  return 1;
 182  245          if (sval.uvalue == USHRT_MAX)
 183  246                  return 1;
 184  247          if (sval.uvalue == UINT_MAX)
 185  248                  return 1;
 186  249          if (sval_unsigned(sval) && sval.uvalue == ULLONG_MAX)
 187  250                  return 1;
 188  251          if (sval.value > valid_ptr_max - 1000 &&
 189  252              sval.value < valid_ptr_max + 1000)
 190  253                  return 1;
 191  254          return 0;
 192  255  }
 193  256  
 194  257  int sval_is_negative_min(sval_t sval)
 195  258  {
      259 +        if (sval_is_fp(sval))
      260 +                return 0;
      261 +
 196  262          if (!sval_is_negative(sval))
 197  263                  return 0;
 198  264          return sval_is_min(sval);
 199  265  }
 200  266  
 201  267  int sval_cmp_t(struct symbol *type, sval_t one, sval_t two)
 202  268  {
 203  269          sval_t one_cast, two_cast;
 204  270  
 205  271          one_cast = sval_cast(type, one);
↓ open down ↓ 41 lines elided ↑ open up ↑
 247  313  {
 248  314          if (sval_is_negative(sval))
 249  315                  return 0;
 250  316          if (sval.uvalue > sval_type_max(type).uvalue)
 251  317                  return 1;
 252  318          return 0;
 253  319  }
 254  320  
 255  321  int sval_fits(struct symbol *type, sval_t sval)
 256  322  {
      323 +        /* everything fits into floating point */
      324 +        if (type_is_fp(type))
      325 +                return 1;
      326 +        /* floating points don't fit into int */
      327 +        if (type_is_fp(sval.type))
      328 +                return 0;
      329 +
 257  330          if (sval_too_low(type, sval))
 258  331                  return 0;
 259  332          if (sval_too_high(type, sval))
 260  333                  return 0;
 261  334          return 1;
 262  335  }
 263  336  
      337 +static sval_t cast_to_fp(struct symbol *type, sval_t sval)
      338 +{
      339 +        sval_t ret = {};
      340 +
      341 +        ret.type = type;
      342 +        if (type == &float_ctype) {
      343 +                if (!sval_is_fp(sval)) {
      344 +                        if (sval_unsigned(sval))
      345 +                                ret.fvalue = sval.uvalue;
      346 +                        else
      347 +                                ret.fvalue = sval.value;
      348 +                } else if (sval.type == &float_ctype)
      349 +                        ret.fvalue = sval.fvalue;
      350 +                else if (sval.type == &double_ctype)
      351 +                        ret.fvalue = sval.dvalue;
      352 +                else
      353 +                        ret.fvalue = sval.ldvalue;
      354 +        } else if (type == &double_ctype) {
      355 +                if (!sval_is_fp(sval)) {
      356 +                        if (sval_unsigned(sval))
      357 +                                ret.dvalue = sval.uvalue;
      358 +                        else
      359 +                                ret.dvalue = sval.value;
      360 +                } else if (sval.type == &float_ctype)
      361 +                        ret.dvalue = sval.fvalue;
      362 +                else if (sval.type == &double_ctype)
      363 +                        ret.dvalue = sval.dvalue;
      364 +                else
      365 +                        ret.dvalue = sval.ldvalue;
      366 +        } else if (type == &ldouble_ctype) {
      367 +                if (!sval_is_fp(sval)) {
      368 +                        if (sval_unsigned(sval))
      369 +                                ret.ldvalue = (long double)sval.uvalue;
      370 +                        else
      371 +                                ret.ldvalue = (long double)sval.value;
      372 +                } else if (sval.type == &float_ctype)
      373 +                        ret.ldvalue = sval.fvalue;
      374 +                else if (sval.type == &double_ctype)
      375 +                        ret.ldvalue = sval.dvalue;
      376 +                else
      377 +                        ret.ldvalue = sval.ldvalue;
      378 +        } else {
      379 +                sm_perror("%s: bad type: %s", __func__, type_to_str(type));
      380 +        }
      381 +
      382 +        return ret;
      383 +}
      384 +
      385 +static sval_t cast_from_fp(struct symbol *type, sval_t sval)
      386 +{
      387 +        sval_t ret = {};
      388 +
      389 +        ret.type = &llong_ctype;
      390 +        if (sval.type == &float_ctype)
      391 +                ret.value = sval.fvalue;
      392 +        else if (sval.type == &double_ctype)
      393 +                ret.value = sval.dvalue;
      394 +        else if (sval.type == &ldouble_ctype)
      395 +                ret.value = sval.ldvalue;
      396 +        else
      397 +                sm_perror("%s: bad type: %s", __func__, type_to_str(type));
      398 +
      399 +        return sval_cast(type, ret);
      400 +}
      401 +
 264  402  sval_t sval_cast(struct symbol *type, sval_t sval)
 265  403  {
 266  404          sval_t ret;
 267  405  
 268  406          if (!type)
 269  407                  type = &int_ctype;
 270  408  
      409 +        if (type_is_fp(type))
      410 +                return cast_to_fp(type, sval);
      411 +        if (type_is_fp(sval.type))
      412 +                return cast_from_fp(type, sval);
      413 +
 271  414          ret.type = type;
 272  415          switch (sval_bits(ret)) {
 273  416          case 1:
 274  417                  ret.value = !!sval.value;
 275  418                  break;
 276  419          case 8:
 277  420                  if (sval_unsigned(ret))
 278  421                          ret.value = (long long)(unsigned char)sval.value;
 279  422                  else
 280  423                          ret.value = (long long)(char)sval.value;
↓ open down ↓ 338 lines elided ↑ open up ↑
 619  762                  return 0;
 620  763  
 621  764          return ((unsigned long long)-1) >> (64 - high_bit);
 622  765  }
 623  766  
 624  767  unsigned long long sval_fls_mask(sval_t sval)
 625  768  {
 626  769          return fls_mask(sval.uvalue);
 627  770  }
 628  771  
      772 +static char *fp_to_str(sval_t sval)
      773 +{
      774 +        char buf[32];
      775 +
      776 +        if (sval.type == &float_ctype)
      777 +                snprintf(buf, sizeof(buf), "%f", sval.fvalue);
      778 +        else if (sval.type == &double_ctype)
      779 +                snprintf(buf, sizeof(buf), "%e", sval.dvalue);
      780 +        else if (sval.type == &ldouble_ctype) {
      781 +                snprintf(buf, sizeof(buf), "%Lf", sval.ldvalue);
      782 +        } else
      783 +                snprintf(buf, sizeof(buf), "nan");
      784 +
      785 +        return alloc_sname(buf);
      786 +}
      787 +
 629  788  const char *sval_to_str(sval_t sval)
 630  789  {
 631      -        char buf[30];
      790 +        char buf[32];
 632  791  
      792 +        if (sval_is_fp(sval))
      793 +                return fp_to_str(sval);
      794 +
 633  795          if (sval_is_ptr(sval) && sval.value == valid_ptr_max)
 634  796                  return "ptr_max";
 635  797          if (sval_unsigned(sval) && sval.value == ULLONG_MAX)
 636  798                  return "u64max";
 637  799          if (sval_unsigned(sval) && sval.value == UINT_MAX)
 638  800                  return "u32max";
 639  801          if (sval.value == USHRT_MAX)
 640  802                  return "u16max";
 641  803  
 642  804          if (sval_signed(sval) && sval.value == LLONG_MAX)
↓ open down ↓ 21 lines elided ↑ open up ↑
 664  826  }
 665  827  
 666  828  const char *sval_to_str_or_err_ptr(sval_t sval)
 667  829  {
 668  830          char buf[12];
 669  831  
 670  832          if (option_project != PROJ_KERNEL ||
 671  833              !is_ptr_type(sval.type))
 672  834                  return sval_to_str(sval);
 673  835  
 674      -        if (sval.uvalue >= -4905ULL) {
      836 +        if (!sval_is_fp(sval) && sval.uvalue >= -4905ULL) {
 675  837                  snprintf(buf, sizeof(buf), "(%lld)", sval.value);
 676  838                  return alloc_sname(buf);
 677  839          }
 678  840  
 679  841          return sval_to_str(sval);
 680  842  }
 681  843  
 682  844  const char *sval_to_numstr(sval_t sval)
 683  845  {
 684  846          char buf[30];
 685  847  
      848 +        if (type_is_fp(sval.type))
      849 +                return fp_to_str(sval);
      850 +
 686  851          if (sval_unsigned(sval))
 687  852                  snprintf(buf, sizeof(buf), "%llu", sval.value);
 688  853          else if (sval.value < 0)
 689  854                  snprintf(buf, sizeof(buf), "(%lld)", sval.value);
 690  855          else
 691  856                  snprintf(buf, sizeof(buf), "%lld", sval.value);
 692  857  
 693  858          return alloc_sname(buf);
 694  859  }
 695  860  
↓ open down ↓ 20 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX