From 4f6f9d61ed6f5e9db440e0839cb13b9947664d8c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 Aug 2025 17:41:45 -0700 Subject: [PATCH] inline function for replacing weak symbols with default symbol --- src/linker/lnk.c | 29 ++++++++++++++- src/linker/lnk.h | 6 +++ src/linker/lnk_symbol_table.c | 69 ----------------------------------- src/linker/lnk_symbol_table.h | 11 ------ 4 files changed, 33 insertions(+), 82 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index d7117e31..e4553842 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1244,6 +1244,22 @@ lnk_find_refs(Arena *arena, ProfEnd(); } +internal +THREAD_POOL_TASK_FUNC(lnk_replace_weak_symbols_with_default_symbol_task) +{ + LNK_ReplaceWeakSymbolsWithDefaultSymbolTask *task = raw_task; + LNK_SymbolTable *symtab = task->symtab; + LNK_SymbolHashTrieChunk *chunk = task->chunks[task_id]; + for EachIndex(i, chunk->count) { + LNK_Symbol *symbol = chunk->v[i].symbol; + COFF_ParsedSymbol symbol_parsed = lnk_parsed_symbol_from_defined(symbol); + COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); + if (symbol_interp == COFF_SymbolValueInterp_Weak) { + symbol->u.defined = lnk_default_symbol_from_weak(symtab, symbol->u.defined); + } + } +} + internal LNK_LinkContext lnk_build_link_context(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config) { @@ -2174,8 +2190,18 @@ lnk_build_link_context(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config) } ProfEnd(); - lnk_replace_weak_symbols_with_default_symbols(tp, symtab); + ProfBegin("Replace Unresolved Weak Symbols With Defualt Symbol"); + { + U64 chunks_count = 0; + LNK_SymbolHashTrieChunk **chunks = lnk_array_from_symbol_hash_trie_chunk_list(scratch.arena, symtab->chunk_lists[LNK_SymbolScope_Defined], symtab->arena->count, &chunks_count); + LNK_ReplaceWeakSymbolsWithDefaultSymbolTask task = { .symtab = symtab, .chunks = chunks }; + tp_for_parallel(tp, 0, chunks_count, lnk_replace_weak_symbols_with_default_symbol_task, &task); + } + ProfEnd(); + // + // fill out link context + // LNK_LinkContext link_ctx = {0}; link_ctx.symtab = symtab; link_ctx.objs_count = obj_list.count; @@ -2198,7 +2224,6 @@ lnk_build_link_context(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config) } lnk_log(LNK_Log_InputLib, "[Total Lib Input Size %M]", total_input_size); } - ProfEnd(); scratch_end(scratch); diff --git a/src/linker/lnk.h b/src/linker/lnk.h index d4ec69d4..d25c18da 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -75,6 +75,12 @@ typedef struct LNK_BaseRelocPageArray // --- Workers Contexts -------------------------------------------------------- +typedef struct +{ + LNK_SymbolTable *symtab; + LNK_SymbolHashTrieChunk **chunks; +} LNK_ReplaceWeakSymbolsWithDefaultSymbolTask; + typedef struct { LNK_SymbolTable *symtab; diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c index 268abedb..2022aade 100644 --- a/src/linker/lnk_symbol_table.c +++ b/src/linker/lnk_symbol_table.c @@ -650,75 +650,6 @@ lnk_symbol_table_searchf(LNK_SymbolTable *symtab, LNK_SymbolScope scope, char *f return symbol; } -internal -THREAD_POOL_TASK_FUNC(lnk_check_anti_dependecy_task) -{ - LNK_FinalizeWeakSymbolsTask *task = raw_task; - LNK_SymbolTable *symtab = task->symtab; - LNK_SymbolHashTrieChunk *chunk = task->chunks[task_id]; - - for EachIndex(i, chunk->count) { - LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_ParsedSymbol symbol_parsed = lnk_parsed_symbol_from_defined(symbol); - COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); - if (symbol_interp == COFF_SymbolValueInterp_Weak) { - COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(symbol_parsed, symbol->u.defined.obj->header.is_big_obj); - if (weak_ext->characteristics == COFF_WeakExt_AntiDependency) { - COFF_ParsedSymbol default_symbol_parsed = lnk_parsed_symbol_from_coff_symbol_idx(symbol->u.defined.obj, weak_ext->tag_index); - COFF_SymbolValueInterpType default_symbol_interp = coff_interp_from_parsed_symbol(default_symbol_parsed); - - COFF_SymbolValueInterpType actual_default_symbol_interp = default_symbol_interp; - if (default_symbol_interp == COFF_SymbolValueInterp_Undefined) { - LNK_Symbol *actual_default_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Defined, default_symbol_parsed.name); - if (actual_default_symbol) { - COFF_ParsedSymbol actual_default_symbol_parsed = lnk_parsed_symbol_from_defined(actual_default_symbol); - actual_default_symbol_interp = coff_interp_from_parsed_symbol(actual_default_symbol_parsed); - } - } - - if (actual_default_symbol_interp == COFF_SymbolValueInterp_Weak) { - LNK_SymbolNode *symbol_n = push_array(arena, LNK_SymbolNode, 1); - symbol_n->data = symbol; - lnk_symbol_list_push_node(&task->anti_dependency_symbols[task_id], symbol_n); - } - } - } - } -} - -internal -THREAD_POOL_TASK_FUNC(lnk_replace_weak_symbols_with_default_symbols_task) -{ - LNK_FinalizeWeakSymbolsTask *task = raw_task; - LNK_SymbolTable *symtab = task->symtab; - LNK_SymbolHashTrieChunk *chunk = task->chunks[task_id]; - - for EachIndex(i, chunk->count) { - LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_ParsedSymbol symbol_parsed = lnk_parsed_symbol_from_defined(symbol); - COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); - if (symbol_interp == COFF_SymbolValueInterp_Weak) { - symbol->u.defined = lnk_default_symbol_from_weak(symtab, symbol->u.defined); - } - } -} - -internal void -lnk_replace_weak_symbols_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); - - U64 chunks_count = 0; - LNK_SymbolHashTrieChunk **chunks = lnk_array_from_symbol_hash_trie_chunk_list(scratch.arena, symtab->chunk_lists[LNK_SymbolScope_Defined], symtab->arena->count, &chunks_count); - - LNK_FinalizeWeakSymbolsTask task = { .symtab = symtab, .chunks = chunks }; - tp_for_parallel(tp, 0, chunks_count, lnk_replace_weak_symbols_with_default_symbols_task, &task); - - scratch_end(scratch); - ProfEnd(); -} - internal ISectOff lnk_sc_from_symbol(LNK_Symbol *symbol) { diff --git a/src/linker/lnk_symbol_table.h b/src/linker/lnk_symbol_table.h index 7135331e..772df460 100644 --- a/src/linker/lnk_symbol_table.h +++ b/src/linker/lnk_symbol_table.h @@ -99,15 +99,6 @@ typedef struct LNK_SymbolTable LNK_SymbolHashTrieChunkList *chunk_lists[LNK_SymbolScope_Count]; } LNK_SymbolTable; -// --- Workers Contensts ------------------------------------------------------- - -typedef struct -{ - LNK_SymbolTable *symtab; - LNK_SymbolHashTrieChunk **chunks; - LNK_SymbolList *anti_dependency_symbols; -} LNK_FinalizeWeakSymbolsTask; - // --- Symbol Make ------------------------------------------------------------- internal LNK_Symbol * lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx); @@ -145,8 +136,6 @@ internal void lnk_symbol_table_push(LNK_SymbolTable *symtab, LNK_Sy internal LNK_Symbol * lnk_symbol_table_search(LNK_SymbolTable *symtab, LNK_SymbolScope scope, String8 name); internal LNK_Symbol * lnk_symbol_table_searchf(LNK_SymbolTable *symtab, LNK_SymbolScope scope, char *fmt, ...); -internal void lnk_replace_weak_symbols_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab); - // --- Symbol Contrib Helpers -------------------------------------------------- internal ISectOff lnk_sc_from_symbol(LNK_Symbol *symbol);