History

Fix bitfield long types for stabs/dwarf

Also made dwarf *leb128 fuctions a litlle bit faster.

herman ten brugge committed 4 years ago

Commit a4e0f7e1 parent e301a0b1 file · +25 −25Browse files

Unified · Split

tccdbg.c+25−25
@@ -69,7 +69,14 @@ static const struct { · 68 unmodified lines
6969 { VT_BYTE | VT_UNSIGNED, 1, DW_ATE_unsigned_char, "unsigned char:t25=r25;0;255;" },
7070 /* boolean type */
7171 { VT_BOOL, 1, DW_ATE_boolean, "bool:t26=r26;0;255;" },
72+#if LONG_SIZE == 4
7273 { 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
7380 };
7481
7582 #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
584591
585592 static int dwarf_sleb128_size (long long value)
586593 {
587− int more;
588594 int size = 0;
595+ long long end = value >> 63;
596+ unsigned char last = end & 0x40;
597+ unsigned char byte;
589598
590599 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;
596602 size++;
597− } while (more);
603+ } while (value != end || (byte & 0x40) != last);
598604 return size;
599605 }
600606
@@ -604,25 +610,22 @@ static void dwarf_uleb128 (Section *s, unsigned long long value) · 3 unmodified lines
604610 unsigned char byte = value & 0x7f;
605611
606612 value >>= 7;
607− if (value)
608− byte |= 0x80;
609− dwarf_data1(s, byte);
613+ dwarf_data1(s, byte | (value ? 0x80 : 0));
610614 } while (value != 0);
611615 }
612616
613617 static void dwarf_sleb128 (Section *s, long long value)
614618 {
615619 int more;
620+ long long end = value >> 63;
621+ unsigned char last = end & 0x40;
616622
617623 do {
618624 unsigned char byte = value & 0x7f;
619625
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));
626629 } while (more);
627630 }
628631
@@ -632,25 +635,22 @@ static void dwarf_uleb128_op (TCCState *s1, unsigned long long value) · 3 unmodified lines
632635 unsigned char byte = value & 0x7f;
633636
634637 value >>= 7;
635− if (value)
636− byte |= 0x80;
637− dwarf_line_op(s1, byte);
638+ dwarf_line_op(s1, byte | (value ? 0x80 : 0));
638639 } while (value != 0);
639640 }
640641
641642 static void dwarf_sleb128_op (TCCState *s1, long long value)
642643 {
643644 int more;
645+ long long end = value >> 63;
646+ unsigned char last = end & 0x40;
644647
645648 do {
646649 unsigned char byte = value & 0x7f;
647650
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));
654654 } while (more);
655655 }
656656

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t