factor out LEB128 writer

This commit is contained in:
Nikita Smith
2026-02-05 19:45:34 -08:00
parent b44f79fe44
commit b0d0b6a2b2
3 changed files with 46 additions and 27 deletions
+39
View File
@@ -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));
}
+5
View File
@@ -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
View File
@@ -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);