add check for whether weak symbol is resolved

This commit is contained in:
Nikita Smith
2025-09-08 16:07:31 -07:00
committed by Ryan Fleury
parent fc0a7d51d3
commit 98a05728b3
3 changed files with 39 additions and 42 deletions
+3 -1
View File
@@ -1528,7 +1528,8 @@ THREAD_POOL_TASK_FUNC(lnk_search_lib_task)
lnk_queue_lib_member(arena, member_ref_list, symbol, lib, member_idx); lnk_queue_lib_member(arena, member_ref_list, symbol, lib, member_idx);
} }
} else if (task->search_anti_deps && weak_ext->characteristics == COFF_WeakExt_AntiDependency) { } else if (task->search_anti_deps && weak_ext->characteristics == COFF_WeakExt_AntiDependency) {
LNK_ObjSymbolRef dep_symbol = lnk_resolve_weak_symbol(symtab, symbol_ref); LNK_ObjSymbolRef dep_symbol = {0};
if (lnk_resolve_weak_symbol(symtab, symbol_ref, &dep_symbol)) {
COFF_ParsedSymbol dep_parsed = lnk_parsed_symbol_from_coff_symbol_idx(dep_symbol.obj, dep_symbol.symbol_idx); COFF_ParsedSymbol dep_parsed = lnk_parsed_symbol_from_coff_symbol_idx(dep_symbol.obj, dep_symbol.symbol_idx);
COFF_SymbolValueInterpType dep_interp = coff_interp_from_parsed_symbol(dep_parsed); COFF_SymbolValueInterpType dep_interp = coff_interp_from_parsed_symbol(dep_parsed);
if (dep_interp == COFF_SymbolValueInterp_Weak) { if (dep_interp == COFF_SymbolValueInterp_Weak) {
@@ -1541,6 +1542,7 @@ THREAD_POOL_TASK_FUNC(lnk_search_lib_task)
} }
} }
} }
}
ProfEnd(); ProfEnd();
} }
+14 -19
View File
@@ -614,11 +614,13 @@ lnk_foff_from_symbol(COFF_SectionHeader **image_section_table, LNK_Symbol *symbo
return foff; return foff;
} }
internal LNK_ObjSymbolRef internal B32
lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol) lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymbolRef *resolved_symbol_out)
{ {
Temp scratch = scratch_begin(0,0); Temp scratch = scratch_begin(0,0);
B32 is_resolved = 0;
struct S { struct S *next; LNK_ObjSymbolRef symbol; B32 is_anti_dep; }; struct S { struct S *next; LNK_ObjSymbolRef symbol; B32 is_anti_dep; };
struct S *sf = 0, *sl = 0; struct S *sf = 0, *sl = 0;
@@ -641,8 +643,7 @@ lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol)
String8 chain_string = str8_list_join(scratch.arena, &chain, &(StringJoin){ .sep = str8_lit("\n") }); String8 chain_string = str8_list_join(scratch.arena, &chain, &(StringJoin){ .sep = str8_lit("\n") });
lnk_error_obj(LNK_Error_WeakCycle, symbol.obj, "unable to resolve cyclic symbol %S; ref chain:\n%S", symbol_parsed.name, chain_string); lnk_error_obj(LNK_Error_WeakCycle, symbol.obj, "unable to resolve cyclic symbol %S; ref chain:\n%S", symbol_parsed.name, chain_string);
MemoryZeroStruct(&current_symbol); goto exit;
break;
} }
COFF_ParsedSymbol current_parsed = lnk_parsed_symbol_from_coff_symbol_idx(current_symbol.obj, current_symbol.symbol_idx); COFF_ParsedSymbol current_parsed = lnk_parsed_symbol_from_coff_symbol_idx(current_symbol.obj, current_symbol.symbol_idx);
@@ -688,9 +689,14 @@ lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol)
} else { break; } } else { break; }
} }
if (resolved_symbol_out) {
*resolved_symbol_out = current_symbol;
}
is_resolved = 1;
exit:; exit:;
scratch_end(scratch); scratch_end(scratch);
return current_symbol; return is_resolved;
} }
internal internal
@@ -705,7 +711,8 @@ THREAD_POOL_TASK_FUNC(lnk_replace_weak_with_default_symbol_task)
COFF_ParsedSymbol symbol_parsed = lnk_parsed_from_symbol(symbol); COFF_ParsedSymbol symbol_parsed = lnk_parsed_from_symbol(symbol);
COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed);
if (symbol_interp == COFF_SymbolValueInterp_Weak) { if (symbol_interp == COFF_SymbolValueInterp_Weak) {
LNK_ObjSymbolRef resolve = lnk_resolve_weak_symbol(symtab, symbol_ref); LNK_ObjSymbolRef resolve = {0};
if (lnk_resolve_weak_symbol(symtab, symbol_ref, &resolve)) {
COFF_ParsedSymbol resolve_parsed = lnk_parsed_symbol_from_coff_symbol_idx(resolve.obj, resolve.symbol_idx); COFF_ParsedSymbol resolve_parsed = lnk_parsed_symbol_from_coff_symbol_idx(resolve.obj, resolve.symbol_idx);
COFF_SymbolValueInterpType resolve_interp = coff_interp_from_parsed_symbol(resolve_parsed); COFF_SymbolValueInterpType resolve_interp = coff_interp_from_parsed_symbol(resolve_parsed);
if (resolve_interp == COFF_SymbolValueInterp_Weak) { if (resolve_interp == COFF_SymbolValueInterp_Weak) {
@@ -727,28 +734,16 @@ THREAD_POOL_TASK_FUNC(lnk_replace_weak_with_default_symbol_task)
} }
} }
} }
}
internal void internal void
lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab) lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab)
{ {
ProfBeginFunction(); ProfBeginFunction();
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
U64 chunks_count = 0; U64 chunks_count = 0;
LNK_SymbolHashTrieChunk **chunks = lnk_array_from_symbol_hash_trie_chunk_list(scratch.arena, symtab->chunks, symtab->arena->count, &chunks_count); LNK_SymbolHashTrieChunk **chunks = lnk_array_from_symbol_hash_trie_chunk_list(scratch.arena, symtab->chunks, symtab->arena->count, &chunks_count);
tp_for_parallel(tp, 0, chunks_count, lnk_replace_weak_with_default_symbol_task, &(LNK_ReplaceWeakSymbolsWithDefaultSymbolTask){ .symtab = symtab, .chunks = chunks }); tp_for_parallel(tp, 0, chunks_count, lnk_replace_weak_with_default_symbol_task, &(LNK_ReplaceWeakSymbolsWithDefaultSymbolTask){ .symtab = symtab, .chunks = chunks });
#if BUILD_DEBUG
for EachIndex(chunk_idx, chunks_count) {
LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx];
for EachIndex(i, chunk->count) {
LNK_Symbol *symbol = chunk->v[i].symbol;
COFF_SymbolValueInterpType symbol_interp = lnk_interp_from_symbol(symbol);
AssertAlways(symbol_interp != COFF_SymbolValueInterp_Weak);
}
}
#endif
scratch_end(scratch); scratch_end(scratch);
ProfEnd(); ProfEnd();
} }
+1 -1
View File
@@ -131,7 +131,7 @@ internal U64 lnk_foff_from_symbol(COFF_SectionHeader **image_section_table,
// --- Weak Symbol ------------------------------------------------------------- // --- Weak Symbol -------------------------------------------------------------
internal LNK_ObjSymbolRef lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol); internal B32 lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymbolRef *resolved_symbol_out);
internal void lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab); internal void lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab);