Also made dwarf *leb128 fuctions a litlle bit faster.
Unified · Split
| @@ -69,7 +69,14 @@ static const struct { · 68 unmodified lines | |||
| 69 | { VT_BYTE | VT_UNSIGNED, 1, DW_ATE_unsigned_char, "unsigned char:t25=r25;0;255;" }, | 69 | { VT_BYTE | VT_UNSIGNED, 1, DW_ATE_unsigned_char, "unsigned char:t25=r25;0;255;" }, |
| 70 | /* boolean type */ | 70 | /* boolean type */ |
| 71 | { VT_BOOL, 1, DW_ATE_boolean, "bool:t26=r26;0;255;" }, | 71 | { VT_BOOL, 1, DW_ATE_boolean, "bool:t26=r26;0;255;" }, |
| 72 | #if LONG_SIZE == 4 | ||
| 72 | { VT_VOID, 1, DW_ATE_unsigned_char, "void:t27=27" }, | 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 | #define N_DEFAULT_DEBUG (sizeof (default_debug) / sizeof (default_debug[0])) | 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 | static int dwarf_sleb128_size (long long value) | 592 | static int dwarf_sleb128_size (long long value) |
| 586 | { | 593 | { |
| 587 | int more; | ||
| 588 | int size = 0; | 594 | int size = 0; |
| 595 | long long end = value >> 63; | ||
| 596 | unsigned char last = end & 0x40; | ||
| 597 | unsigned char byte; | ||
| 589 | 598 | ||
| 590 | do { | 599 | do { |
| 591 | unsigned char byte = value & 0x7f; | 600 | byte = value & 0x7f; |
| 592 | 601 | value >>= 7; | |
| 593 | value = (value >> 7) | ~(-1 >> 7); | ||
| 594 | more =!((((value == 0) && ((byte & 0x40) == 0)) | ||
| 595 | || ((value == -1) && ((byte & 0x40) != 0)))); | ||
| 596 | size++; | 602 | size++; |
| 597 | } while (more); | 603 | } while (value != end || (byte & 0x40) != last); |
| 598 | return size; | 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 | unsigned char byte = value & 0x7f; | 610 | unsigned char byte = value & 0x7f; |
| 605 | 611 | ||
| 606 | value >>= 7; | 612 | value >>= 7; |
| 607 | if (value) | 613 | dwarf_data1(s, byte | (value ? 0x80 : 0)); |
| 608 | byte |= 0x80; | ||
| 609 | dwarf_data1(s, byte); | ||
| 610 | } while (value != 0); | 614 | } while (value != 0); |
| 611 | } | 615 | } |
| 612 | 616 | ||
| 613 | static void dwarf_sleb128 (Section *s, long long value) | 617 | static void dwarf_sleb128 (Section *s, long long value) |
| 614 | { | 618 | { |
| 615 | int more; | 619 | int more; |
| 620 | long long end = value >> 63; | ||
| 621 | unsigned char last = end & 0x40; | ||
| 616 | 622 | ||
| 617 | do { | 623 | do { |
| 618 | unsigned char byte = value & 0x7f; | 624 | unsigned char byte = value & 0x7f; |
| 619 | 625 | ||
| 620 | value = (value >> 7) | ~(-1 >> 7); | 626 | value >>= 7; |
| 621 | more =!((((value == 0) && ((byte & 0x40) == 0)) | 627 | more = value != end || (byte & 0x40) != last; |
| 622 | || ((value == -1) && ((byte & 0x40) != 0)))); | 628 | dwarf_data1(s, byte | (0x80 * more)); |
| 623 | if (more) | ||
| 624 | byte |= 0x80; | ||
| 625 | dwarf_data1(s, byte); | ||
| 626 | } while (more); | 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 | unsigned char byte = value & 0x7f; | 635 | unsigned char byte = value & 0x7f; |
| 633 | 636 | ||
| 634 | value >>= 7; | 637 | value >>= 7; |
| 635 | if (value) | 638 | dwarf_line_op(s1, byte | (value ? 0x80 : 0)); |
| 636 | byte |= 0x80; | ||
| 637 | dwarf_line_op(s1, byte); | ||
| 638 | } while (value != 0); | 639 | } while (value != 0); |
| 639 | } | 640 | } |
| 640 | 641 | ||
| 641 | static void dwarf_sleb128_op (TCCState *s1, long long value) | 642 | static void dwarf_sleb128_op (TCCState *s1, long long value) |
| 642 | { | 643 | { |
| 643 | int more; | 644 | int more; |
| 645 | long long end = value >> 63; | ||
| 646 | unsigned char last = end & 0x40; | ||
| 644 | 647 | ||
| 645 | do { | 648 | do { |
| 646 | unsigned char byte = value & 0x7f; | 649 | unsigned char byte = value & 0x7f; |
| 647 | 650 | ||
| 648 | value = (value >> 7) | ~(-1 >> 7); | 651 | value >>= 7; |
| 649 | more =!((((value == 0) && ((byte & 0x40) == 0)) | 652 | more = value != end || (byte & 0x40) != last; |
| 650 | || ((value == -1) && ((byte & 0x40) != 0)))); | 653 | dwarf_line_op(s1, byte | (0x80 * more)); |
| 651 | if (more) | ||
| 652 | byte |= 0x80; | ||
| 653 | dwarf_line_op(s1, byte); | ||
| 654 | } while (more); | 654 | } while (more); |
| 655 | } | 655 | } |
| 656 | 656 | ||