mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-29 23:01:49 -07:00
inline function for replacing weak symbols with default symbol
This commit is contained in:
+27
-2
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user