From b0d0b6a2b2201be16e5b0bed101f3e7691b8165c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 2 Feb 2026 21:39:05 -0800 Subject: [PATCH] factor out LEB128 writer --- src/dwarf/dwarf.c | 39 +++++++++++++++++++++++++++++++++++++++ src/dwarf/dwarf.h | 5 +++++ src/dwarf/dwarf_expr.c | 29 ++--------------------------- 3 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index feeaa924..9e768ba1 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -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)); +} + diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index a098e521..2b540976 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -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 diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index 359fb41f..5d73e1c2 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -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);