mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-14 17:28:07 +00:00
factor out LEB128 writer
This commit is contained in:
@@ -827,3 +827,42 @@ dw_string_from_cfa_opcode(DW_CFA_Opcode opcode)
|
||||
}
|
||||
return str8_zero();
|
||||
}
|
||||
|
||||
internal String8
|
||||
dw_write_uleb128(Arena *arena, U64 v)
|
||||
{
|
||||
U64 buffer_size = 0;
|
||||
U8 buffer[10];
|
||||
U64 value = v;
|
||||
do {
|
||||
U8 byte = value & 0x7f;
|
||||
value >>= 7;
|
||||
if (value != 0) {
|
||||
byte |= 0x80;
|
||||
}
|
||||
Assert(buffer_size < sizeof(buffer));
|
||||
buffer[buffer_size++] = byte;
|
||||
} while (value > 0);
|
||||
return str8_copy(arena, str8(buffer, buffer_size));
|
||||
}
|
||||
|
||||
internal String8
|
||||
dw_write_sleb128(Arena *arena, S64 v)
|
||||
{
|
||||
U64 buffer_size = 0;
|
||||
U8 buffer[10];
|
||||
for (S64 value = v, more = 1; more != 0; ) {
|
||||
U8 byte = value & 0x7f;
|
||||
value >>= 7;
|
||||
U8 sign_bit = byte & 0x40;
|
||||
if ((value == 0 && sign_bit == 0) || (value == -1 && sign_bit != 0)) {
|
||||
more = 0;
|
||||
} else {
|
||||
byte |= 0x80;
|
||||
}
|
||||
Assert(buffer_size < sizeof(buffer));
|
||||
buffer[buffer_size++] = byte;
|
||||
}
|
||||
return str8_copy(arena, str8(buffer, buffer_size));
|
||||
}
|
||||
|
||||
|
||||
@@ -1778,4 +1778,9 @@ internal String8 dw_string_from_rng_list_entry_kind(Arena *arena, DW_RLE kind);
|
||||
internal String8 dw_string_from_register(Arena *arena, Arch arch, U64 reg_id);
|
||||
internal String8 dw_string_from_cfa_opcode(DW_CFA_Opcode opcode);
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
internal String8 dw_write_uleb128(Arena *arena, U64 v);
|
||||
internal String8 dw_write_sleb128(Arena *arena, S64 v);
|
||||
|
||||
#endif // DWARF_H
|
||||
|
||||
+2
-27
@@ -1611,35 +1611,10 @@ dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64
|
||||
str8_serial_push_struct(scratch.arena, srl, &e->s64);
|
||||
} break;
|
||||
case DW_ExprEncType_ULEB128: {
|
||||
U64 buffer_size = 0;
|
||||
U8 buffer[10];
|
||||
for (U64 value = e->u64; value != 0; ) {
|
||||
U8 byte = value & 0x7f;
|
||||
value >>= 7;
|
||||
if (value != 0) {
|
||||
byte |= 0x80;
|
||||
}
|
||||
Assert(buffer_size < sizeof(buffer));
|
||||
buffer[buffer_size++] = byte;
|
||||
}
|
||||
str8_serial_push_string(scratch.arena, srl, str8(buffer, buffer_size));
|
||||
str8_serial_push_string(scratch.arena, srl, dw_write_uleb128(scratch.arena, e->u64));
|
||||
} break;
|
||||
case DW_ExprEncType_SLEB128: {
|
||||
U64 buffer_size = 0;
|
||||
U8 buffer[10];
|
||||
for (S64 value = e->s64, more = 1; more != 0; ) {
|
||||
U8 byte = value & 0x7f;
|
||||
value >>= 7;
|
||||
U8 sign_bit = byte & 0x40;
|
||||
if ((value == 0 && sign_bit == 0) || (value == -1 && sign_bit != 0)) {
|
||||
more = 0;
|
||||
} else {
|
||||
byte |= 0x80;
|
||||
}
|
||||
Assert(buffer_size < sizeof(buffer));
|
||||
buffer[buffer_size++] = byte;
|
||||
}
|
||||
str8_serial_push_string(scratch.arena, srl, str8(buffer, buffer_size));
|
||||
str8_serial_push_string(scratch.arena, srl, dw_write_sleb128(scratch.arena, e->s64));
|
||||
} break;
|
||||
case DW_ExprEncType_Addr: {
|
||||
U64 addr_size = byte_size_from_arch(arch);
|
||||
|
||||
Reference in New Issue
Block a user