From 330c8ead38e659f89205fe34d34c6e640f44cf79 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 20 Aug 2025 15:29:32 -0700 Subject: [PATCH] move member queue-attempt flag from symbol to lib struct --- src/base/base_core.h | 1 + src/linker/lnk.c | 17 ++++++----------- src/linker/lnk_lib.c | 24 ++++++++++++++---------- src/linker/lnk_lib.h | 1 + src/linker/lnk_symbol_table.c | 17 +++++------------ src/linker/lnk_symbol_table.h | 6 ++---- 6 files changed, 29 insertions(+), 37 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index b72a46f3..45518081 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -194,6 +194,7 @@ #if COMPILER_MSVC # include # if ARCH_X64 +# define ins_atomic_u8_eval_assign(x,c) InterlockedExchange8((volatile CHAR *)(x), (c)) # define ins_atomic_u64_eval(x) *((volatile U64 *)(x)) # define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((volatile __int64 *)(x)) # define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x)) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index f1b77591..5bf7bb5b 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -982,10 +982,12 @@ lnk_queue_lib_member_for_input(Arena *arena, } } - B32 was_live = lnk_mark_symbol_live(best_match); - if (!was_live) { - LNK_Lib *lib = best_match->u.member.v.lib; - U64 member_offset = best_match->u.member.v.member_offset; + LNK_Lib *lib = best_match->u.member.v.lib; + U32 member_idx = best_match->u.member.v.member_idx; + + B32 was_member_queued = ins_atomic_u8_eval_assign(&lib->was_member_queued[member_idx], 1); + if (!was_member_queued) { + U64 member_offset = lib->member_offsets[member_idx]; // compose input index so that members are laid out in the image // in the order of undefined symbols appearing in objs, @@ -1163,13 +1165,6 @@ lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_Obj COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed); LNK_Obj *ref_obj = ref_symbol.obj; - // mark referenced symbol live - if (ref_parsed.storage_class == COFF_SymStorageClass_External || - ref_parsed.storage_class == COFF_SymStorageClass_WeakExternal) { - LNK_Symbol *ref_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Defined, ref_parsed.name); - lnk_mark_symbol_live(ref_symbol); - } - if (ref_interp == COFF_SymbolValueInterp_Regular) { // make section number list (reloc section + associates) U32Node *section_number_list = push_array(scratch.arena, U32Node, 1); diff --git a/src/linker/lnk_lib.c b/src/linker/lnk_lib.c index 9cb00e91..3437c68b 100644 --- a/src/linker/lnk_lib.c +++ b/src/linker/lnk_lib.c @@ -69,6 +69,7 @@ lnk_lib_from_data(Arena *arena, String8 data, String8 path, LNK_Lib *lib_out) return 0; } + U32 member_count = 0; U64 symbol_count = 0; String8 string_table = {0}; U16 *symbol_indices = 0; @@ -80,6 +81,7 @@ lnk_lib_from_data(Arena *arena, String8 data, String8 path, LNK_Lib *lib_out) Assert(second_member.symbol_count == second_member.symbol_index_count); Assert(second_member.member_count == second_member.member_offset_count); + member_count = second_member.member_count; symbol_count = second_member.symbol_count; string_table = second_member.string_table; member_offsets = second_member.member_offsets; @@ -120,7 +122,8 @@ lnk_lib_from_data(Arena *arena, String8 data, String8 path, LNK_Lib *lib_out) symbol_indices[symbol_idx] = member_off_idx+1; } - member_offsets = push_array_no_zero(arena, U32, member_off_ht->count); + member_count = member_off_ht->count; + member_offsets = push_array_no_zero(arena, U32, member_count); for EachIndex(bucket_idx, member_off_ht->cap) { BucketList *bucket = &member_off_ht->buckets[bucket_idx]; for (BucketNode *n = bucket->first; n != 0; n = n->next) { @@ -147,14 +150,15 @@ lnk_lib_from_data(Arena *arena, String8 data, String8 path, LNK_Lib *lib_out) symbol_count = Min(symbol_count, symbol_names.count); // init lib - lib_out->path = push_str8_copy(arena, path); - lib_out->data = data; - lib_out->type = type; - lib_out->symbol_count = symbol_count; - lib_out->member_offsets = member_offsets; - lib_out->symbol_indices = symbol_indices; - lib_out->symbol_names = symbol_names; - lib_out->long_names = parse.long_names; + lib_out->path = push_str8_copy(arena, path); + lib_out->data = data; + lib_out->type = type; + lib_out->symbol_count = symbol_count; + lib_out->member_offsets = member_offsets; + lib_out->symbol_indices = symbol_indices; + lib_out->was_member_queued = push_array(arena, B8, member_count); + lib_out->symbol_names = symbol_names; + lib_out->long_names = parse.long_names; ProfEnd(); return 1; @@ -226,7 +230,7 @@ THREAD_POOL_TASK_FUNC(lnk_push_lib_symbols_task) for EachIndex(symbol_idx, lib->symbol_count) { U32 member_offset_number = lib->symbol_indices[symbol_idx]; if (member_offset_number > 0) { - LNK_Symbol *symbol = lnk_make_lib_symbol(arena, lib->symbol_names.v[symbol_idx], lib, lib->member_offsets[member_offset_number-1]); + LNK_Symbol *symbol = lnk_make_lib_symbol(arena, lib->symbol_names.v[symbol_idx], lib, member_offset_number-1); lnk_symbol_table_push_(symtab, arena, worker_id, LNK_SymbolScope_Lib, symbol); } } diff --git a/src/linker/lnk_lib.h b/src/linker/lnk_lib.h index 8a7cb2b5..04c3ef54 100644 --- a/src/linker/lnk_lib.h +++ b/src/linker/lnk_lib.h @@ -11,6 +11,7 @@ typedef struct LNK_Lib U32 symbol_count; U32 *member_offsets; U16 *symbol_indices; + B8 *was_member_queued; String8Array symbol_names; String8 long_names; U64 input_idx; diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c index a9e95d60..41cecd19 100644 --- a/src/linker/lnk_symbol_table.c +++ b/src/linker/lnk_symbol_table.c @@ -12,12 +12,12 @@ lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 sym } internal LNK_Symbol * -lnk_make_lib_symbol(Arena *arena, String8 name, struct LNK_Lib *lib, U64 member_offset) +lnk_make_lib_symbol(Arena *arena, String8 name, struct LNK_Lib *lib, U32 member_idx) { - LNK_Symbol *symbol = push_array(arena, LNK_Symbol, 1); - symbol->name = name; - symbol->u.member.v.lib = lib; - symbol->u.member.v.member_offset = member_offset; + LNK_Symbol *symbol = push_array(arena, LNK_Symbol, 1); + symbol->name = name; + symbol->u.member.v.lib = lib; + symbol->u.member.v.member_idx = member_idx; return symbol; } @@ -536,13 +536,6 @@ lnk_interp_from_symbol(LNK_Symbol *symbol) return coff_interp_from_parsed_symbol(symbol_parsed); } -internal B32 -lnk_mark_symbol_live(LNK_Symbol *symbol) -{ - B32 was_live = ins_atomic_u32_eval_assign(&symbol->is_live, 1); - return was_live; -} - internal LNK_SymbolDefined lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol) { diff --git a/src/linker/lnk_symbol_table.h b/src/linker/lnk_symbol_table.h index 2af086fd..5a90bcf2 100644 --- a/src/linker/lnk_symbol_table.h +++ b/src/linker/lnk_symbol_table.h @@ -21,13 +21,12 @@ typedef struct LNK_SymbolDefined typedef struct LNK_SymbolLib { struct LNK_Lib *lib; - U64 member_offset; + U32 member_idx; } LNK_SymbolLib; typedef struct LNK_Symbol { String8 name; - B32 is_live; union { LNK_SymbolDefined defined; struct { @@ -100,7 +99,7 @@ typedef struct LNK_SymbolTable // --- Symbol Make ------------------------------------------------------------- internal LNK_Symbol * lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx); -internal LNK_Symbol * lnk_make_lib_symbol(Arena *arena, String8 name, struct LNK_Lib *lib, U64 member_offset); +internal LNK_Symbol * lnk_make_lib_symbol(Arena *arena, String8 name, struct LNK_Lib *lib, U32 member_idx); // --- Symbol Containers ------------------------------------------------------ @@ -123,7 +122,6 @@ internal LNK_SymbolHashTrieChunk ** lnk_array_from_symbol_hash_trie_chunk_list(A internal COFF_ParsedSymbol lnk_parsed_symbol_from_defined(LNK_Symbol *symbol); internal COFF_SymbolValueInterpType lnk_interp_from_symbol(LNK_Symbol *symbol); -internal B32 lnk_mark_symbol_live(LNK_Symbol *symbol); internal LNK_SymbolDefined lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol); // --- Symbol Table ------------------------------------------------------------