diff --git a/src/linker/base_ext/base_arena.c b/src/linker/base_ext/base_arena.c index f01b9cb8..166d3ea6 100644 --- a/src/linker/base_ext/base_arena.c +++ b/src/linker/base_ext/base_arena.c @@ -1,14 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal U32 * -push_u32(Arena *arena, U32 value) -{ - U32 *result = push_array_no_zero(arena, U32, 1); - *result = value; - return result; -} - internal U64 * push_u64(Arena *arena, U64 value) { diff --git a/src/linker/base_ext/base_arena.h b/src/linker/base_ext/base_arena.h index 3a0e1de4..4cb25d21 100644 --- a/src/linker/base_ext/base_arena.h +++ b/src/linker/base_ext/base_arena.h @@ -3,12 +3,10 @@ #pragma once -internal U32 * push_u32(Arena *arena, U32 value); -internal U64 * push_u64(Arena *arena, U64 value); +internal U64 * push_u64 (Arena *arena, U64 value); internal U32 * push_array_copy_u32(Arena *arena, U32 *v, U64 count); internal U64 * push_array_copy_u64(Arena *arena, U64 *v, U64 count); -internal U64 ** push_matrix_u64(Arena *arena, U64 rows, U64 columns); -internal String8 push_cstr(Arena *arena, String8 str); +internal U64 ** push_matrix_u64 (Arena *arena, U64 rows, U64 columns); internal Arena ** alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt); internal void release_arena_array(Arena **arr); diff --git a/src/linker/base_ext/base_bit_array.h b/src/linker/base_ext/base_bit_array.h index dcffb77d..995facd7 100644 --- a/src/linker/base_ext/base_bit_array.h +++ b/src/linker/base_ext/base_bit_array.h @@ -3,16 +3,16 @@ #pragma once -internal U32Array bit_array_init32(Arena *arena, U64 word_count); -internal U64 bit_array_scan_left_to_right32(U32Array bit_array, U64 lo, U64 hi, B32 state); -internal U64 bit_array_scan_right_to_left32(U32Array bit_array, U64 lo, U64 hi, B32 state); +internal U32Array bit_array_init32 (Arena *arena, U64 word_count); +internal U64 bit_array_scan_left_to_right32 (U32Array bit_array, U64 lo, U64 hi, B32 state); +internal U64 bit_array_scan_right_to_left32 (U32Array bit_array, U64 lo, U64 hi, B32 state); internal Rng1U64 bit_array_scan_left_to_right32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count); internal Rng1U64 bit_array_scan_right_to_left32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count); -internal B32 byte_scan_right_to_left(U8 *start, U8 *opl, U8 byte, U64 *offset_out); -internal U64 bit_array_find_next_unset_bit32(U32Array bit_array); -internal U64 bit_array_find_next_set_bit32(U32Array bit_array); -internal void bit_array_set_bit32(U32Array bit_array, U64 idx, B32 state); -internal void bit_array_set_bit_range32(U32Array bit_array, Rng1U64 range, B32 state); -internal U32 bit_array_get_bit32(U32Array bit_array, U64 idx); +internal B32 byte_scan_right_to_left (U8 *start, U8 *opl, U8 byte, U64 *offset_out); +internal U64 bit_array_find_next_unset_bit32 (U32Array bit_array); +internal U64 bit_array_find_next_set_bit32 (U32Array bit_array); +internal void bit_array_set_bit32 (U32Array bit_array, U64 idx, B32 state); +internal void bit_array_set_bit_range32 (U32Array bit_array, Rng1U64 range, B32 state); +internal U32 bit_array_get_bit32 (U32Array bit_array, U64 idx); diff --git a/src/linker/hash_table.c b/src/linker/hash_table.c index b6c60031..22276591 100644 --- a/src/linker/hash_table.c +++ b/src/linker/hash_table.c @@ -24,17 +24,10 @@ bucket_list_pop(BucketList *list) return result; } -//////////////////////////////// - -#define XXH_STATIC_LINKING_ONLY -#include "third_party/xxHash/xxhash.c" -#include "third_party/xxHash/xxhash.h" - internal U64 hash_table_hasher(String8 string) { - XXH64_hash_t hash64 = XXH3_64bits(string.str, string.size); - return hash64; + return u64_hash_from_str8(string); } internal HashTable * @@ -211,6 +204,18 @@ hash_table_search_u64(HashTable *ht, U64 key_u64) return 0; } +internal KeyValuePair * +hash_table_search_path(HashTable *ht, String8 path) +{ + Temp scratch = scratch_begin(0,0); + String8 path_canon = path; + path_canon = lower_from_str8(scratch.arena, path_canon); + path_canon = path_convert_slashes(scratch.arena, path_canon, PathStyle_UnixAbsolute); + KeyValuePair *result = hash_table_search_string(ht, path_canon); + scratch_end(scratch); + return result; +} + internal KeyValuePair * hash_table_search_raw(HashTable *ht, void *key) { @@ -225,18 +230,6 @@ hash_table_search_raw(HashTable *ht, void *key) return 0; } -internal KeyValuePair * -hash_table_search_path(HashTable *ht, String8 path) -{ - Temp scratch = scratch_begin(0,0); - String8 path_canon = path; - path_canon = lower_from_str8(scratch.arena, path_canon); - path_canon = path_convert_slashes(scratch.arena, path_canon, PathStyle_UnixAbsolute); - KeyValuePair *result = hash_table_search_string(ht, path_canon); - scratch_end(scratch); - return result; -} - internal B32 hash_table_search_path_u64(HashTable *ht, String8 key, U64 *value_out) { @@ -250,53 +243,6 @@ hash_table_search_path_u64(HashTable *ht, String8 key, U64 *value_out) return 0; } -internal void * -hash_table_search_u64_raw(HashTable *ht, U64 key_u64) -{ - KeyValuePair *kv = hash_table_search_u64(ht, key_u64); - return kv ? kv->value_raw : 0; -} - -internal void * -hash_table_search_path_raw(HashTable *ht, String8 path) -{ - KeyValuePair *kv = hash_table_search_path(ht, path); - return kv ? kv->value_raw : 0; -} - -internal void * -hash_table_search_raw_raw(HashTable *ht, void *key) -{ - KeyValuePair *kv = hash_table_search_raw(ht, key); - return kv ? kv->value_raw : 0; -} - -internal B32 -hash_table_search_string_u64(HashTable *ht, String8 key, U64 *value_out) -{ - KeyValuePair *result = hash_table_search_string(ht, key); - if (result != 0) { - if (value_out != 0) { - *value_out = result->value_u64; - } - return 1; - } - return 0; -} - -internal B32 -hash_table_search_string_raw(HashTable *ht, String8 key, void *value_out) -{ - KeyValuePair *result = hash_table_search_string(ht, key); - if (result) { - if (value_out) { - (*(void **)value_out) = result->value_raw; - } - return 1; - } - return 0; -} - internal BucketNode * hash_table_push_u32_u32(Arena *arena, HashTable *ht, U32 key, U32 value) { @@ -311,6 +257,19 @@ hash_table_push_raw_raw(Arena *arena, HashTable *ht, void *key, void *value) return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_raw = key, .value_raw = value }); } +internal B32 +hash_table_search_string_u64(HashTable *ht, String8 key, U64 *value_out) +{ + KeyValuePair *result = hash_table_search_string(ht, key); + if (result != 0) { + if (value_out != 0) { + *value_out = result->value_u64; + } + return 1; + } + return 0; +} + internal B32 hash_table_search_string_string(HashTable *ht, String8 key, String8 *value_out) { @@ -337,7 +296,36 @@ hash_table_search_u32_u32(HashTable *ht, U32 key, U32 *value_out) return 0; } -//////////////////////////////// +internal void * +hash_table_search_string_raw(HashTable *ht, String8 key) +{ + KeyValuePair *result = hash_table_search_string(ht, key); + if (result) { + return result->value_raw; + } + return 0; +} + +internal void * +hash_table_search_u64_raw(HashTable *ht, U64 key_u64) +{ + KeyValuePair *kv = hash_table_search_u64(ht, key_u64); + return kv ? kv->value_raw : 0; +} + +internal void * +hash_table_search_path_raw(HashTable *ht, String8 path) +{ + KeyValuePair *kv = hash_table_search_path(ht, path); + return kv ? kv->value_raw : 0; +} + +internal void * +hash_table_search_raw_raw(HashTable *ht, void *key) +{ + KeyValuePair *kv = hash_table_search_raw(ht, key); + return kv ? kv->value_raw : 0; +} internal int key_value_pair_is_before_u32(void *a, void *b) @@ -434,6 +422,7 @@ values_from_hash_table_raw(Arena *arena, HashTable *ht) } return result; } + #include "third_party/radsort/radsort.h" internal void diff --git a/src/linker/hash_table.h b/src/linker/hash_table.h index 98078ef6..67e9e3dd 100644 --- a/src/linker/hash_table.h +++ b/src/linker/hash_table.h @@ -39,22 +39,20 @@ typedef struct HashTable BucketList free_buckets; } HashTable; -//////////////////////////////// - -//- bucket list helpers +// --- Bucket List ------------------------------------------------------------- internal void bucket_list_concat_in_place(BucketList *list, BucketList *to_concat); -internal BucketNode * bucket_list_pop(BucketList *list); +internal BucketNode * bucket_list_pop (BucketList *list); -//- main +// --- Hash Table -------------------------------------------------------------- -internal U64 hash_table_hasher(String8 string); -internal HashTable * hash_table_init(Arena *arena, U64 cap); +internal U64 hash_table_hasher(String8 string); + +internal HashTable * hash_table_init (Arena *arena, U64 cap); internal void hash_table_purge(HashTable *ht); -//- push +internal BucketNode * hash_table_push(Arena *arena, HashTable *ht, U64 hash, KeyValuePair kv); -internal BucketNode * hash_table_push (Arena *arena, HashTable *ht, U64 hash, KeyValuePair v); internal BucketNode * hash_table_push_u32_string (Arena *arena, HashTable *ht, U32 key, String8 value); internal BucketNode * hash_table_push_u64_string (Arena *arena, HashTable *ht, U64 key, String8 value); internal BucketNode * hash_table_push_string_string(Arena *arena, HashTable *ht, String8 key, String8 value); @@ -66,35 +64,37 @@ internal BucketNode * hash_table_push_path_u64 (Arena *arena, HashTable *ht, internal BucketNode * hash_table_push_u64_u64 (Arena *arena, HashTable *ht, U64 key, U64 value); internal BucketNode * hash_table_push_u32_u32 (Arena *arena, HashTable *ht, U32 key, U32 value); -//- search +internal KeyValuePair * hash_table_search_string (HashTable *ht, String8 key); +internal KeyValuePair * hash_table_search_u32 (HashTable *ht, U32 key); +internal KeyValuePair * hash_table_search_u64 (HashTable *ht, U64 key); +internal KeyValuePair * hash_table_search_path (HashTable *ht, String8 key); +internal KeyValuePair * hash_table_search_raw (HashTable *ht, void *key); -internal KeyValuePair * hash_table_search_string (HashTable *ht, String8 string); -internal KeyValuePair * hash_table_search_u32 (HashTable *ht, U32 key ); -internal KeyValuePair * hash_table_search_u64 (HashTable *ht, U64 key ); -internal KeyValuePair * hash_table_search_path (HashTable *ht, String8 path ); -internal void * hash_table_search_path_raw(HashTable *ht, String8 path ); - -internal B32 hash_table_search_path_u64(HashTable *ht, String8 key, U64 *value_out); -internal B32 hash_table_search_string_u64(HashTable *ht, String8 key, U64 *value_out); -internal B32 hash_table_search_string_raw(HashTable *ht, String8 key, void *value_out); +internal B32 hash_table_search_path_u64 (HashTable *ht, String8 key, U64 *value_out); +internal B32 hash_table_search_string_u64 (HashTable *ht, String8 key, U64 *value_out); internal B32 hash_table_search_string_string(HashTable *ht, String8 key, String8 *value_out); -internal B32 hash_table_search_u32_u32(HashTable *ht, U32 key, U32 *value_out); +internal B32 hash_table_search_u32_u32 (HashTable *ht, U32 key, U32 *value_out); -//- key-value helpers +internal void * hash_table_search_string_raw(HashTable *ht, String8 key); +internal void * hash_table_search_u64_raw (HashTable *ht, U64 key); +internal void * hash_table_search_path_raw (HashTable *ht, String8 key); +internal void * hash_table_search_raw_raw (HashTable *ht, void *key); + +// --- Key Value Helpers ------------------------------------------------------- internal U32 * keys_from_hash_table_u32 (Arena *arena, HashTable *ht); internal U64 * keys_from_hash_table_u64 (Arena *arena, HashTable *ht); internal String8 keys_from_hash_table_str8 (Arena *arena, HashTable *ht); internal KeyValuePair * key_value_pairs_from_hash_table(Arena *arena, HashTable *ht); -internal void * keys_from_hash_table_raw(Arena *arena, HashTable *ht); +internal void * keys_from_hash_table_raw (Arena *arena, HashTable *ht); internal void * values_from_hash_table_raw(Arena *arena, HashTable *ht); -internal void sort_key_value_pairs_as_u32(KeyValuePair *pairs, U64 count); -internal void sort_key_value_pairs_as_u64(KeyValuePair *pairs, U64 count); +internal void sort_key_value_pairs_as_u32 (KeyValuePair *pairs, U64 count); +internal void sort_key_value_pairs_as_u64 (KeyValuePair *pairs, U64 count); internal void sort_key_value_pairs_as_string_sensitive(KeyValuePair *pairs, U64 count); -//////////////////////////////// +// --- Misc -------------------------------------------------------------------- internal U64Array remove_duplicates_u64_array(Arena *arena, U64Array arr); internal String8List remove_duplicates_str8_list(Arena *arena, String8List list); diff --git a/src/linker/linker.natvis b/src/linker/linker.natvis index b8c5aaf9..64de6bfb 100644 --- a/src/linker/linker.natvis +++ b/src/linker/linker.natvis @@ -184,6 +184,9 @@ + + + empty @@ -193,16 +196,28 @@ + cap count free_buckets - - cap - buckets - + + + + + node = buckets[bucket_idx].first + + + + node + node = node->next + + bucket_idx += 1 + + + diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 10e386c7..268a6fd4 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -144,32 +144,28 @@ lnk_config_from_argcv(Arena *arena, int argc, char **argv) if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Dll)) { lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_SubSystem, "%S", pe_string_from_subsystem(PE_WindowsSubsystem_WINDOWS_GUI)); } - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_HighEntropyVa, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_ManifestUac, "\"level='asInvoker' uiAccess='false'\""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_NxCompat, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_LargeAddressAware, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_PdbAltPath, "%%_RAD_PDB_PATH%%"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_PdbPageSize, "%u", KB(4)); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_TimeStamp, "%u", os_get_process_start_time_unix()); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Age, "%u", 1); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DoMerge, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_EnvLib, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Exe, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Guid, "imageblake3"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_LargePages, "no"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_LinkVer, "14.0"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_OsVer, "6.0"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_PageSize, "%u", KB(4)); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_PathStyle, "system"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Workers, "%u", os_get_system_info()->logical_processor_count); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_TargetOs, "windows"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SymbolTableCapDefined, "0x3ffff"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SymbolTableCapInternal, "0x1000"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SymbolTableCapWeak, "0x3ffff"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SymbolTableCapLib, "0x3ffff"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DebugAltPath, "%%_RAD_RDI_PATH%%"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_MemoryMapFiles, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_HighEntropyVa, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_ManifestUac, "\"level='asInvoker' uiAccess='false'\""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_NxCompat, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_LargeAddressAware, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_PdbAltPath, "%%_RAD_PDB_PATH%%"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_PdbPageSize, "%u", KB(4)); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_TimeStamp, "%u", os_get_process_start_time_unix()); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Age, "%u", 1); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DoMerge, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_EnvLib, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Exe, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Guid, "imageblake3"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_LargePages, "no"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_LinkVer, "14.0"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_OsVer, "6.0"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_PageSize, "%u", KB(4)); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_PathStyle, "system"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Workers, "%u", os_get_system_info()->logical_processor_count); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_TargetOs, "windows"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DebugAltPath, "%%_RAD_RDI_PATH%%"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_MemoryMapFiles, ""); #if BUILD_DEBUG lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Log, "debug"); lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Log, "io_write"); @@ -1561,7 +1557,7 @@ lnk_link_inputs_(TP_Context *tp, } // skip duplicate import inputer - if (hash_table_search_string_raw(imps->import_stub_ht, import_header.func_name, 0)) { break; } + if (hash_table_search_string_raw(imps->import_stub_ht, import_header.func_name)) { break; } hash_table_push_string_raw(imps->arena, imps->import_stub_ht, import_header.func_name, 0); // create import stub (later replaced with acutal import generated by linker) @@ -1634,7 +1630,7 @@ lnk_link_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer { // replace undefined symbols that have an alternate name with a weak symbol 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->data.from); + LNK_SymbolHashTrie *symbol_ht = lnk_symbol_table_search_(symtab, alt_name_n->v.from); if (symbol_ht) { COFF_SymbolValueInterpType interp = lnk_interp_from_symbol(symbol_ht->symbol); if (interp == COFF_SymbolValueInterp_Undefined) { @@ -1647,14 +1643,14 @@ lnk_link_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer String8 alt_name_obj_data; { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Unknown); - COFF_ObjSymbol *from_symbol = coff_obj_writer_push_symbol_weak(obj_writer, alt_name_n->data.from, COFF_WeakExt_SearchLibrary, 0); - COFF_ObjSymbol *to_symbol = coff_obj_writer_push_symbol_weak(obj_writer, alt_name_n->data.to, COFF_WeakExt_AntiDependency, from_symbol); + COFF_ObjSymbol *from_symbol = coff_obj_writer_push_symbol_weak(obj_writer, alt_name_n->v.from, COFF_WeakExt_SearchLibrary, 0); + COFF_ObjSymbol *to_symbol = coff_obj_writer_push_symbol_weak(obj_writer, alt_name_n->v.to, COFF_WeakExt_AntiDependency, from_symbol); coff_obj_writer_set_default_symbol(from_symbol, to_symbol); alt_name_obj_data = coff_obj_writer_serialize(arena->v[0], obj_writer); coff_obj_writer_release(&obj_writer); } - LNK_Obj *obj_with_alt_name = alt_name_n->data.obj; + LNK_Obj *obj_with_alt_name = alt_name_n->v.obj; String8 obj_with_alt_name_path = obj_with_alt_name ? obj_with_alt_name->path : str8_lit("RADLINK"); lnk_inputer_push_obj_linkgen(inputer, obj_with_alt_name ? obj_with_alt_name->link_member : 0, obj_with_alt_name_path, alt_name_obj_data); @@ -2282,8 +2278,7 @@ THREAD_POOL_TASK_FUNC(lnk_gather_section_definitions_task) // was section defined? String8 sect_name = coff_name_from_section_header(string_table, sect_header); String8 sect_name_with_flags = lnk_make_name_with_flags(temp.arena, sect_name, sect_header->flags & ~COFF_SectionFlags_LnkFlags); - LNK_SectionDefinition *sect_defn = 0; - hash_table_search_string_raw(sect_defn_ht, sect_name_with_flags, §_defn); + LNK_SectionDefinition *sect_defn = hash_table_search_string_raw(sect_defn_ht, sect_name_with_flags); // push new section definition if (sect_defn == 0) { @@ -2329,7 +2324,7 @@ THREAD_POOL_TASK_FUNC(lnk_gather_section_contribs_task) Temp temp = temp_begin(scratch.arena); String8 sect_name = coff_name_from_section_header(string_table, sect_header); String8 sect_name_with_flags = lnk_make_name_with_flags(temp.arena, sect_name, sect_header->flags & ~COFF_SectionFlags_LnkFlags); - hash_table_search_string_raw(task->contribs_ht, sect_name_with_flags, &sc_chunk); + sc_chunk = hash_table_search_string_raw(task->contribs_ht, sect_name_with_flags); temp_end(temp); } @@ -3835,8 +3830,7 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT for EachIndex(defn_idx, sect_defns_count) { LNK_SectionDefinition *defn = sect_defns[defn_idx]; String8 name_with_flags = lnk_make_name_with_flags(arena->v[0], defn->name, defn->flags); - LNK_SectionDefinition *main_defn = 0; - hash_table_search_string_raw(task.u.gather_sects.defns[0], name_with_flags, &main_defn); + LNK_SectionDefinition *main_defn = hash_table_search_string_raw(task.u.gather_sects.defns[0], name_with_flags); if (main_defn == 0) { main_defn = sect_defns[defn_idx]; hash_table_push_string_raw(arena->v[0], task.u.gather_sects.defns[0], name_with_flags, main_defn); @@ -3891,8 +3885,7 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT } String8 defn_name_with_flags = lnk_make_name_with_flags(sectab->arena, sect_defn->name, sect_defn->flags); - LNK_SectionContribChunk *contrib_chunk = 0; - hash_table_search_string_raw(task.contribs_ht, defn_name_with_flags, &contrib_chunk); + LNK_SectionContribChunk *contrib_chunk = hash_table_search_string_raw(task.contribs_ht, defn_name_with_flags); if (!contrib_chunk) { contrib_chunk = lnk_section_contrib_chunk_list_push_chunk(arena->v[0], §->contribs, sect_defn->contribs_count, sort_idx); hash_table_push_string_raw(sectab->arena, task.contribs_ht, defn_name_with_flags, contrib_chunk); diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 5f16fb56..79a413a4 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -148,10 +148,6 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_Rad_SharedThreadPool, 0, "RAD_SHARED_THREAD_POOL", "[:STRING]", "Default value \"" LNK_DEFAULT_THREAD_POOL_NAME "\"" }, { LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, 0, "RAD_SHARED_THREAD_POOL_MAX_WORKERS", ":#", "Sets maximum number of workers in a thread pool." }, { LNK_CmdSwitch_Rad_SuppressError, 0, "RAD_SUPPRESS_ERROR", ":#", "" }, - { LNK_CmdSwitch_Rad_SymbolTableCapDefined, 0, "RAD_SYMBOL_TABLE_CAP_DEFINED", ":#", "Number of buckets allocated in the symbol table for defined symbols." }, - { LNK_CmdSwitch_Rad_SymbolTableCapInternal, 0, "RAD_SYMBOL_TABLE_CAP_INTERNAL", ":#", "Number of buckets allocated in the symbol table for internal symbols." }, - { LNK_CmdSwitch_Rad_SymbolTableCapLib, 0, "RAD_SYMBOL_TABLE_CAP_LIB", ":#", "Number of buckets allocated in the symbol table for library symbols." }, - { LNK_CmdSwitch_Rad_SymbolTableCapWeak, 0, "RAD_SYMBOL_TABLE_CAP_WEAK", ":#", "Number of buckets allocated in the symbol table for weak symbols." }, { LNK_CmdSwitch_Rad_TargetOs, 0, "RAD_TARGET_OS", ":{WINDOWS,LINUX,MAC}" }, { LNK_CmdSwitch_Rad_WriteTempFiles, 0, "RAD_WRITE_TEMP_FILES", "[:NO]", "When speicifed linker writes image and debug info to temporary files and renames after link is done." }, { LNK_CmdSwitch_Rad_TimeStamp, 0, "RAD_TIME_STAMP", ":#", "Time stamp embeded in EXE and PDB." }, @@ -741,16 +737,6 @@ lnk_parse_export_directive(Arena *arena, String8 directive, LNK_Obj *obj, PE_Exp return is_parsed; } -internal LNK_MergeDirectiveNode * -lnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_MergeDirective data) -{ - LNK_MergeDirectiveNode *node = push_array_no_zero(arena, LNK_MergeDirectiveNode, 1); - node->data = data; - SLLQueuePush(list->first, list->last, node); - list->count += 1; - return node; -} - internal B32 lnk_parse_merge_directive(String8 string, LNK_Obj *obj, LNK_MergeDirective *out) { @@ -768,6 +754,26 @@ lnk_parse_merge_directive(String8 string, LNK_Obj *obj, LNK_MergeDirective *out) return is_parse_ok; } +internal LNK_AltNameNode * +lnk_alt_name_list_push(Arena *arena, LNK_AltNameList *list, LNK_AltName v) +{ + LNK_AltNameNode *node = push_array(arena, LNK_AltNameNode, 1); + node->v = v; + SLLQueuePush(list->first, list->last, node); + list->count += 1; + return node; +} + +internal LNK_MergeDirectiveNode * +lnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_MergeDirective v) +{ + LNK_MergeDirectiveNode *node = push_array_no_zero(arena, LNK_MergeDirectiveNode, 1); + node->v = v; + SLLQueuePush(list->first, list->last, node); + list->count += 1; + return node; +} + internal String8 lnk_get_image_name(LNK_Config *config) { @@ -979,7 +985,7 @@ internal void lnk_include_symbol(LNK_Config *config, String8 name, LNK_Obj *obj) { // is this a duplicate symbol? - if (hash_table_search_string_raw(config->include_symbol_ht, name, 0)) { + if (hash_table_search_string_raw(config->include_symbol_ht, name)) { return; } @@ -1165,12 +1171,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List alt_name.from = push_str8_copy(config->arena, alt_name.from); alt_name.to = push_str8_copy(config->arena, alt_name.to); - LNK_AltNameNode *alt_name_n = push_array(config->arena, LNK_AltNameNode, 1); - alt_name_n->data = alt_name; - - SLLQueuePush(config->alt_name_list.first, config->alt_name_list.last, alt_name_n); - config->alt_name_list.count += 1; - + lnk_alt_name_list_push(config->arena, &config->alt_name_list, alt_name); hash_table_push_string_string(config->arena, config->alt_name_ht, alt_name.from, alt_name.to); } } @@ -1292,9 +1293,8 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List case LNK_CmdSwitch_Export: { PE_ExportParse export_parse = {0}; if (lnk_parse_export_directive_ex(config->arena, value_strings, obj, &export_parse)) { - PE_ExportParseNode *exp_n = 0; - String8 export_name = pe_name_from_export_parse(&export_parse); - hash_table_search_string_raw(config->export_ht, export_name, &exp_n); + String8 export_name = pe_name_from_export_parse(&export_parse); + PE_ExportParseNode *exp_n = hash_table_search_string_raw(config->export_ht, export_name); if (exp_n == 0) { // make sure export is defined @@ -1983,19 +1983,6 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } break; - case LNK_CmdSwitch_Rad_SymbolTableCapDefined: { - lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->symbol_table_cap_defined, 0); - } break; - case LNK_CmdSwitch_Rad_SymbolTableCapInternal: { - lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->symbol_table_cap_internal, 0); - } break; - case LNK_CmdSwitch_Rad_SymbolTableCapWeak: { - lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->symbol_table_cap_weak, 0); - } break; - case LNK_CmdSwitch_Rad_SymbolTableCapLib: { - lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->symbol_table_cap_lib, 0); - } break; - case LNK_CmdSwitch_Rad_TargetOs: { if (value_strings.node_count == 1) { String8 os_string = str8_list_first(&value_strings); diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 7c90df99..780a2e12 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -176,10 +176,6 @@ typedef enum LNK_CmdSwitch_Rad_SharedThreadPool, LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, LNK_CmdSwitch_Rad_SuppressError, - LNK_CmdSwitch_Rad_SymbolTableCapDefined, - LNK_CmdSwitch_Rad_SymbolTableCapInternal, - LNK_CmdSwitch_Rad_SymbolTableCapLib, - LNK_CmdSwitch_Rad_SymbolTableCapWeak, LNK_CmdSwitch_Rad_TargetOs, LNK_CmdSwitch_Rad_TimeStamp, LNK_CmdSwitch_Rad_Version, @@ -278,7 +274,7 @@ typedef struct LNK_AltName typedef struct LNK_AltNameNode { struct LNK_AltNameNode *next; - LNK_AltName data; + LNK_AltName v; } LNK_AltNameNode; typedef struct LNK_AltNameList @@ -297,7 +293,7 @@ typedef struct LNK_MergeDirective typedef struct LNK_MergeDirectiveNode { struct LNK_MergeDirectiveNode *next; - LNK_MergeDirective data; + LNK_MergeDirective v; } LNK_MergeDirectiveNode; typedef struct LNK_MergeDirectiveList @@ -397,10 +393,6 @@ typedef struct LNK_Config LNK_IncludeSymbolList include_symbol_list; LNK_AltNameList alt_name_list; LNK_MergeDirectiveList merge_list; - U64 symbol_table_cap_defined; - U64 symbol_table_cap_internal; - U64 symbol_table_cap_weak; - U64 symbol_table_cap_lib; U64 data_dir_count; B32 build_imp_lib; B32 build_exp; @@ -588,8 +580,8 @@ internal B32 lnk_parse_merge_directive (String8 string, struct LNK_Obj *obj, internal B32 lnk_parse_export_directive (Arena *arena, String8 directive, struct LNK_Obj *obj, PE_ExportParse *export_out); internal B32 lnk_parse_export_directive_ex(Arena *arena, String8List directive, struct LNK_Obj *obj, PE_ExportParse *export_out); -internal LNK_AltNameNode * lnk_alt_name_list_push(Arena *arena, LNK_AltNameList *list, LNK_AltName data); -internal LNK_MergeDirectiveNode * lnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_MergeDirective data); +internal LNK_AltNameNode * lnk_alt_name_list_push(Arena *arena, LNK_AltNameList *list, LNK_AltName v); +internal LNK_MergeDirectiveNode * lnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_MergeDirective v); // --- Getters ----------------------------------------------------------------- diff --git a/src/linker/lnk_section_table.c b/src/linker/lnk_section_table.c index 5db94bae..c37d906f 100644 --- a/src/linker/lnk_section_table.c +++ b/src/linker/lnk_section_table.c @@ -178,8 +178,7 @@ lnk_section_table_search(LNK_SectionTable *sectab, String8 full_or_partial_name, coff_parse_section_name(full_or_partial_name, &name, &postfix); String8 name_with_flags = lnk_make_name_with_flags(scratch.arena, name, flags); - LNK_Section *section = 0; - hash_table_search_string_raw(sectab->sect_ht, name_with_flags, §ion); + LNK_Section *section = hash_table_search_string_raw(sectab->sect_ht, name_with_flags); scratch_end(scratch); return section; @@ -222,7 +221,7 @@ lnk_section_table_merge(LNK_SectionTable *sectab, LNK_MergeDirectiveList merge_l Temp scratch = scratch_begin(0, 0); for (LNK_MergeDirectiveNode *merge_node = merge_list.first; merge_node != 0; merge_node = merge_node->next) { - LNK_MergeDirective *merge = &merge_node->data; + LNK_MergeDirective *merge = &merge_node->v; // guard against illegal merges { @@ -242,19 +241,18 @@ lnk_section_table_merge(LNK_SectionTable *sectab, LNK_MergeDirectiveList merge_l // guard against circular merges { - if (str8_match(merge_node->data.dst, merge_node->data.src, 0)) { - lnk_error(LNK_Error_CircularMerge, "detected circular /MERGE:%S=%S", merge_node->data.src, merge_node->data.dst); + if (str8_match(merge_node->v.dst, merge_node->v.src, 0)) { + lnk_error(LNK_Error_CircularMerge, "detected circular /MERGE:%S=%S", merge_node->v.src, merge_node->v.dst); } for (LNK_SectionNode *sect_n = sectab->merge_list.first; sect_n != 0; sect_n = sect_n->next) { - if (str8_match(sect_n->data.name, merge_node->data.dst, 0)) { - lnk_error(LNK_Error_CircularMerge, "detected circular /MERGE:%S=%S", merge_node->data.src, merge_node->data.dst); + if (str8_match(sect_n->data.name, merge_node->v.dst, 0)) { + lnk_error(LNK_Error_CircularMerge, "detected circular /MERGE:%S=%S", merge_node->v.src, merge_node->v.dst); } } } // are we trying to merge section that was already merged? - LNK_Section *merge_sect = 0; - hash_table_search_string_raw(sectab->sect_ht, merge->src, &merge_sect); + LNK_Section *merge_sect = hash_table_search_string_raw(sectab->sect_ht, merge->src); if (merge_sect && merge_sect->merge_dst) { LNK_Section *dst = merge_sect->merge_dst; B32 is_ambiguous_merge = !str8_match(dst->name, merge->dst, 0);