Fix bitfield long types for stabs/dwarf
Also made dwarf *leb128 fuctions a litlle bit faster.
This commit is contained in:
parent
e301a0ba8d
commit
a4e0f7ef05
1 changed files with 25 additions and 25 deletions
50
tccdbg.c
50
tccdbg.c
|
@ -69,7 +69,14 @@ static const struct {
|
||||||
{ VT_BYTE | VT_UNSIGNED, 1, DW_ATE_unsigned_char, "unsigned char:t25=r25;0;255;" },
|
{ VT_BYTE | VT_UNSIGNED, 1, DW_ATE_unsigned_char, "unsigned char:t25=r25;0;255;" },
|
||||||
/* boolean type */
|
/* boolean type */
|
||||||
{ VT_BOOL, 1, DW_ATE_boolean, "bool:t26=r26;0;255;" },
|
{ VT_BOOL, 1, DW_ATE_boolean, "bool:t26=r26;0;255;" },
|
||||||
|
#if LONG_SIZE == 4
|
||||||
{ VT_VOID, 1, DW_ATE_unsigned_char, "void:t27=27" },
|
{ VT_VOID, 1, DW_ATE_unsigned_char, "void:t27=27" },
|
||||||
|
#else
|
||||||
|
/* bitfields use these */
|
||||||
|
{ VT_LONG | VT_INT, 8, DW_ATE_signed, "long int:t27=r27;-9223372036854775808;9223372036854775807;" },
|
||||||
|
{ VT_LONG | VT_INT | VT_UNSIGNED, 8, DW_ATE_unsigned, "long unsigned int:t28=r28;0;01777777777777777777777;" },
|
||||||
|
{ VT_VOID, 1, DW_ATE_unsigned_char, "void:t29=29" },
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#define N_DEFAULT_DEBUG (sizeof (default_debug) / sizeof (default_debug[0]))
|
#define N_DEFAULT_DEBUG (sizeof (default_debug) / sizeof (default_debug[0]))
|
||||||
|
@ -584,17 +591,16 @@ static int dwarf_uleb128_size (unsigned long long value)
|
||||||
|
|
||||||
static int dwarf_sleb128_size (long long value)
|
static int dwarf_sleb128_size (long long value)
|
||||||
{
|
{
|
||||||
int more;
|
|
||||||
int size = 0;
|
int size = 0;
|
||||||
|
long long end = value >> 63;
|
||||||
|
unsigned char last = end & 0x40;
|
||||||
|
unsigned char byte;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
unsigned char byte = value & 0x7f;
|
byte = value & 0x7f;
|
||||||
|
value >>= 7;
|
||||||
value = (value >> 7) | ~(-1 >> 7);
|
|
||||||
more =!((((value == 0) && ((byte & 0x40) == 0))
|
|
||||||
|| ((value == -1) && ((byte & 0x40) != 0))));
|
|
||||||
size++;
|
size++;
|
||||||
} while (more);
|
} while (value != end || (byte & 0x40) != last);
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -604,25 +610,22 @@ static void dwarf_uleb128 (Section *s, unsigned long long value)
|
||||||
unsigned char byte = value & 0x7f;
|
unsigned char byte = value & 0x7f;
|
||||||
|
|
||||||
value >>= 7;
|
value >>= 7;
|
||||||
if (value)
|
dwarf_data1(s, byte | (value ? 0x80 : 0));
|
||||||
byte |= 0x80;
|
|
||||||
dwarf_data1(s, byte);
|
|
||||||
} while (value != 0);
|
} while (value != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dwarf_sleb128 (Section *s, long long value)
|
static void dwarf_sleb128 (Section *s, long long value)
|
||||||
{
|
{
|
||||||
int more;
|
int more;
|
||||||
|
long long end = value >> 63;
|
||||||
|
unsigned char last = end & 0x40;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
unsigned char byte = value & 0x7f;
|
unsigned char byte = value & 0x7f;
|
||||||
|
|
||||||
value = (value >> 7) | ~(-1 >> 7);
|
value >>= 7;
|
||||||
more =!((((value == 0) && ((byte & 0x40) == 0))
|
more = value != end || (byte & 0x40) != last;
|
||||||
|| ((value == -1) && ((byte & 0x40) != 0))));
|
dwarf_data1(s, byte | (0x80 * more));
|
||||||
if (more)
|
|
||||||
byte |= 0x80;
|
|
||||||
dwarf_data1(s, byte);
|
|
||||||
} while (more);
|
} while (more);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -632,25 +635,22 @@ static void dwarf_uleb128_op (TCCState *s1, unsigned long long value)
|
||||||
unsigned char byte = value & 0x7f;
|
unsigned char byte = value & 0x7f;
|
||||||
|
|
||||||
value >>= 7;
|
value >>= 7;
|
||||||
if (value)
|
dwarf_line_op(s1, byte | (value ? 0x80 : 0));
|
||||||
byte |= 0x80;
|
|
||||||
dwarf_line_op(s1, byte);
|
|
||||||
} while (value != 0);
|
} while (value != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dwarf_sleb128_op (TCCState *s1, long long value)
|
static void dwarf_sleb128_op (TCCState *s1, long long value)
|
||||||
{
|
{
|
||||||
int more;
|
int more;
|
||||||
|
long long end = value >> 63;
|
||||||
|
unsigned char last = end & 0x40;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
unsigned char byte = value & 0x7f;
|
unsigned char byte = value & 0x7f;
|
||||||
|
|
||||||
value = (value >> 7) | ~(-1 >> 7);
|
value >>= 7;
|
||||||
more =!((((value == 0) && ((byte & 0x40) == 0))
|
more = value != end || (byte & 0x40) != last;
|
||||||
|| ((value == -1) && ((byte & 0x40) != 0))));
|
dwarf_line_op(s1, byte | (0x80 * more));
|
||||||
if (more)
|
|
||||||
byte |= 0x80;
|
|
||||||
dwarf_line_op(s1, byte);
|
|
||||||
} while (more);
|
} while (more);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue