diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 250a33c4..e2c2c2c0 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1782,9 +1782,9 @@ lnk_link_inputs(TP_Context *tp, if (link_whole_archive) { local_persist LNK_Symbol *null_symbol = 0; if (null_symbol == 0) { - null_symbol = push_array(inputer->arena, LNK_Symbol, 1); - null_symbol->refs = push_array(inputer->arena, LNK_ObjSymbolRefNode, 1); - null_symbol->refs->v.obj = &link->objs.first->data; + null_symbol = push_array(inputer->arena, LNK_Symbol, 1); + null_symbol->first_ref = push_array(inputer->arena, LNK_ObjSymbolRefNode, 1); + null_symbol->first_ref->v.obj = &link->objs.first->data; } LNK_LibMemberRef *member_refs = push_array(scratch.arena, LNK_LibMemberRef, lib->member_count); for EachIndex(member_idx, lib->member_count) { @@ -1876,10 +1876,11 @@ lnk_link_inputs(TP_Context *tp, LNK_Symbol *import_stub = lnk_symbol_table_search(symtab, str8_lit(LNK_IMPORT_STUB)); // same import symbol must never be queued more than once, if it is, there is a bug in the link set logic - AssertAlways(member_ref->link_symbol->refs != import_stub->refs); + AssertAlways(member_ref->link_symbol->first_ref != import_stub->first_ref); // replace the import symbol with a stub, which is later replaced with the real import symbol once import obj is ready. - member_ref->link_symbol->refs = import_stub->refs; + member_ref->link_symbol->first_ref = import_stub->first_ref; + member_ref->link_symbol->last_ref = import_stub->last_ref; // push import member for import obj generation lnk_lib_member_ref_list_push_node(&link->imports, member_ref); diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c index 6cd8734e..8cb6c4e5 100644 --- a/src/linker/lnk_symbol_table.c +++ b/src/linker/lnk_symbol_table.c @@ -8,9 +8,9 @@ lnk_make_symbol(Arena *arena, String8 name, LNK_Obj *obj, U32 symbol_idx) ref->v.obj = obj; ref->v.symbol_idx = symbol_idx; - LNK_Symbol *symbol = push_array(arena, LNK_Symbol, 1); - symbol->name = name; - symbol->refs = ref; + LNK_Symbol *symbol = push_array(arena, LNK_Symbol, 1); + symbol->name = name; + SLLQueuePush(symbol->first_ref, symbol->last_ref, ref); return symbol; } @@ -351,9 +351,8 @@ lnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src) } // merge symbol refs - LNK_ObjSymbolRefNode *src_last_ref; - for (src_last_ref = src->refs; src_last_ref->next != 0; src_last_ref = src_last_ref->next); - src_last_ref->next = dst->refs; + src->last_ref->next = dst->first_ref; + src->last_ref = dst->last_ref; // assert leader section is live #if BUILD_DEBUG @@ -494,14 +493,14 @@ lnk_array_from_symbol_hash_trie_chunk_list(Arena *arena, LNK_SymbolHashTrieChunk internal LNK_ObjSymbolRef lnk_ref_from_symbol(LNK_Symbol *symbol) { - return symbol->refs->v; + return symbol->first_ref->v; } internal U64 lnk_ref_count_from_symbol(LNK_Symbol *symbol) { U64 count = 0; - for (LNK_ObjSymbolRefNode *node = symbol->refs; node != 0; node = node->next, count += 1); + for (LNK_ObjSymbolRefNode *node = symbol->first_ref; node != 0; node = node->next, count += 1); return count; } @@ -512,7 +511,7 @@ lnk_ref_from_symbol_many(Arena *arena, LNK_Symbol *symbol, U64 *count_out) U64 refs_count = lnk_ref_count_from_symbol(symbol); LNK_ObjSymbolRef **refs = push_array(arena, LNK_ObjSymbolRef *, refs_count); U64 i = 0; - for (LNK_ObjSymbolRefNode *node = symbol->refs; node != 0; node = node->next, i += 1) { + for (LNK_ObjSymbolRefNode *node = symbol->first_ref; node != 0; node = node->next, i += 1) { refs[i] = &node->v; } radsort(refs, refs_count, lnk_obj_symbol_ref_ptr_is_before); @@ -785,7 +784,7 @@ THREAD_POOL_TASK_FUNC(lnk_replace_weak_with_default_symbol_task) symbol16->storage_class = COFF_SymStorageClass_External; } } else { - symbol->refs->v = resolve; + symbol->first_ref->v = resolve; } } } diff --git a/src/linker/lnk_symbol_table.h b/src/linker/lnk_symbol_table.h index cdf38304..da579bb1 100644 --- a/src/linker/lnk_symbol_table.h +++ b/src/linker/lnk_symbol_table.h @@ -20,7 +20,8 @@ typedef struct LNK_ObjSymbolRefNode typedef struct LNK_Symbol { String8 name; - LNK_ObjSymbolRefNode *refs; + LNK_ObjSymbolRefNode *first_ref; + LNK_ObjSymbolRefNode *last_ref; } LNK_Symbol; // --- Symbol Containers -------------------------------------------------------