kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

commit d01b96e7d71e506c57e32e667ac74c58ae3c1695
parent f70aaa45e83ca85e25ab7145a4f4a03dd391e9fe
Author: Ryan Sepassi <rsepassi@gmail.com>
Date:   Thu, 11 Jun 2026 13:23:08 -0700

perf(link): pre-size symbol index in the elf + coff readers too

Symmetry with read_macho (f70aaa45): read_elf and read_coff now
obj_reserve_symbols() to the symtab symbol count before streaming
symbols in, so all three object readers skip the SymNameIndex resize
cascade on a symbol-heavy ingested object. Byte-identical (pre-alloc
only); test-elf 41/0, test-link 124/0+80/0, test-ar, smoke-rv64 green.

Diffstat:
Msrc/obj/coff/read.c | 1+
Msrc/obj/elf/read.c | 1+
2 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/src/obj/coff/read.c b/src/obj/coff/read.c @@ -382,6 +382,7 @@ ObjBuilder* read_coff(Compiler* c, const char* name, const u8* data, ObjBuilder* ob = obj_new(c); if (!ob) compiler_panic(c, SRCLOC_NONE, "read_coff: obj_new failed"); + obj_reserve_symbols(ob, nsymbols); /* skip the 256->nsymbols resize cascade */ /* ---- Step 2: ingest sections ---- */ CSecRec* secs = arena_array(c->scratch, CSecRec, nsections ? nsections : 1); diff --git a/src/obj/elf/read.c b/src/obj/elf/read.c @@ -802,6 +802,7 @@ ObjBuilder* read_elf(Compiler* c, const char* name, const u8* data, u64 strtab_sz = str_sh->sh_size; nsyms = (u32)(sh->sh_size / sym_size); + obj_reserve_symbols(ob, nsyms); /* skip the 256->nsyms resize cascade */ sym_elf_to_obj = arena_zarray(c->scratch, u32, nsyms ? nsyms : 1); const u8* base = data + sh->sh_offset;