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:
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;