diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 8d54cf49..5233ea7a 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1512,8 +1512,8 @@ lnk_link_inputs_(TP_Context *tp, LNK_Symbol *symbol = c->v[i].symbol; if (symbol->is_lib_member_linked) { continue; } - LNK_ObjSymbolRef symbol_ref = lnk_get_obj_symbol_ref(symbol); - COFF_ParsedSymbol symbol_parsed = lnk_parse_symbol(symbol); + LNK_ObjSymbolRef symbol_ref = lnk_ref_from_symbol(symbol); + COFF_ParsedSymbol symbol_parsed = lnk_parsed_from_symbol(symbol); COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); if (symbol_interp == COFF_SymbolValueInterp_Undefined) { @@ -1577,8 +1577,8 @@ lnk_link_inputs_(TP_Context *tp, // create import stub (later replaced with acutal import generated by linker) LNK_Symbol *import_stub = lnk_symbol_table_search(symtab, str8_lit(LNK_IMPORT_STUB)); - LNK_ObjSymbolRef import_symbol_ref = lnk_get_obj_symbol_ref(import_stub); - LNK_Symbol *import_symbol = lnk_make_obj_ref_symbol(symtab->arena->v[0], link_symbol->name, import_symbol_ref.obj, import_symbol_ref.symbol_idx); + LNK_ObjSymbolRef import_symbol_ref = lnk_ref_from_symbol(import_stub); + LNK_Symbol *import_symbol = lnk_make_symbol(symtab->arena->v[0], link_symbol->name, import_symbol_ref.obj, import_symbol_ref.symbol_idx); lnk_symbol_table_push(symtab, import_symbol); // search DLL symbol list @@ -1648,7 +1648,7 @@ lnk_link_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer for (LNK_AltNameNode *alt_name_n = config->alt_name_list.first; alt_name_n != 0; alt_name_n = alt_name_n->next) { LNK_SymbolHashTrie *symbol_ht = lnk_symbol_table_search_(symtab, alt_name_n->v.from); if (symbol_ht) { - COFF_SymbolValueInterpType interp = lnk_interp_symbol(symbol_ht->symbol); + COFF_SymbolValueInterpType interp = lnk_interp_from_symbol(symbol_ht->symbol); if (interp == COFF_SymbolValueInterp_Undefined) { // clear out slot so weak symbol can replace undefined symbol (general rule is // weak symbol is not allowed to replace undefined) @@ -1955,7 +1955,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx]; for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_SymbolValueInterpType symbol_interp = lnk_interp_symbol(symbol); + COFF_SymbolValueInterpType symbol_interp = lnk_interp_from_symbol(symbol); if (symbol_interp == COFF_SymbolValueInterp_Undefined) { unresolved_symbols_count += 1; } @@ -1969,7 +1969,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx]; for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - if (lnk_interp_symbol(symbol) == COFF_SymbolValueInterp_Undefined) { + if (lnk_interp_from_symbol(symbol) == COFF_SymbolValueInterp_Undefined) { unresolved_symbols[cursor++] = chunk->v[i].symbol; } } @@ -1990,7 +1990,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer String8List supp_info = {0}; { U64 refs_count = 0; - LNK_ObjSymbolRef **refs = lnk_get_obj_symbol_ref_many(scratch.arena, symbol, &refs_count); + LNK_ObjSymbolRef **refs = lnk_ref_from_symbol_many(scratch.arena, symbol, &refs_count); for EachIndex(ref_idx, refs_count) { LNK_ObjSymbolRef *ref = refs[ref_idx]; LNK_Obj *obj = ref->obj; @@ -2136,7 +2136,7 @@ lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_Obj // push tasks for each root symbol for (LNK_IncludeSymbolNode *root_n = config->include_symbol_list.first; root_n != 0; root_n = root_n->next) { LNK_Symbol *root = lnk_symbol_table_search(symtab, root_n->v.name); - LNK_ObjSymbolRef root_ref = lnk_get_obj_symbol_ref(root); + LNK_ObjSymbolRef root_ref = lnk_ref_from_symbol(root); struct Task *t = push_array(scratch.arena, struct Task, 1); t->obj = root_ref.obj; @@ -2195,20 +2195,20 @@ lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_Obj if (ref_interp == COFF_SymbolValueInterp_Regular) { LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(ref_symbol.obj, ref_parsed.section_number); if (symlink) { - ref_symbol = lnk_get_obj_symbol_ref(symlink); + ref_symbol = lnk_ref_from_symbol(symlink); } break; } else if (ref_interp == COFF_SymbolValueInterp_Undefined) { if (reloc_parsed.storage_class == COFF_SymStorageClass_External) { LNK_Symbol *defn = lnk_symbol_table_search(symtab, ref_parsed.name); - next_ref = lnk_get_obj_symbol_ref(defn); + next_ref = lnk_ref_from_symbol(defn); } else { MemoryZeroStruct(&ref_symbol); break; } } else if (ref_interp == COFF_SymbolValueInterp_Weak) { LNK_Symbol *defn = lnk_symbol_table_search(symtab, ref_parsed.name); - next_ref = lnk_get_obj_symbol_ref(defn); + next_ref = lnk_ref_from_symbol(defn); } else { break; } @@ -2309,14 +2309,14 @@ lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymb switch (symbol_interp) { case COFF_SymbolValueInterp_Regular: { LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(symbol.obj, symbol_parsed.section_number); - *symbol_out = symlink ? lnk_get_obj_symbol_ref(symlink) : symbol; + *symbol_out = symlink ? lnk_ref_from_symbol(symlink) : symbol; } break; case COFF_SymbolValueInterp_Weak: { LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); - COFF_ParsedSymbol defn_parsed = lnk_parse_symbol(defn); - COFF_SymbolValueInterpType defn_interp = lnk_interp_symbol(defn); + COFF_ParsedSymbol defn_parsed = lnk_parsed_from_symbol(defn); + COFF_SymbolValueInterpType defn_interp = lnk_interp_from_symbol(defn); if (defn_interp != COFF_SymbolValueInterp_Undefined) { - *symbol_out = lnk_get_obj_symbol_ref(defn); + *symbol_out = lnk_ref_from_symbol(defn); } else { is_resolved = 0; } @@ -2324,19 +2324,19 @@ lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymb case COFF_SymbolValueInterp_Undefined: { LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); if (defn) { - *symbol_out = lnk_get_obj_symbol_ref(defn); + *symbol_out = lnk_ref_from_symbol(defn); } else { is_resolved = 0; } } break; case COFF_SymbolValueInterp_Common: { LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); - *symbol_out = lnk_get_obj_symbol_ref(defn); + *symbol_out = lnk_ref_from_symbol(defn); } break; case COFF_SymbolValueInterp_Abs: { if (symbol_parsed.storage_class == COFF_SymStorageClass_External) { LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); - *symbol_out = lnk_get_obj_symbol_ref(defn); + *symbol_out = lnk_ref_from_symbol(defn); } else { *symbol_out = symbol; } @@ -2460,8 +2460,8 @@ THREAD_POOL_TASK_FUNC(lnk_set_comdat_leaders_contribs_task) LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(obj, section_number); if (symlink == 0) { continue; } - COFF_ParsedSymbol symlink_parsed = lnk_parse_symbol(symlink); - LNK_ObjSymbolRef symlink_ref = lnk_get_obj_symbol_ref(symlink); + COFF_ParsedSymbol symlink_parsed = lnk_parsed_from_symbol(symlink); + LNK_ObjSymbolRef symlink_ref = lnk_ref_from_symbol(symlink); task->sect_map[obj_idx][sect_idx] = task->sect_map[symlink_ref.obj->input_idx][symlink_parsed.section_number - 1]; } ProfEnd(); @@ -2506,13 +2506,13 @@ THREAD_POOL_TASK_FUNC(lnk_patch_comdat_leaders_task) if (interp == COFF_SymbolValueInterp_Regular) { LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(obj, symbol.section_number); if (symlink) { - LNK_ObjSymbolRef symlink_ref = lnk_get_obj_symbol_ref(symlink); + LNK_ObjSymbolRef symlink_ref = lnk_ref_from_symbol(symlink); if (symlink_ref.obj != obj) { U32 section_number; U32 value; if (symbol.storage_class == COFF_SymStorageClass_External) { // COMDAT leader may be at a different offset, so update this symbol with leader's offset - COFF_ParsedSymbol parsed_symlink = lnk_parse_symbol(symlink); + COFF_ParsedSymbol parsed_symlink = lnk_parsed_from_symbol(symlink); section_number = symbol.section_number; value = parsed_symlink.value; } else { @@ -2590,8 +2590,8 @@ THREAD_POOL_TASK_FUNC(lnk_patch_common_block_leaders_task) for (U64 contrib_idx = contrib_range.min; contrib_idx < contrib_range.max; contrib_idx += 1) { LNK_CommonBlockContrib *contrib = &task->u.patch_symtabs.common_block_contribs[contrib_idx]; LNK_Symbol *symbol = contrib->symbol; - LNK_ObjSymbolRef symbol_ref = lnk_get_obj_symbol_ref(symbol); - COFF_ParsedSymbol parsed_symbol = lnk_parse_symbol(symbol); + LNK_ObjSymbolRef symbol_ref = lnk_ref_from_symbol(symbol); + COFF_ParsedSymbol parsed_symbol = lnk_parsed_from_symbol(symbol); U64 section_number = task->u.patch_symtabs.common_block_sect->sect_idx + 1; if (symbol_ref.obj->header.is_big_obj) { @@ -2624,8 +2624,8 @@ THREAD_POOL_TASK_FUNC(lnk_patch_common_block_symbols_task) COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class); if (interp == COFF_SymbolValueInterp_Common) { LNK_Symbol *defn = lnk_symbol_table_search(task->symtab, symbol.name); - COFF_ParsedSymbol defn_parsed = lnk_parse_symbol(defn); - Assert(lnk_interp_symbol(defn) == COFF_SymbolValueInterp_Regular); + COFF_ParsedSymbol defn_parsed = lnk_parsed_from_symbol(defn); + Assert(lnk_interp_from_symbol(defn) == COFF_SymbolValueInterp_Regular); if (defn) { if (obj->header.is_big_obj) { COFF_Symbol32 *symbol32 = symbol.raw_symbol; @@ -2902,7 +2902,7 @@ THREAD_POOL_TASK_FUNC(lnk_count_common_block_contribs_task) for (LNK_SymbolHashTrieChunk *chunk = symtab->chunks[task_id].first; chunk != 0; chunk = chunk->next) { for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_ParsedSymbol parsed_symbol = lnk_parse_symbol(symbol); + COFF_ParsedSymbol parsed_symbol = lnk_parsed_from_symbol(symbol); COFF_SymbolValueInterpType parsed_interp = coff_interp_symbol(parsed_symbol.section_number, parsed_symbol.value, parsed_symbol.storage_class); if (parsed_interp == COFF_SymbolValueInterp_Common) { task->u.common_block.counts[task_id] += 1; @@ -2921,7 +2921,7 @@ THREAD_POOL_TASK_FUNC(lnk_fill_out_common_block_contribs_task) for (LNK_SymbolHashTrieChunk *chunk = symtab->chunks[task_id].first; chunk != 0; chunk = chunk->next) { for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_ParsedSymbol parsed_symbol = lnk_parse_symbol(symbol); + COFF_ParsedSymbol parsed_symbol = lnk_parsed_from_symbol(symbol); COFF_SymbolValueInterpType parsed_interp = coff_interp_symbol(parsed_symbol.section_number, parsed_symbol.value, parsed_symbol.storage_class); if (parsed_interp == COFF_SymbolValueInterp_Common) { LNK_CommonBlockContrib *contrib = &task->u.common_block.contribs[cursor++]; @@ -3856,7 +3856,7 @@ lnk_build_win32_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config LNK_Symbol *entry_symbol = lnk_symbol_table_search(symtab, config->entry_point_name); if (entry_symbol) { - *entry_point_va = safe_cast_u32(lnk_virt_off_from_symbol(section_table, entry_symbol)); + *entry_point_va = safe_cast_u32(lnk_voff_from_symbol(section_table, entry_symbol)); } scratch_end(scratch); @@ -4293,13 +4293,13 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT { LNK_Symbol *load_config_symbol = lnk_symbol_table_search(symtab, str8_lit(MSCRT_LOAD_CONFIG_SYMBOL_NAME)); if (load_config_symbol) { - U64 load_config_foff = lnk_file_off_from_symbol(image_section_table, load_config_symbol); + U64 load_config_foff = lnk_foff_from_symbol(image_section_table, load_config_symbol); String8 load_config_data = str8_skip(image_data, load_config_foff); U32 load_config_size = 0; if (sizeof(load_config_size) <= load_config_data.size) { PE_DataDirectory *load_config_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_LOAD_CONFIG); - load_config_dir->virt_off = lnk_virt_off_from_symbol(image_section_table, load_config_symbol); + load_config_dir->virt_off = lnk_voff_from_symbol(image_section_table, load_config_symbol); load_config_dir->virt_size = load_config_size; } else { // TODO: report corrupted load config @@ -4348,13 +4348,13 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT LNK_Symbol *null_import_desc = lnk_symbol_table_searchf(symtab, "__NULL_IMPORT_DESCRIPTOR"); LNK_Symbol *null_thunk_data = lnk_symbol_table_searchf(symtab, "\x7f%S_NULL_THUNK_DATA", lnk_get_image_name(config)); if (idata_sect && null_import_desc && null_thunk_data) { - COFF_ParsedSymbol null_import_desc_parsed = lnk_parse_symbol(null_import_desc); + COFF_ParsedSymbol null_import_desc_parsed = lnk_parsed_from_symbol(null_import_desc); LNK_SectionContrib *idata_first_contrib = lnk_get_first_section_contrib(idata_sect); PE_DataDirectory *import_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_IMPORT); import_dir->virt_off = image_section_table[idata_first_contrib->u.sect_idx + 1]->voff + idata_first_contrib->u.off; import_dir->virt_size = null_import_desc_parsed.value - idata_first_contrib->u.off; - COFF_ParsedSymbol null_thunk_data_parsed = lnk_parse_symbol(null_thunk_data); + COFF_ParsedSymbol null_thunk_data_parsed = lnk_parsed_from_symbol(null_thunk_data); U64 null_thunk_data_voff = image_section_table[null_thunk_data_parsed.section_number]->voff + null_thunk_data_parsed.value; U64 first_import_foff = image_section_table[idata_first_contrib->u.sect_idx+1]->foff + idata_first_contrib->u.off; PE_ImportEntry *first_import = str8_deserial_get_raw_ptr(image_data, first_import_foff, sizeof(*first_import)); @@ -4370,7 +4370,7 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT LNK_Symbol *null_import_desc = lnk_symbol_table_search(symtab, str8_lit("__NULL_DELAY_IMPORT_DESCRIPTOR")); LNK_Symbol *last_null_thunk = lnk_symbol_table_searchf(symtab,"\x7f%S_NULL_THUNK_DATA_DLA", lnk_get_image_name(config)); if (didat_sect && null_import_desc && last_null_thunk) { - COFF_ParsedSymbol null_import_desc_parsed = lnk_parse_symbol(null_import_desc); + COFF_ParsedSymbol null_import_desc_parsed = lnk_parsed_from_symbol(null_import_desc); LNK_SectionContrib *didat_first_contrib = lnk_get_first_section_contrib(didat_sect); PE_DataDirectory *import_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_DELAY_IMPORT); import_dir->virt_off = lnk_get_first_section_contrib_voff(image_section_table, didat_sect); @@ -4395,7 +4395,7 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT } // patch-in align - U64 tls_header_foff = lnk_file_off_from_symbol(image_section_table, tls_used_symbol); + U64 tls_header_foff = lnk_foff_from_symbol(image_section_table, tls_used_symbol); B32 is_tls_header64 = coff_word_size_from_machine(config->machine) == 8; if (is_tls_header64) { PE_TLSHeader64 *tls_header = str8_deserial_get_raw_ptr(image_data, tls_header_foff, sizeof(*tls_header)); @@ -4407,7 +4407,7 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT // patch directory PE_DataDirectory *tls_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_TLS); - tls_dir->virt_off = lnk_virt_off_from_symbol(image_section_table, tls_used_symbol); + tls_dir->virt_off = lnk_voff_from_symbol(image_section_table, tls_used_symbol); tls_dir->virt_size = is_tls_header64 ? sizeof(PE_TLSHeader64) : sizeof(PE_TLSHeader32); ProfEnd(); @@ -4476,13 +4476,13 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT } if (guid_pdb_symbol) { - U64 cv_guid_foff = lnk_file_off_from_symbol(image_section_table, guid_pdb_symbol); + U64 cv_guid_foff = lnk_foff_from_symbol(image_section_table, guid_pdb_symbol); Guid *cv_guid = str8_deserial_get_raw_ptr(image_data, cv_guid_foff, sizeof(*cv_guid)); *cv_guid = config->guid; } if (guid_rdi_symbol) { - U64 cv_guid_foff = lnk_file_off_from_symbol(image_section_table, guid_rdi_symbol); + U64 cv_guid_foff = lnk_foff_from_symbol(image_section_table, guid_rdi_symbol); Guid *cv_guid = str8_deserial_get_raw_ptr(image_data, cv_guid_foff, sizeof(*cv_guid)); *cv_guid = config->guid; } diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 5b07d9a5..acc4ac15 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -3021,8 +3021,8 @@ THREAD_POOL_TASK_FUNC(lnk_build_pdb_public_symbols_defined_task) U64 node_idx = 0; for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - LNK_ObjSymbolRef symbol_ref = lnk_get_obj_symbol_ref(symbol); - COFF_ParsedSymbol symbol_parsed = lnk_parse_symbol(symbol); + LNK_ObjSymbolRef symbol_ref = lnk_ref_from_symbol(symbol); + COFF_ParsedSymbol symbol_parsed = lnk_parsed_from_symbol(symbol); if (symbol_parsed.section_number == lnk_obj_get_removed_section_number(symbol_ref.obj)) { continue; } diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index 50e2ecf6..ac4ca13f 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -369,27 +369,27 @@ THREAD_POOL_TASK_FUNC(lnk_input_coff_symbol_table) if (sect_header->flags & COFF_SectionFlag_LnkRemove) { break; } - LNK_Symbol *defn = lnk_make_obj_ref_symbol(arena, symbol.name, obj, symbol_idx); + LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx); lnk_symbol_table_push_(task->symtab, arena, worker_id, defn); } } break; case COFF_SymbolValueInterp_Weak: { - LNK_Symbol *defn = lnk_make_obj_ref_symbol(arena, symbol.name, obj, symbol_idx); + LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx); lnk_symbol_table_push_(task->symtab, arena, worker_id, defn); } break; case COFF_SymbolValueInterp_Undefined: { if (symbol.storage_class == COFF_SymStorageClass_External) { - LNK_Symbol *defn = lnk_make_obj_ref_symbol(arena, symbol.name, obj, symbol_idx); + LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx); lnk_symbol_table_push_(task->symtab, arena, worker_id, defn); } } break; case COFF_SymbolValueInterp_Common: { - LNK_Symbol *defn = lnk_make_obj_ref_symbol(arena, symbol.name, obj, symbol_idx); + LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx); lnk_symbol_table_push_(task->symtab, arena, worker_id, defn); } break; case COFF_SymbolValueInterp_Abs: { if (symbol.storage_class == COFF_SymStorageClass_External) { - LNK_Symbol *defn = lnk_make_obj_ref_symbol(arena, symbol.name, obj, symbol_idx); + LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx); lnk_symbol_table_push_(task->symtab, arena, worker_id, defn); } } break; diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c index 1759be9c..04159186 100644 --- a/src/linker/lnk_symbol_table.c +++ b/src/linker/lnk_symbol_table.c @@ -2,7 +2,7 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) internal LNK_Symbol * -lnk_make_obj_ref_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx) +lnk_make_symbol(Arena *arena, String8 name, LNK_Obj *obj, U32 symbol_idx) { LNK_ObjSymbolRefNode *ref = push_array(arena, LNK_ObjSymbolRefNode, 1); ref->v.obj = obj; @@ -24,14 +24,12 @@ lnk_obj_symbol_ref_is_before(void *raw_a, void *raw_b) LNK_Lib *b_lib = lnk_obj_get_lib(b_ref->obj); U32 a_lib_input_idx = a_lib ? a_lib->input_idx : 0; U32 b_lib_input_idx = b_lib ? b_lib->input_idx : 0; - if (a_lib_input_idx == b_lib_input_idx) { if (a_ref->obj->input_idx == b_ref->obj->input_idx) { return a_ref->symbol_idx < b_ref->symbol_idx; } return a_ref->obj->input_idx < b_ref->obj->input_idx; } - return a_lib_input_idx < b_lib_input_idx; } @@ -42,16 +40,16 @@ lnk_obj_symbol_ref_ptr_is_before(void *raw_a, void *raw_b) return lnk_obj_symbol_ref_is_before(*a, *b); } -internal B32 +internal int lnk_symbol_is_before(void *raw_a, void *raw_b) { LNK_Symbol *a = raw_a, *b = raw_b; - LNK_ObjSymbolRef a_ref = lnk_get_obj_symbol_ref(a); - LNK_ObjSymbolRef b_ref = lnk_get_obj_symbol_ref(b); + LNK_ObjSymbolRef a_ref = lnk_ref_from_symbol(a); + LNK_ObjSymbolRef b_ref = lnk_ref_from_symbol(b); return lnk_obj_symbol_ref_is_before(&a_ref, &b_ref); } -internal B32 +internal int lnk_symbol_ptr_is_before(void *raw_a, void *raw_b) { return lnk_symbol_is_before(*(LNK_Symbol **)raw_a, *(LNK_Symbol **)raw_b); @@ -73,56 +71,6 @@ lnk_symbol_list_push(Arena *arena, LNK_SymbolList *list, LNK_Symbol *symbol) return node; } -internal void -lnk_symbol_list_concat_in_place(LNK_SymbolList *list, LNK_SymbolList *to_concat) -{ - SLLConcatInPlace(list, to_concat); -} - -internal void -lnk_symbol_concat_in_place_array(LNK_SymbolList *list, LNK_SymbolList *to_concat, U64 to_concat_count) -{ - SLLConcatInPlaceArray(list, to_concat, to_concat_count); -} - -internal LNK_SymbolList -lnk_symbol_list_from_array(Arena *arena, LNK_SymbolArray arr) -{ - LNK_SymbolList list = {0}; - LNK_SymbolNode *node_arr = push_array_no_zero(arena, LNK_SymbolNode, arr.count); - for (U64 i = 0; i < arr.count; i += 1) { - LNK_SymbolNode *node = &node_arr[i]; - node->next = 0; - node->data = &arr.v[i]; - lnk_symbol_list_push_node(&list, node); - } - return list; -} - -internal LNK_SymbolNodeArray -lnk_symbol_node_array_from_list(Arena *arena, LNK_SymbolList list) -{ - LNK_SymbolNodeArray result = {0}; - result.count = 0; - result.v = push_array_no_zero(arena, LNK_SymbolNode *, list.count); - for (LNK_SymbolNode *i = list.first; i != 0; i = i->next, ++result.count) { - result.v[result.count] = i; - } - return result; -} - -internal LNK_SymbolArray -lnk_symbol_array_from_list(Arena *arena, LNK_SymbolList list) -{ - LNK_SymbolArray arr = {0}; - arr.count = 0; - arr.v = push_array_no_zero(arena, LNK_Symbol, list.count); - for (LNK_SymbolNode *node = list.first; node != 0; node = node->next) { - arr.v[arr.count++] = *node->data; - } - return arr; -} - internal LNK_SymbolHashTrie * lnk_symbol_hash_trie_chunk_list_push(Arena *arena, LNK_SymbolHashTrieChunkList *list, U64 cap) { @@ -141,8 +89,8 @@ lnk_symbol_hash_trie_chunk_list_push(Arena *arena, LNK_SymbolHashTrieChunkList * internal void lnk_error_multiply_defined_symbol(LNK_Symbol *dst, LNK_Symbol *src) { - LNK_ObjSymbolRef dst_ref = lnk_get_obj_symbol_ref(dst); - LNK_ObjSymbolRef src_ref = lnk_get_obj_symbol_ref(src); + LNK_ObjSymbolRef dst_ref = lnk_ref_from_symbol(dst); + LNK_ObjSymbolRef src_ref = lnk_ref_from_symbol(src); lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, dst_ref.obj, "symbol \"%S\" (No. %#x) is multiply defined in %S (No. %#x)", dst->name, dst_ref.symbol_idx, src_ref.obj->path, src_ref.symbol_idx); } @@ -151,12 +99,12 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) { B32 can_replace = 0; - COFF_ParsedSymbol dst_parsed = lnk_parse_symbol(dst); - COFF_ParsedSymbol src_parsed = lnk_parse_symbol(src); - COFF_SymbolValueInterpType dst_interp = lnk_interp_symbol(dst); - COFF_SymbolValueInterpType src_interp = lnk_interp_symbol(src); - LNK_ObjSymbolRef dst_ref = lnk_get_obj_symbol_ref(dst); - LNK_ObjSymbolRef src_ref = lnk_get_obj_symbol_ref(src); + COFF_ParsedSymbol dst_parsed = lnk_parsed_from_symbol(dst); + COFF_ParsedSymbol src_parsed = lnk_parsed_from_symbol(src); + COFF_SymbolValueInterpType dst_interp = lnk_interp_from_symbol(dst); + COFF_SymbolValueInterpType src_interp = lnk_interp_from_symbol(src); + LNK_ObjSymbolRef dst_ref = lnk_ref_from_symbol(dst); + LNK_ObjSymbolRef src_ref = lnk_ref_from_symbol(src); LNK_Obj *dst_obj = dst_ref.obj; LNK_Obj *src_obj = src_ref.obj; @@ -176,7 +124,7 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) weak_parsed = src_parsed; } - LNK_ObjSymbolRef weak_symbol_ref = lnk_get_obj_symbol_ref(weak); + LNK_ObjSymbolRef weak_symbol_ref = lnk_ref_from_symbol(weak); COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(weak_parsed, weak_symbol_ref.obj->header.is_big_obj); if (weak_ext->characteristics == COFF_WeakExt_SearchLibrary) { // NOTE: MSVC does not let a weak symbol to replace an undefined one, @@ -382,9 +330,9 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) internal void lnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src) { - COFF_ParsedSymbol dst_parsed = lnk_parse_symbol(dst); - COFF_SymbolValueInterpType dst_interp = lnk_interp_symbol(dst); - LNK_ObjSymbolRef dst_ref = lnk_get_obj_symbol_ref(dst); + COFF_ParsedSymbol dst_parsed = lnk_parsed_from_symbol(dst); + COFF_SymbolValueInterpType dst_interp = lnk_interp_from_symbol(dst); + LNK_ObjSymbolRef dst_ref = lnk_ref_from_symbol(dst); if (dst_interp == COFF_SymbolValueInterp_Regular) { // remove replaced section from the output @@ -408,9 +356,9 @@ lnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src) // assert leader section is live #if BUILD_DEBUG { - COFF_ParsedSymbol src_parsed = lnk_parse_symbol(src); - COFF_SymbolValueInterpType src_interp = lnk_interp_symbol(src); - LNK_ObjSymbolRef src_ref = lnk_get_obj_symbol_ref(src); + COFF_ParsedSymbol src_parsed = lnk_parsed_from_symbol(src); + COFF_SymbolValueInterpType src_interp = lnk_interp_from_symbol(src); + LNK_ObjSymbolRef src_ref = lnk_ref_from_symbol(src); if (src_interp == COFF_SymbolValueInterp_Regular) { COFF_SectionHeader *src_sect = lnk_coff_section_header_from_section_number(src_ref.obj, src_parsed.section_number); @@ -541,13 +489,13 @@ lnk_array_from_symbol_hash_trie_chunk_list(Arena *arena, LNK_SymbolHashTrieChunk } internal LNK_ObjSymbolRef -lnk_get_obj_symbol_ref(LNK_Symbol *symbol) +lnk_ref_from_symbol(LNK_Symbol *symbol) { return symbol->refs->v; } internal U64 -lnk_get_obj_symbol_ref_count(LNK_Symbol *symbol) +lnk_ref_count_from_symbol(LNK_Symbol *symbol) { U64 count = 0; for (LNK_ObjSymbolRefNode *node = symbol->refs; node != 0; node = node->next, count += 1); @@ -555,10 +503,10 @@ lnk_get_obj_symbol_ref_count(LNK_Symbol *symbol) } internal LNK_ObjSymbolRef ** -lnk_get_obj_symbol_ref_many(Arena *arena, LNK_Symbol *symbol, U64 *count_out) +lnk_ref_from_symbol_many(Arena *arena, LNK_Symbol *symbol, U64 *count_out) { // TODO: would be simpler if we sorted refs on insert/update - U64 refs_count = lnk_get_obj_symbol_ref_count(symbol); + 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) { @@ -572,19 +520,100 @@ lnk_get_obj_symbol_ref_many(Arena *arena, LNK_Symbol *symbol, U64 *count_out) } internal COFF_ParsedSymbol -lnk_parse_symbol(LNK_Symbol *symbol) +lnk_parsed_from_symbol(LNK_Symbol *symbol) { - LNK_ObjSymbolRef ref = lnk_get_obj_symbol_ref(symbol); + LNK_ObjSymbolRef ref = lnk_ref_from_symbol(symbol); return lnk_parsed_symbol_from_coff_symbol_idx(ref.obj, ref.symbol_idx); } internal COFF_SymbolValueInterpType -lnk_interp_symbol(LNK_Symbol *symbol) +lnk_interp_from_symbol(LNK_Symbol *symbol) { - COFF_ParsedSymbol symbol_parsed = lnk_parse_symbol(symbol); + COFF_ParsedSymbol symbol_parsed = lnk_parsed_from_symbol(symbol); return coff_interp_from_parsed_symbol(symbol_parsed); } +internal U64 +lnk_symbol_table_hasher(String8 string) +{ + return u64_hash_from_str8(string); +} + +internal LNK_SymbolTable * +lnk_symbol_table_init(TP_Arena *arena) +{ + LNK_SymbolTable *symtab = push_array(arena->v[0], LNK_SymbolTable, 1); + symtab->arena = arena; + symtab->chunks = push_array(arena->v[0], LNK_SymbolHashTrieChunkList, arena->count); + return symtab; +} + +internal void +lnk_symbol_table_push_(LNK_SymbolTable *symtab, Arena *arena, U64 worker_id, LNK_Symbol *symbol) +{ + U64 hash = lnk_symbol_table_hasher(symbol->name); + lnk_symbol_hash_trie_insert_or_replace(arena, &symtab->chunks[worker_id], &symtab->root, hash, symbol); +} + +internal void +lnk_symbol_table_push(LNK_SymbolTable *symtab, LNK_Symbol *symbol) +{ + lnk_symbol_table_push_(symtab, symtab->arena->v[0], 0, symbol); +} + +internal LNK_SymbolHashTrie * +lnk_symbol_table_search_(LNK_SymbolTable *symtab, String8 name) +{ + U64 hash = lnk_symbol_table_hasher(name); + return lnk_symbol_hash_trie_search(symtab->root, hash, name); +} + +internal LNK_Symbol * +lnk_symbol_table_search(LNK_SymbolTable *symtab, String8 name) +{ + LNK_SymbolHashTrie *trie = lnk_symbol_table_search_(symtab, name); + return trie ? trie->symbol : 0; +} + +internal LNK_Symbol * +lnk_symbol_table_searchf(LNK_SymbolTable *symtab, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + + va_list args; va_start(args, fmt); + String8 name = push_str8fv(scratch.arena, fmt, args); + va_end(args); + + LNK_Symbol *symbol = lnk_symbol_table_search(symtab, name); + + scratch_end(scratch); + return symbol; +} + +internal ISectOff +lnk_sc_from_symbol(LNK_Symbol *symbol) +{ + COFF_ParsedSymbol parsed_symbol = lnk_parsed_from_symbol(symbol); + ISectOff sc = { .isect = parsed_symbol.section_number, .off = parsed_symbol.value }; + return sc; +} + +internal U64 +lnk_voff_from_symbol(COFF_SectionHeader **image_section_table, LNK_Symbol *symbol) +{ + ISectOff sc = lnk_sc_from_symbol(symbol); + U64 voff = image_section_table[sc.isect]->voff + sc.off; + return voff; +} + +internal U64 +lnk_foff_from_symbol(COFF_SectionHeader **image_section_table, LNK_Symbol *symbol) +{ + ISectOff sc = lnk_sc_from_symbol(symbol); + U64 foff = image_section_table[sc.isect]->foff + sc.off; + return foff; +} + internal LNK_ObjSymbolRef lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol) { @@ -626,10 +655,10 @@ lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol) // does weak symbol have a definition? LNK_Symbol *defn_symbol = lnk_symbol_table_search(symtab, current_parsed.name); - COFF_ParsedSymbol defn_parsed = lnk_parse_symbol(defn_symbol); + COFF_ParsedSymbol defn_parsed = lnk_parsed_from_symbol(defn_symbol); COFF_SymbolValueInterpType defn_interp = coff_interp_symbol(defn_parsed.section_number, defn_parsed.value, defn_parsed.storage_class); if (defn_interp != COFF_SymbolValueInterp_Weak) { - current_symbol = lnk_get_obj_symbol_ref(defn_symbol); + current_symbol = lnk_ref_from_symbol(defn_symbol); break; } @@ -643,19 +672,19 @@ lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol) if (weak_ext->characteristics == COFF_WeakExt_AntiDependency) { if (tag_interp == COFF_SymbolValueInterp_Undefined || tag_interp == COFF_SymbolValueInterp_Weak) { LNK_Symbol *dep_symbol = lnk_symbol_table_search(symtab, tag_parsed.name); - tag_interp = lnk_interp_symbol(dep_symbol); + tag_interp = lnk_interp_from_symbol(dep_symbol); } if (tag_interp == COFF_SymbolValueInterp_Weak) { goto exit; } } } else if (current_interp == COFF_SymbolValueInterp_Undefined) { LNK_Symbol *defn_symbol = lnk_symbol_table_search(symtab, current_parsed.name); - COFF_SymbolValueInterpType defn_interp = lnk_interp_symbol(defn_symbol); + COFF_SymbolValueInterpType defn_interp = lnk_interp_from_symbol(defn_symbol); // unresolved undefined symbol if (defn_interp == COFF_SymbolValueInterp_Undefined) { break; } // follow symbol definition - current_symbol = lnk_get_obj_symbol_ref(defn_symbol); + current_symbol = lnk_ref_from_symbol(defn_symbol); } else { break; } } @@ -664,67 +693,6 @@ exit:; return current_symbol; } -internal U64 -lnk_symbol_hash(String8 string) -{ - XXH3_state_t hasher; XXH3_64bits_reset(&hasher); - XXH3_64bits_update(&hasher, &string.size, sizeof(string.size)); - XXH3_64bits_update(&hasher, string.str, string.size); - XXH64_hash_t result = XXH3_64bits_digest(&hasher); - return result; -} - -internal LNK_SymbolTable * -lnk_symbol_table_init(TP_Arena *arena) -{ - LNK_SymbolTable *symtab = push_array(arena->v[0], LNK_SymbolTable, 1); - symtab->arena = arena; - symtab->chunks = push_array(arena->v[0], LNK_SymbolHashTrieChunkList, arena->count); - return symtab; -} - -internal void -lnk_symbol_table_push_(LNK_SymbolTable *symtab, Arena *arena, U64 worker_id, LNK_Symbol *symbol) -{ - U64 hash = lnk_symbol_hash(symbol->name); - lnk_symbol_hash_trie_insert_or_replace(arena, &symtab->chunks[worker_id], &symtab->root, hash, symbol); -} - -internal void -lnk_symbol_table_push(LNK_SymbolTable *symtab, LNK_Symbol *symbol) -{ - lnk_symbol_table_push_(symtab, symtab->arena->v[0], 0, symbol); -} - -internal LNK_SymbolHashTrie * -lnk_symbol_table_search_(LNK_SymbolTable *symtab, String8 name) -{ - U64 hash = lnk_symbol_hash(name); - return lnk_symbol_hash_trie_search(symtab->root, hash, name); -} - -internal LNK_Symbol * -lnk_symbol_table_search(LNK_SymbolTable *symtab, String8 name) -{ - LNK_SymbolHashTrie *trie = lnk_symbol_table_search_(symtab, name); - return trie ? trie->symbol : 0; -} - -internal LNK_Symbol * -lnk_symbol_table_searchf(LNK_SymbolTable *symtab, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - - va_list args; va_start(args, fmt); - String8 name = push_str8fv(scratch.arena, fmt, args); - va_end(args); - - LNK_Symbol *symbol = lnk_symbol_table_search(symtab, name); - - scratch_end(scratch); - return symbol; -} - internal THREAD_POOL_TASK_FUNC(lnk_replace_weak_with_default_symbol_task) { @@ -733,8 +701,8 @@ THREAD_POOL_TASK_FUNC(lnk_replace_weak_with_default_symbol_task) LNK_SymbolHashTrieChunk *chunk = task->chunks[task_id]; for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - LNK_ObjSymbolRef symbol_ref = lnk_get_obj_symbol_ref(symbol); - COFF_ParsedSymbol symbol_parsed = lnk_parse_symbol(symbol); + LNK_ObjSymbolRef symbol_ref = lnk_ref_from_symbol(symbol); + COFF_ParsedSymbol symbol_parsed = lnk_parsed_from_symbol(symbol); COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); if (symbol_interp == COFF_SymbolValueInterp_Weak) { LNK_ObjSymbolRef resolve = lnk_resolve_weak_symbol(symtab, symbol_ref); @@ -763,20 +731,19 @@ THREAD_POOL_TASK_FUNC(lnk_replace_weak_with_default_symbol_task) internal void lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab) { - Temp scratch = scratch_begin(0,0); + 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->chunks, symtab->arena->count, &chunks_count); - - ProfBegin("Replace Unresolved Weak Symbols With Defualt Symbol"); - LNK_ReplaceWeakSymbolsWithDefaultSymbolTask task = { .symtab = symtab, .chunks = chunks }; - tp_for_parallel(tp, 0, chunks_count, lnk_replace_weak_with_default_symbol_task, &task); + 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_symbol(symbol); + COFF_SymbolValueInterpType symbol_interp = lnk_interp_from_symbol(symbol); AssertAlways(symbol_interp != COFF_SymbolValueInterp_Weak); } } @@ -786,43 +753,3 @@ lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab) ProfEnd(); } -internal ISectOff -lnk_sc_from_symbol(LNK_Symbol *symbol) -{ - COFF_ParsedSymbol parsed_symbol = lnk_parse_symbol(symbol); - - ISectOff sc = {0}; - sc.isect = parsed_symbol.section_number; - sc.off = parsed_symbol.value; - - return sc; -} - -internal U64 -lnk_isect_from_symbol(LNK_Symbol *symbol) -{ - return lnk_sc_from_symbol(symbol).isect; -} - -internal U64 -lnk_sect_off_from_symbol(LNK_Symbol *symbol) -{ - return lnk_sc_from_symbol(symbol).off; -} - -internal U64 -lnk_virt_off_from_symbol(COFF_SectionHeader **section_table, LNK_Symbol *symbol) -{ - ISectOff sc = lnk_sc_from_symbol(symbol); - U64 voff = section_table[sc.isect]->voff + sc.off; - return voff; -} - -internal U64 -lnk_file_off_from_symbol(COFF_SectionHeader **section_table, LNK_Symbol *symbol) -{ - ISectOff sc = lnk_sc_from_symbol(symbol); - U64 foff = section_table[sc.isect]->foff + sc.off; - return foff; -} - diff --git a/src/linker/lnk_symbol_table.h b/src/linker/lnk_symbol_table.h index 78bd1291..3a5e52b1 100644 --- a/src/linker/lnk_symbol_table.h +++ b/src/linker/lnk_symbol_table.h @@ -39,12 +39,6 @@ typedef struct LNK_SymbolList LNK_SymbolNode *last; } LNK_SymbolList; -typedef struct LNK_SymbolNodeArray -{ - U64 count; - LNK_SymbolNode **v; -} LNK_SymbolNodeArray; - typedef struct LNK_SymbolArray { U64 count; @@ -92,19 +86,19 @@ typedef struct LNK_SymbolHashTrieChunk **chunks; } LNK_ReplaceWeakSymbolsWithDefaultSymbolTask; -// --- Symbol Make ------------------------------------------------------------- +// --- Symbol ----------------------------------------------------------------- -internal LNK_Symbol * lnk_make_obj_ref_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx); +internal LNK_Symbol * lnk_make_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx); + +internal int lnk_obj_symbol_ref_is_before(void *raw_a, void *raw_b); +internal int lnk_obj_symbol_ref_ptr_is_before(void *raw_a, void *raw_b); +internal int lnk_symbol_is_before(void *raw_a, void *raw_b); +internal int lnk_symbol_ptr_is_before(void *raw_a, void *raw_b); // --- Symbol Containers ------------------------------------------------------ -internal void lnk_symbol_list_push_node(LNK_SymbolList *list, LNK_SymbolNode *node); -internal LNK_SymbolNode * lnk_symbol_list_push(Arena *arena, LNK_SymbolList *list, LNK_Symbol *symbol); -internal void lnk_symbol_list_concat_in_place(LNK_SymbolList *list, LNK_SymbolList *to_concat); -internal void lnk_symbol_concat_in_place_array(LNK_SymbolList *list, LNK_SymbolList *to_concat, U64 to_concat_count); -internal LNK_SymbolList lnk_symbol_list_from_array(Arena *arena, LNK_SymbolArray arr); -internal LNK_SymbolNodeArray lnk_symbol_node_array_from_list(Arena *arena, LNK_SymbolList list); -internal LNK_SymbolArray lnk_symbol_array_from_list(Arena *arena, LNK_SymbolList list); +internal void lnk_symbol_list_push_node(LNK_SymbolList *list, LNK_SymbolNode *node); +internal LNK_SymbolNode * lnk_symbol_list_push(Arena *arena, LNK_SymbolList *list, LNK_Symbol *symbol); // --- Symbol Hash Trie -------------------------------------------------------- @@ -115,15 +109,14 @@ internal LNK_SymbolHashTrieChunk ** lnk_array_from_symbol_hash_trie_chunk_list(A // --- Symbol Helpers ---------------------------------------------------------- -internal LNK_ObjSymbolRef lnk_get_obj_symbol_ref(LNK_Symbol *symbol); -internal U64 lnk_get_obj_symbol_ref_count(LNK_Symbol *symbol); -internal COFF_ParsedSymbol lnk_parse_symbol(LNK_Symbol *symbol); -internal COFF_SymbolValueInterpType lnk_interp_symbol(LNK_Symbol *symbol); -internal LNK_ObjSymbolRef lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol); +internal LNK_ObjSymbolRef lnk_ref_from_symbol(LNK_Symbol *symbol); +internal U64 lnk_ref_count_from_symbol(LNK_Symbol *symbol); +internal COFF_ParsedSymbol lnk_parsed_from_symbol(LNK_Symbol *symbol); +internal COFF_SymbolValueInterpType lnk_interp_from_symbol(LNK_Symbol *symbol); // --- Symbol Table ------------------------------------------------------------ -internal U64 lnk_symbol_hash(String8 string); +internal U64 lnk_symbol_table_hasher(String8 string); internal LNK_SymbolTable * lnk_symbol_table_init(TP_Arena *arena); internal void lnk_symbol_table_push(LNK_SymbolTable *symtab, LNK_Symbol *symbol); @@ -133,8 +126,12 @@ internal LNK_Symbol * lnk_symbol_table_searchf(LNK_SymbolTable *symtab, cha // --- Symbol Contrib Helpers -------------------------------------------------- internal ISectOff lnk_sc_from_symbol(LNK_Symbol *symbol); -internal U64 lnk_isect_from_symbol(LNK_Symbol *symbol); -internal U64 lnk_sect_off_from_symbol(LNK_Symbol *symbol); -internal U64 lnk_virt_off_from_symbol(COFF_SectionHeader **section_table, LNK_Symbol *symbol); -internal U64 lnk_file_off_from_symbol(COFF_SectionHeader **section_table, LNK_Symbol *symbol); +internal U64 lnk_voff_from_symbol(COFF_SectionHeader **image_section_table, LNK_Symbol *symbol); +internal U64 lnk_foff_from_symbol(COFF_SectionHeader **image_section_table, LNK_Symbol *symbol); + +// --- Weak Symbol ------------------------------------------------------------- + +internal LNK_ObjSymbolRef lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol); + +internal void lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab);