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);