Also made dwarf *leb128 fuctions a litlle bit faster.
Unified · Split
| @@ -69,7 +69,14 @@ static const struct { · 68 unmodified lines | ||
| 69 | 69 | { VT_BYTE | VT_UNSIGNED, 1, DW_ATE_unsigned_char, "unsigned char:t25=r25;0;255;" }, |
| 70 | 70 | /* boolean type */ |
| 71 | 71 | { VT_BOOL, 1, DW_ATE_boolean, "bool:t26=r26;0;255;" }, |
| 72 | +#if LONG_SIZE == 4 | |
| 72 | 73 | { VT_VOID, 1, DW_ATE_unsigned_char, "void:t27=27" }, |
| 74 | +#else | |
| 75 | + /* bitfields use these */ | |
| 76 | + { VT_LONG | VT_INT, 8, DW_ATE_signed, "long int:t27=r27;-9223372036854775808;9223372036854775807;" }, | |
| 77 | + { VT_LONG | VT_INT | VT_UNSIGNED, 8, DW_ATE_unsigned, "long unsigned int:t28=r28;0;01777777777777777777777;" }, | |
| 78 | + { VT_VOID, 1, DW_ATE_unsigned_char, "void:t29=29" }, | |
| 79 | +#endif | |
| 73 | 80 | }; |
| 74 | 81 | |
| 75 | 82 | #define N_DEFAULT_DEBUG (sizeof (default_debug) / sizeof (default_debug[0])) |
| @@ -584,17 +591,16 @@ static int dwarf_uleb128_size (unsigned long long value) · 508 unmodified lines | ||
| 584 | 591 | |
| 585 | 592 | static int dwarf_sleb128_size (long long value) |
| 586 | 593 | { |
| 587 | − int more; | |
| 588 | 594 | int size = 0; |
| 595 | + long long end = value >> 63; | |
| 596 | + unsigned char last = end & 0x40; | |
| 597 | + unsigned char byte; | |
| 589 | 598 | |
| 590 | 599 | do { |
| 591 | − unsigned char byte = value & 0x7f; | |
| 592 | − | |
| 593 | − value = (value >> 7) | ~(-1 >> 7); | |
| 594 | − more =!((((value == 0) && ((byte & 0x40) == 0)) | |
| 595 | − || ((value == -1) && ((byte & 0x40) != 0)))); | |
| 600 | + byte = value & 0x7f; | |
| 601 | + value >>= 7; | |
| 596 | 602 | size++; |
| 597 | − } while (more); | |
| 603 | + } while (value != end || (byte & 0x40) != last); | |
| 598 | 604 | return size; |
| 599 | 605 | } |
| 600 | 606 | |
| @@ -604,25 +610,22 @@ static void dwarf_uleb128 (Section *s, unsigned long long value) · 3 unmodified lines | ||
| 604 | 610 | unsigned char byte = value & 0x7f; |
| 605 | 611 | |
| 606 | 612 | value >>= 7; |
| 607 | − if (value) | |
| 608 | − byte |= 0x80; | |
| 609 | − dwarf_data1(s, byte); | |
| 613 | + dwarf_data1(s, byte | (value ? 0x80 : 0)); | |
| 610 | 614 | } while (value != 0); |
| 611 | 615 | } |
| 612 | 616 | |
| 613 | 617 | static void dwarf_sleb128 (Section *s, long long value) |
| 614 | 618 | { |
| 615 | 619 | int more; |
| 620 | + long long end = value >> 63; | |
| 621 | + unsigned char last = end & 0x40; | |
| 616 | 622 | |
| 617 | 623 | do { |
| 618 | 624 | unsigned char byte = value & 0x7f; |
| 619 | 625 | |
| 620 | − value = (value >> 7) | ~(-1 >> 7); | |
| 621 | − more =!((((value == 0) && ((byte & 0x40) == 0)) | |
| 622 | − || ((value == -1) && ((byte & 0x40) != 0)))); | |
| 623 | − if (more) | |
| 624 | − byte |= 0x80; | |
| 625 | − dwarf_data1(s, byte); | |
| 626 | + value >>= 7; | |
| 627 | + more = value != end || (byte & 0x40) != last; | |
| 628 | + dwarf_data1(s, byte | (0x80 * more)); | |
| 626 | 629 | } while (more); |
| 627 | 630 | } |
| 628 | 631 | |
| @@ -632,25 +635,22 @@ static void dwarf_uleb128_op (TCCState *s1, unsigned long long value) · 3 unmodified lines | ||
| 632 | 635 | unsigned char byte = value & 0x7f; |
| 633 | 636 | |
| 634 | 637 | value >>= 7; |
| 635 | − if (value) | |
| 636 | − byte |= 0x80; | |
| 637 | − dwarf_line_op(s1, byte); | |
| 638 | + dwarf_line_op(s1, byte | (value ? 0x80 : 0)); | |
| 638 | 639 | } while (value != 0); |
| 639 | 640 | } |
| 640 | 641 | |
| 641 | 642 | static void dwarf_sleb128_op (TCCState *s1, long long value) |
| 642 | 643 | { |
| 643 | 644 | int more; |
| 645 | + long long end = value >> 63; | |
| 646 | + unsigned char last = end & 0x40; | |
| 644 | 647 | |
| 645 | 648 | do { |
| 646 | 649 | unsigned char byte = value & 0x7f; |
| 647 | 650 | |
| 648 | − value = (value >> 7) | ~(-1 >> 7); | |
| 649 | − more =!((((value == 0) && ((byte & 0x40) == 0)) | |
| 650 | − || ((value == -1) && ((byte & 0x40) != 0)))); | |
| 651 | − if (more) | |
| 652 | − byte |= 0x80; | |
| 653 | − dwarf_line_op(s1, byte); | |
| 651 | + value >>= 7; | |
| 652 | + more = value != end || (byte & 0x40) != last; | |
| 653 | + dwarf_line_op(s1, byte | (0x80 * more)); | |
| 654 | 654 | } while (more); |
| 655 | 655 | } |
| 656 | 656 | |