inline function for replacing weak symbols with default symbol

This commit is contained in:
Nikita Smith committed 2025-08-07 17:41:45 -07:00
1 parent 9a1f96bda2
commit 4f6f9d61ed
4 files changed
+33 -82

No files matched your search

-69
View File
@@ -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)
{