move member queue-attempt flag from symbol to lib struct

This commit is contained in:
Nikita Smith
2025-09-05 15:19:30 -07:00
committed by Ryan Fleury
parent f1b22dbe27
commit 330c8ead38
6 changed files with 29 additions and 37 deletions
+1
View File
@@ -194,6 +194,7 @@
#if COMPILER_MSVC #if COMPILER_MSVC
# include <intrin.h> # include <intrin.h>
# if ARCH_X64 # if ARCH_X64
# define ins_atomic_u8_eval_assign(x,c) InterlockedExchange8((volatile CHAR *)(x), (c))
# define ins_atomic_u64_eval(x) *((volatile U64 *)(x)) # define ins_atomic_u64_eval(x) *((volatile U64 *)(x))
# define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((volatile __int64 *)(x)) # define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((volatile __int64 *)(x))
# define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x)) # define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x))
+6 -11
View File
@@ -982,10 +982,12 @@ lnk_queue_lib_member_for_input(Arena *arena,
} }
} }
B32 was_live = lnk_mark_symbol_live(best_match); LNK_Lib *lib = best_match->u.member.v.lib;
if (!was_live) { U32 member_idx = best_match->u.member.v.member_idx;
LNK_Lib *lib = best_match->u.member.v.lib;
U64 member_offset = best_match->u.member.v.member_offset; B32 was_member_queued = ins_atomic_u8_eval_assign(&lib->was_member_queued[member_idx], 1);
if (!was_member_queued) {
U64 member_offset = lib->member_offsets[member_idx];
// compose input index so that members are laid out in the image // compose input index so that members are laid out in the image
// in the order of undefined symbols appearing in objs, // in the order of undefined symbols appearing in objs,
@@ -1163,13 +1165,6 @@ lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_Obj
COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed); COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed);
LNK_Obj *ref_obj = ref_symbol.obj; LNK_Obj *ref_obj = ref_symbol.obj;
// mark referenced symbol live
if (ref_parsed.storage_class == COFF_SymStorageClass_External ||
ref_parsed.storage_class == COFF_SymStorageClass_WeakExternal) {
LNK_Symbol *ref_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Defined, ref_parsed.name);
lnk_mark_symbol_live(ref_symbol);
}
if (ref_interp == COFF_SymbolValueInterp_Regular) { if (ref_interp == COFF_SymbolValueInterp_Regular) {
// make section number list (reloc section + associates) // make section number list (reloc section + associates)
U32Node *section_number_list = push_array(scratch.arena, U32Node, 1); U32Node *section_number_list = push_array(scratch.arena, U32Node, 1);
+14 -10
View File
@@ -69,6 +69,7 @@ lnk_lib_from_data(Arena *arena, String8 data, String8 path, LNK_Lib *lib_out)
return 0; return 0;
} }
U32 member_count = 0;
U64 symbol_count = 0; U64 symbol_count = 0;
String8 string_table = {0}; String8 string_table = {0};
U16 *symbol_indices = 0; U16 *symbol_indices = 0;
@@ -80,6 +81,7 @@ lnk_lib_from_data(Arena *arena, String8 data, String8 path, LNK_Lib *lib_out)
Assert(second_member.symbol_count == second_member.symbol_index_count); Assert(second_member.symbol_count == second_member.symbol_index_count);
Assert(second_member.member_count == second_member.member_offset_count); Assert(second_member.member_count == second_member.member_offset_count);
member_count = second_member.member_count;
symbol_count = second_member.symbol_count; symbol_count = second_member.symbol_count;
string_table = second_member.string_table; string_table = second_member.string_table;
member_offsets = second_member.member_offsets; member_offsets = second_member.member_offsets;
@@ -120,7 +122,8 @@ lnk_lib_from_data(Arena *arena, String8 data, String8 path, LNK_Lib *lib_out)
symbol_indices[symbol_idx] = member_off_idx+1; symbol_indices[symbol_idx] = member_off_idx+1;
} }
member_offsets = push_array_no_zero(arena, U32, member_off_ht->count); member_count = member_off_ht->count;
member_offsets = push_array_no_zero(arena, U32, member_count);
for EachIndex(bucket_idx, member_off_ht->cap) { for EachIndex(bucket_idx, member_off_ht->cap) {
BucketList *bucket = &member_off_ht->buckets[bucket_idx]; BucketList *bucket = &member_off_ht->buckets[bucket_idx];
for (BucketNode *n = bucket->first; n != 0; n = n->next) { for (BucketNode *n = bucket->first; n != 0; n = n->next) {
@@ -147,14 +150,15 @@ lnk_lib_from_data(Arena *arena, String8 data, String8 path, LNK_Lib *lib_out)
symbol_count = Min(symbol_count, symbol_names.count); symbol_count = Min(symbol_count, symbol_names.count);
// init lib // init lib
lib_out->path = push_str8_copy(arena, path); lib_out->path = push_str8_copy(arena, path);
lib_out->data = data; lib_out->data = data;
lib_out->type = type; lib_out->type = type;
lib_out->symbol_count = symbol_count; lib_out->symbol_count = symbol_count;
lib_out->member_offsets = member_offsets; lib_out->member_offsets = member_offsets;
lib_out->symbol_indices = symbol_indices; lib_out->symbol_indices = symbol_indices;
lib_out->symbol_names = symbol_names; lib_out->was_member_queued = push_array(arena, B8, member_count);
lib_out->long_names = parse.long_names; lib_out->symbol_names = symbol_names;
lib_out->long_names = parse.long_names;
ProfEnd(); ProfEnd();
return 1; return 1;
@@ -226,7 +230,7 @@ THREAD_POOL_TASK_FUNC(lnk_push_lib_symbols_task)
for EachIndex(symbol_idx, lib->symbol_count) { for EachIndex(symbol_idx, lib->symbol_count) {
U32 member_offset_number = lib->symbol_indices[symbol_idx]; U32 member_offset_number = lib->symbol_indices[symbol_idx];
if (member_offset_number > 0) { if (member_offset_number > 0) {
LNK_Symbol *symbol = lnk_make_lib_symbol(arena, lib->symbol_names.v[symbol_idx], lib, lib->member_offsets[member_offset_number-1]); LNK_Symbol *symbol = lnk_make_lib_symbol(arena, lib->symbol_names.v[symbol_idx], lib, member_offset_number-1);
lnk_symbol_table_push_(symtab, arena, worker_id, LNK_SymbolScope_Lib, symbol); lnk_symbol_table_push_(symtab, arena, worker_id, LNK_SymbolScope_Lib, symbol);
} }
} }
+1
View File
@@ -11,6 +11,7 @@ typedef struct LNK_Lib
U32 symbol_count; U32 symbol_count;
U32 *member_offsets; U32 *member_offsets;
U16 *symbol_indices; U16 *symbol_indices;
B8 *was_member_queued;
String8Array symbol_names; String8Array symbol_names;
String8 long_names; String8 long_names;
U64 input_idx; U64 input_idx;
+5 -12
View File
@@ -12,12 +12,12 @@ lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 sym
} }
internal LNK_Symbol * internal LNK_Symbol *
lnk_make_lib_symbol(Arena *arena, String8 name, struct LNK_Lib *lib, U64 member_offset) lnk_make_lib_symbol(Arena *arena, String8 name, struct LNK_Lib *lib, U32 member_idx)
{ {
LNK_Symbol *symbol = push_array(arena, LNK_Symbol, 1); LNK_Symbol *symbol = push_array(arena, LNK_Symbol, 1);
symbol->name = name; symbol->name = name;
symbol->u.member.v.lib = lib; symbol->u.member.v.lib = lib;
symbol->u.member.v.member_offset = member_offset; symbol->u.member.v.member_idx = member_idx;
return symbol; return symbol;
} }
@@ -536,13 +536,6 @@ lnk_interp_from_symbol(LNK_Symbol *symbol)
return coff_interp_from_parsed_symbol(symbol_parsed); return coff_interp_from_parsed_symbol(symbol_parsed);
} }
internal B32
lnk_mark_symbol_live(LNK_Symbol *symbol)
{
B32 was_live = ins_atomic_u32_eval_assign(&symbol->is_live, 1);
return was_live;
}
internal LNK_SymbolDefined internal LNK_SymbolDefined
lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol) lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol)
{ {
+2 -4
View File
@@ -21,13 +21,12 @@ typedef struct LNK_SymbolDefined
typedef struct LNK_SymbolLib typedef struct LNK_SymbolLib
{ {
struct LNK_Lib *lib; struct LNK_Lib *lib;
U64 member_offset; U32 member_idx;
} LNK_SymbolLib; } LNK_SymbolLib;
typedef struct LNK_Symbol typedef struct LNK_Symbol
{ {
String8 name; String8 name;
B32 is_live;
union { union {
LNK_SymbolDefined defined; LNK_SymbolDefined defined;
struct { struct {
@@ -100,7 +99,7 @@ typedef struct LNK_SymbolTable
// --- Symbol Make ------------------------------------------------------------- // --- Symbol Make -------------------------------------------------------------
internal LNK_Symbol * lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx); internal LNK_Symbol * lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx);
internal LNK_Symbol * lnk_make_lib_symbol(Arena *arena, String8 name, struct LNK_Lib *lib, U64 member_offset); internal LNK_Symbol * lnk_make_lib_symbol(Arena *arena, String8 name, struct LNK_Lib *lib, U32 member_idx);
// --- Symbol Containers ------------------------------------------------------ // --- Symbol Containers ------------------------------------------------------
@@ -123,7 +122,6 @@ internal LNK_SymbolHashTrieChunk ** lnk_array_from_symbol_hash_trie_chunk_list(A
internal COFF_ParsedSymbol lnk_parsed_symbol_from_defined(LNK_Symbol *symbol); internal COFF_ParsedSymbol lnk_parsed_symbol_from_defined(LNK_Symbol *symbol);
internal COFF_SymbolValueInterpType lnk_interp_from_symbol(LNK_Symbol *symbol); internal COFF_SymbolValueInterpType lnk_interp_from_symbol(LNK_Symbol *symbol);
internal B32 lnk_mark_symbol_live(LNK_Symbol *symbol);
internal LNK_SymbolDefined lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol); internal LNK_SymbolDefined lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol);
// --- Symbol Table ------------------------------------------------------------ // --- Symbol Table ------------------------------------------------------------