12166 resync smatch to 0.6.1-rc1-il-3
1 /* 2 * Copyright (C) 2012 Oracle. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 2 7 * of the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt 16 */ 17 18 /* 19 * Basically the point of sval is that it can hold both ULLONG_MAX and 20 * LLONG_MIN. If it is an unsigned type then we use sval.uvalue or if it is 21 * signed we use sval.value. 22 * 23 * I considered just using one bit to store whether the value was signed vs 24 * unsigned but I think it might help to have the type information so we know 25 * how to do type promotion. 26 * 27 */ 28 29 #include "smatch.h" 30 #include "smatch_slist.h" 31 #include "smatch_extra.h" 32 33 __ALLOCATOR(sval_t, "svals", sval); 34 35 sval_t *sval_alloc(sval_t sval) 36 { 37 sval_t *ret; 38 39 ret = __alloc_sval(0); 40 *ret = sval; 41 return ret; 42 } 43 44 sval_t *sval_alloc_permanent(sval_t sval) 45 { 46 sval_t *ret; 47 48 ret = malloc(sizeof(*ret)); 49 *ret = sval; 50 return ret; 51 } 52 53 sval_t sval_blank(struct expression *expr) 54 { 55 sval_t ret; 56 57 ret.type = get_type(expr); 58 if (!ret.type) 59 ret.type = &int_ctype; 60 ret.value = 123456789; 61 62 return ret; 63 } 64 65 sval_t sval_type_val(struct symbol *type, long long val) 66 { 67 sval_t ret; 68 69 if (!type) 70 type = &llong_ctype; 71 72 ret.type = type; 73 ret.value = val; 74 return ret; 75 } 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 86 sval_t sval_from_val(struct expression *expr, long long val) 87 { 88 sval_t ret; 89 90 ret = sval_blank(expr); 91 ret.value = val; 92 ret = sval_cast(get_type(expr), ret); 93 94 return ret; 95 } 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 108 int sval_is_ptr(sval_t sval) 109 { 110 if (!sval.type) 111 return 0; 112 return (sval.type->type == SYM_PTR || sval.type->type == SYM_ARRAY); 113 } 114 115 bool sval_is_fp(sval_t sval) 116 { 117 return type_is_fp(sval.type); 118 } 119 120 int sval_unsigned(sval_t sval) 121 { 122 if (is_ptr_type(sval.type)) 123 return true; 124 return type_unsigned(sval.type); 125 } 126 127 int sval_signed(sval_t sval) 128 { 129 return !type_unsigned(sval.type); 130 } 131 132 int sval_bits(sval_t sval) 133 { 134 return type_bits(sval.type); 135 } 136 137 int sval_bits_used(sval_t sval) 138 { 139 int i; 140 141 for (i = 64; i >= 1; i--) { 142 if (sval.uvalue & (1ULL << (i - 1))) 143 return i; 144 } 145 return 0; 146 } 147 148 int sval_is_negative(sval_t sval) 149 { 150 if (type_unsigned(sval.type)) 151 return 0; 152 if (sval.value < 0) 153 return 1; 154 return 0; 155 } 156 157 int sval_is_positive(sval_t sval) 158 { 159 return !sval_is_negative(sval); 160 } 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 174 int sval_is_min(sval_t sval) 175 { 176 sval_t min = sval_type_min(sval.type); 177 178 if (sval_is_fp(sval)) 179 return fp_is_min(sval); 180 181 if (sval_unsigned(sval)) { 182 if (sval.uvalue == 0) 183 return 1; 184 return 0; 185 } 186 /* return true for less than min as well */ 187 return (sval.value <= min.value); 188 } 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 202 int sval_is_max(sval_t sval) 203 { 204 sval_t max = sval_type_max(sval.type); 205 206 if (sval_is_fp(sval)) 207 return fp_is_max(sval); 208 209 if (sval_unsigned(sval)) 210 return (sval.uvalue >= max.value); 211 return (sval.value >= max.value); 212 } 213 214 int sval_is_a_min(sval_t sval) 215 { 216 if (sval_is_min(sval)) 217 return 1; 218 219 if (sval_is_fp(sval)) 220 return 0; 221 222 if (sval_signed(sval) && sval.value == SHRT_MIN) 223 return 1; 224 if (sval_signed(sval) && sval.value == INT_MIN) 225 return 1; 226 if (sval_signed(sval) && sval.value == LLONG_MIN) 227 return 1; 228 return 0; 229 } 230 231 int sval_is_a_max(sval_t sval) 232 { 233 if (sval_is_max(sval)) 234 return 1; 235 236 if (sval_is_fp(sval)) 237 return 0; 238 239 if (sval.uvalue == SHRT_MAX) 240 return 1; 241 if (sval.uvalue == INT_MAX) 242 return 1; 243 if (sval.uvalue == LLONG_MAX) 244 return 1; 245 if (sval.uvalue == USHRT_MAX) 246 return 1; 247 if (sval.uvalue == UINT_MAX) 248 return 1; 249 if (sval_unsigned(sval) && sval.uvalue == ULLONG_MAX) 250 return 1; 251 if (sval.value > valid_ptr_max - 1000 && 252 sval.value < valid_ptr_max + 1000) 253 return 1; 254 return 0; 255 } 256 257 int sval_is_negative_min(sval_t sval) 258 { 259 if (sval_is_fp(sval)) 260 return 0; 261 262 if (!sval_is_negative(sval)) 263 return 0; 264 return sval_is_min(sval); 265 } 266 267 int sval_cmp_t(struct symbol *type, sval_t one, sval_t two) 268 { 269 sval_t one_cast, two_cast; 270 271 one_cast = sval_cast(type, one); 272 two_cast = sval_cast(type, two); 273 return sval_cmp(one_cast, two_cast); 274 } 275 276 int sval_cmp_val(sval_t one, long long val) 277 { 278 sval_t sval; 279 280 sval = sval_type_val(&llong_ctype, val); 281 return sval_cmp(one, sval); 282 } 283 284 sval_t sval_min(sval_t one, sval_t two) 285 { 286 if (sval_cmp(one, two) > 0) 287 return two; 288 return one; 289 } 290 291 sval_t sval_max(sval_t one, sval_t two) 292 { 293 if (sval_cmp(one, two) < 0) 294 return two; 295 return one; 296 } 297 298 int sval_too_low(struct symbol *type, sval_t sval) 299 { 300 if (sval_is_negative(sval) && type_unsigned(type)) 301 return 1; 302 if (type_signed(type) && sval_unsigned(sval)) 303 return 0; 304 if (type_signed(sval.type) && 305 sval.value < sval_type_min(type).value) 306 return 1; 307 if (sval_cmp(sval, sval_type_min(type)) < 0) 308 return 1; 309 return 0; 310 } 311 312 int sval_too_high(struct symbol *type, sval_t sval) 313 { 314 if (sval_is_negative(sval)) 315 return 0; 316 if (sval.uvalue > sval_type_max(type).uvalue) 317 return 1; 318 return 0; 319 } 320 321 int sval_fits(struct symbol *type, sval_t sval) 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 330 if (sval_too_low(type, sval)) 331 return 0; 332 if (sval_too_high(type, sval)) 333 return 0; 334 return 1; 335 } 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 402 sval_t sval_cast(struct symbol *type, sval_t sval) 403 { 404 sval_t ret; 405 406 if (!type) 407 type = &int_ctype; 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 414 ret.type = type; 415 switch (sval_bits(ret)) { 416 case 1: 417 ret.value = !!sval.value; 418 break; 419 case 8: 420 if (sval_unsigned(ret)) 421 ret.value = (long long)(unsigned char)sval.value; 422 else 423 ret.value = (long long)(char)sval.value; 424 break; 425 case 16: 426 if (sval_unsigned(ret)) 427 ret.value = (long long)(unsigned short)sval.value; 428 else 429 ret.value = (long long)(short)sval.value; 430 break; 431 case 32: 432 if (sval_unsigned(ret)) 433 ret.value = (long long)(unsigned int)sval.value; 434 else 435 ret.value = (long long)(int)sval.value; 436 break; 437 default: 438 ret.value = sval.value; 439 } 440 return ret; 441 442 } 443 444 sval_t sval_preop(sval_t sval, int op) 445 { 446 switch (op) { 447 case '!': 448 sval.value = !sval.value; 449 break; 450 case '~': 451 sval.value = ~sval.value; 452 sval = sval_cast(sval.type, sval); 453 break; 454 case '-': 455 sval.value = -sval.value; 456 sval = sval_cast(sval.type, sval); 457 break; 458 } 459 return sval; 460 } 461 462 static sval_t sval_binop_unsigned(struct symbol *type, sval_t left, int op, sval_t right) 463 { 464 sval_t ret; 465 466 ret.type = type; 467 switch (op) { 468 case '*': 469 ret.uvalue = left.uvalue * right.uvalue; 470 break; 471 case '/': 472 if (right.uvalue == 0) { 473 sm_debug("%s: divide by zero", __func__); 474 ret.uvalue = 123456789; 475 } else { 476 ret.uvalue = left.uvalue / right.uvalue; 477 } 478 break; 479 case '+': 480 ret.uvalue = left.uvalue + right.uvalue; 481 break; 482 case '-': 483 ret.uvalue = left.uvalue - right.uvalue; 484 break; 485 case '%': 486 if (right.uvalue == 0) { 487 sm_perror(" %s: MOD by zero", __func__); 488 ret.uvalue = 123456789; 489 } else { 490 ret.uvalue = left.uvalue % right.uvalue; 491 } 492 break; 493 case '|': 494 ret.uvalue = left.uvalue | right.uvalue; 495 break; 496 case '&': 497 ret.uvalue = left.uvalue & right.uvalue; 498 break; 499 case SPECIAL_RIGHTSHIFT: 500 ret.uvalue = left.uvalue >> right.uvalue; 501 break; 502 case SPECIAL_LEFTSHIFT: 503 ret.uvalue = left.uvalue << right.uvalue; 504 break; 505 case '^': 506 ret.uvalue = left.uvalue ^ right.uvalue; 507 break; 508 default: 509 sm_perror(" %s: unhandled binop %s", __func__, 510 show_special(op)); 511 ret.uvalue = 1234567; 512 } 513 return ret; 514 } 515 516 517 static sval_t sval_binop_signed(struct symbol *type, sval_t left, int op, sval_t right) 518 { 519 sval_t ret; 520 521 ret.type = type; 522 switch (op) { 523 case '*': 524 ret.value = left.value * right.value; 525 break; 526 case '/': 527 if (right.value == 0) { 528 sm_debug("%s: divide by zero", __func__); 529 ret.value = 123456789; 530 } else if (left.value == LLONG_MIN && right.value == -1) { 531 sm_debug("%s: invalid divide LLONG_MIN/-1", __func__); 532 ret.value = 12345678; 533 } else { 534 ret.value = left.value / right.value; 535 } 536 break; 537 case '+': 538 ret.value = left.value + right.value; 539 break; 540 case '-': 541 ret.value = left.value - right.value; 542 break; 543 case '%': 544 if (right.value == 0) { 545 sm_perror(" %s: MOD by zero", __func__); 546 ret.value = 123456789; 547 } else { 548 ret.value = left.value % right.value; 549 } 550 break; 551 case '|': 552 ret.value = left.value | right.value; 553 break; 554 case '&': 555 ret.value = left.value & right.value; 556 break; 557 case SPECIAL_RIGHTSHIFT: 558 ret.value = left.value >> right.value; 559 break; 560 case SPECIAL_LEFTSHIFT: 561 ret.value = left.value << right.value; 562 break; 563 case '^': 564 ret.value = left.value ^ right.value; 565 break; 566 default: 567 sm_perror(" %s: unhandled binop %s", __func__, 568 show_special(op)); 569 ret.value = 1234567; 570 } 571 return ret; 572 } 573 574 static sval_t ptr_binop(struct symbol *type, sval_t left, int op, sval_t right) 575 { 576 sval_t ret; 577 int align; 578 579 if (op != '+' && op != '-') 580 return sval_binop_unsigned(type, left, op, right); 581 582 ret.type = type; 583 if (type->type == SYM_PTR) 584 type = get_real_base_type(type); 585 align = type->ctype.alignment; 586 if (align <= 0) 587 align = 1; 588 589 if (op == '+') { 590 if (type_is_ptr(left.type)) 591 ret.value = left.value + right.value * align; 592 else 593 ret.value = left.value * align + right.value; 594 } else { 595 if (!type_is_ptr(left.type)) { 596 left.value = -left.value; 597 ret = ptr_binop(type, left, '+', right); 598 } else if (!type_is_ptr(right.type)) { 599 right.value = -right.value; 600 ret = ptr_binop(type, left, '+', right); 601 } else { 602 ret.value = (left.value - right.value) / align; 603 } 604 } 605 606 if (op == '-') 607 ret.type = ssize_t_ctype; 608 return ret; 609 } 610 611 sval_t sval_binop(sval_t left, int op, sval_t right) 612 { 613 struct symbol *type; 614 sval_t ret; 615 616 type = get_promoted_type(left.type, right.type); 617 618 if (type_is_ptr(type)) 619 ret = ptr_binop(type, left, op, right); 620 else if (type_unsigned(type)) 621 ret = sval_binop_unsigned(type, left, op, right); 622 else 623 ret = sval_binop_signed(type, left, op, right); 624 return sval_cast(type, ret); 625 } 626 627 int sval_unop_overflows(sval_t sval, int op) 628 { 629 if (op != '-') 630 return 0; 631 if (sval_positive_bits(sval) == 32 && sval.value == INT_MIN) 632 return 1; 633 if (sval_positive_bits(sval) == 64 && sval.value == LLONG_MIN) 634 return 1; 635 if (sval_is_negative(sval)) 636 return 0; 637 if (sval_signed(sval)) 638 return 0; 639 if (sval_bits(sval) == 32 && sval.uvalue > INT_MAX) 640 return 1; 641 if (sval_bits(sval) == 64 && sval.uvalue > LLONG_MAX) 642 return 1; 643 return 0; 644 } 645 646 int sval_binop_overflows(sval_t left, int op, sval_t right) 647 { 648 struct symbol *type; 649 sval_t max, min; 650 651 type = left.type; 652 if (type_positive_bits(right.type) > type_positive_bits(left.type)) 653 type = right.type; 654 if (type_positive_bits(type) < 31) 655 type = &int_ctype; 656 657 max = sval_type_max(type); 658 min = sval_type_min(type); 659 660 switch (op) { 661 case '+': 662 if (sval_is_negative(left) && sval_is_negative(right)) { 663 if (left.value < min.value + right.value) 664 return 1; 665 return 0; 666 } 667 if (sval_is_negative(left) || sval_is_negative(right)) 668 return 0; 669 if (left.uvalue > max.uvalue - right.uvalue) 670 return 1; 671 return 0; 672 case '*': 673 if (type_signed(type)) { 674 if (left.value == 0 || right.value == 0) 675 return 0; 676 if (left.value > max.value / right.value) 677 return 1; 678 if (left.value == -1 || right.value == -1) 679 return 0; 680 return left.value != left.value * right.value / right.value; 681 682 } 683 return right.uvalue != 0 && left.uvalue > max.uvalue / right.uvalue; 684 case '-': 685 if (type_unsigned(type)) { 686 if (sval_cmp(left, right) < 0) 687 return 1; 688 return 0; 689 } 690 if (sval_is_negative(left) && sval_is_negative(right)) 691 return 0; 692 693 if (sval_is_negative(left)) { 694 if (left.value < min.value + right.value) 695 return 1; 696 return 0; 697 } 698 if (sval_is_negative(right)) { 699 if (right.value == min.value) 700 return 1; 701 right = sval_preop(right, '-'); 702 if (sval_binop_overflows(left, '+', right)) 703 return 1; 704 return 0; 705 } 706 return 0; 707 case SPECIAL_LEFTSHIFT: 708 if (sval_cmp(left, sval_binop(max, invert_op(op), right)) > 0) 709 return 1; 710 return 0; 711 } 712 return 0; 713 } 714 715 int sval_binop_overflows_no_sign(sval_t left, int op, sval_t right) 716 { 717 718 struct symbol *type; 719 720 type = left.type; 721 if (type_positive_bits(right.type) > type_positive_bits(left.type)) 722 type = right.type; 723 if (type_positive_bits(type) <= 31) 724 type = &uint_ctype; 725 else 726 type = &ullong_ctype; 727 728 left = sval_cast(type, left); 729 right = sval_cast(type, right); 730 return sval_binop_overflows(left, op, right); 731 } 732 733 int find_first_zero_bit(unsigned long long uvalue) 734 { 735 int i; 736 737 for (i = 0; i < 64; i++) { 738 if (!(uvalue & (1ULL << i))) 739 return i; 740 } 741 return i; 742 } 743 744 int sm_fls64(unsigned long long uvalue) 745 { 746 int high_bit = 0; 747 748 while (uvalue) { 749 uvalue >>= 1; 750 high_bit++; 751 } 752 753 return high_bit; 754 } 755 756 unsigned long long fls_mask(unsigned long long uvalue) 757 { 758 int high_bit = 0; 759 760 high_bit = sm_fls64(uvalue); 761 if (high_bit == 0) 762 return 0; 763 764 return ((unsigned long long)-1) >> (64 - high_bit); 765 } 766 767 unsigned long long sval_fls_mask(sval_t sval) 768 { 769 return fls_mask(sval.uvalue); 770 } 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 788 const char *sval_to_str(sval_t sval) 789 { 790 char buf[32]; 791 792 if (sval_is_fp(sval)) 793 return fp_to_str(sval); 794 795 if (sval_is_ptr(sval) && sval.value == valid_ptr_max) 796 return "ptr_max"; 797 if (sval_unsigned(sval) && sval.value == ULLONG_MAX) 798 return "u64max"; 799 if (sval_unsigned(sval) && sval.value == UINT_MAX) 800 return "u32max"; 801 if (sval.value == USHRT_MAX) 802 return "u16max"; 803 804 if (sval_signed(sval) && sval.value == LLONG_MAX) 805 return "s64max"; 806 if (sval.value == INT_MAX) 807 return "s32max"; 808 if (sval.value == SHRT_MAX) 809 return "s16max"; 810 811 if (sval_signed(sval) && sval.value == SHRT_MIN) 812 return "s16min"; 813 if (sval_signed(sval) && sval.value == INT_MIN) 814 return "s32min"; 815 if (sval_signed(sval) && sval.value == LLONG_MIN) 816 return "s64min"; 817 818 if (sval_unsigned(sval)) 819 snprintf(buf, sizeof(buf), "%llu", sval.value); 820 else if (sval.value < 0) 821 snprintf(buf, sizeof(buf), "(%lld)", sval.value); 822 else 823 snprintf(buf, sizeof(buf), "%lld", sval.value); 824 825 return alloc_sname(buf); 826 } 827 828 const char *sval_to_str_or_err_ptr(sval_t sval) 829 { 830 char buf[12]; 831 832 if (option_project != PROJ_KERNEL || 833 !is_ptr_type(sval.type)) 834 return sval_to_str(sval); 835 836 if (!sval_is_fp(sval) && sval.uvalue >= -4905ULL) { 837 snprintf(buf, sizeof(buf), "(%lld)", sval.value); 838 return alloc_sname(buf); 839 } 840 841 return sval_to_str(sval); 842 } 843 844 const char *sval_to_numstr(sval_t sval) 845 { 846 char buf[30]; 847 848 if (type_is_fp(sval.type)) 849 return fp_to_str(sval); 850 851 if (sval_unsigned(sval)) 852 snprintf(buf, sizeof(buf), "%llu", sval.value); 853 else if (sval.value < 0) 854 snprintf(buf, sizeof(buf), "(%lld)", sval.value); 855 else 856 snprintf(buf, sizeof(buf), "%lld", sval.value); 857 858 return alloc_sname(buf); 859 } 860 861 sval_t ll_to_sval(long long val) 862 { 863 sval_t ret; 864 865 ret.type = &llong_ctype; 866 ret.value = val; 867 return ret; 868 } 869 870 static void free_svals(struct symbol *sym) 871 { 872 if (__inline_fn) 873 return; 874 clear_sval_alloc(); 875 } 876 877 void register_sval(int my_id) 878 { 879 add_hook(&free_svals, AFTER_FUNC_HOOK); 880 } --- EOF ---