From 0aadf60359d4e69f14dc27e30e3eb0c4ff383d18 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 19 Jun 2025 15:26:40 -0700 Subject: [PATCH] update code block dividers --- src/linker/lnk.c | 27 +++-------- src/linker/lnk_debug_info.c | 16 ------ src/linker/lnk_debug_info.h | 27 +++++------ src/linker/lnk_io.c | 18 +++---- src/linker/lnk_io.h | 9 +--- src/linker/lnk_lib.h | 4 -- src/linker/lnk_symbol_table.c | 91 ++++++++++++++++------------------- src/linker/lnk_symbol_table.h | 35 +++++--------- 8 files changed, 79 insertions(+), 148 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index bc70f354..aa95ce58 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1,18 +1,16 @@ // Copyright (c) 2025 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -//////////////////////////////// -// Build Options +// --- Build Options ----------------------------------------------------------- #define BUILD_CONSOLE_INTERFACE 1 #define BUILD_TITLE "Epic Games Tools (R) RAD PE/COFF Linker" -//////////////////////////////// +// --- Arena ------------------------------------------------------------------- #define ARENA_FREE_LIST 1 -//////////////////////////////// -// Third Party +// --- Third Party ------------------------------------------------------------- #include "base_ext/base_blake3.h" #include "base_ext/base_blake3.c" @@ -22,8 +20,7 @@ #include "third_party/xxHash/xxhash.h" #include "third_party/radsort/radsort.h" -//////////////////////////////// -// Code Base +// --- Code Base --------------------------------------------------------------- #if defined(__clang__) # pragma clang diagnostic push @@ -78,8 +75,7 @@ # pragma clang diagnostic pop #endif -//////////////////////////////// -// RDI +// --- RDI --------------------------------------------------------------------- #include "rdi/rdi_overrides.h" #include "lib_rdi_format/rdi_format.h" @@ -87,8 +83,7 @@ #include "lib_rdi_format/rdi_format.c" #include "rdi/rdi.c" -//////////////////////////////// -// Code Base Extensions +// --- Code Base Extensions ---------------------------------------------------- #include "base_ext/base_inc.h" #include "thread_pool/thread_pool.h" @@ -106,8 +101,7 @@ #include "pdb_ext/pdb_helpers.c" #include "pdb_ext/pdb_builder.c" -//////////////////////////////// -// RDI Builder +// --- RDI Builder ------------------------------------------------------------- #include "rdi/rdi_builder.h" #include "rdi/rdi_coff.h" @@ -117,8 +111,7 @@ #include "rdi/rdi_coff.c" #include "rdi/rdi_cv.c" -//////////////////////////////// -// Linker +// --- Linker ------------------------------------------------------------------ #include "lnk_error.h" #include "lnk_log.h" @@ -149,12 +142,8 @@ #include "lnk_lib.c" #include "lnk_debug_info.c" -//////////////////////////////// - global read_only LNK_SectionContrib g_null_sc; -//////////////////////////////// - internal LNK_Config * lnk_config_from_argcv(Arena *arena, int argc, char **argv) { diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index ec930b22..f19dff44 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1,8 +1,6 @@ // Copyright (c) 2025 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -//////////////////////////////// - internal THREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task) { @@ -802,10 +800,6 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla return cv; } -//////////////////////////////// -// Leaf Deduper - - internal LNK_LeafRef lnk_leaf_ref(U32 enc_loc_idx, U32 enc_leaf_idx) { @@ -1451,8 +1445,6 @@ lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_ return match; } -//////////////////////////////// - internal THREAD_POOL_TASK_FUNC(lnk_count_per_source_leaf_task) { @@ -2674,9 +2666,6 @@ lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, CV_DebugT de ProfEnd(); } -//////////////////////////////// -// PDB Builder - internal THREAD_POOL_TASK_FUNC(lnk_filter_out_gsi_symbols_task) { @@ -3034,8 +3023,6 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) } } -//////////////////////////////// - internal THREAD_POOL_TASK_FUNC(lnk_build_pdb_public_symbols_defined_task) { @@ -3369,9 +3356,6 @@ lnk_build_pdb(TP_Context *tp, return page_data_list; } -//////////////////////////////// -// RAD Debug Info - internal U64 lnk_udt_name_hash_table_hash(String8 string) { diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 43e208be..36ff5923 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -3,7 +3,7 @@ #pragma once -//////////////////////////////// +// --- Code View Input --------------------------------------------------------- typedef struct LNK_PchInfo { @@ -60,7 +60,7 @@ typedef struct LNK_CodeViewInput Rng1U64 external_obj_range; } LNK_CodeViewInput; -//////////////////////////////// +// --- Leaf Ref ---------------------------------------------------------------- typedef enum { @@ -118,7 +118,7 @@ typedef union U128Array **v[CV_TypeIndexSource_COUNT]; } LNK_LeafHashes; -//////////////////////////////// +// --- Symbol Parsing Tasks ---------------------------------------------------- typedef struct { @@ -155,7 +155,7 @@ typedef struct B8 *is_corrupted; } LNK_GetExternalLeavesTask; -//////////////////////////////// +// --- Leaf Deduping Tasks ----------------------------------------------------- typedef struct { @@ -261,7 +261,7 @@ typedef struct Arena **fixed_arena_arr; } LNK_PatchLeavesTask; -//////////////////////////////// +// --- Code View Processing Trasks --------------------------------------------- typedef struct { @@ -378,8 +378,7 @@ typedef struct String8List *maps; } LNK_TypeNameReplacer; -//////////////////////////////// -// RAD Debug Info +// --- RAD Debug Info ---------------------------------------------------------- typedef struct { @@ -405,7 +404,7 @@ typedef struct CV_TypeIndex *fwdmap; } LNK_BuildUDTFwdMapTask; -//////////////////////////////// +// --- RDI Conversion Tasks ---------------------------------------------------- typedef struct { @@ -492,8 +491,7 @@ typedef struct RDIB_LineTableChunkList *line_tables; } LNK_ConvertUnitToRDITask; -//////////////////////////////// -// CodeView +// --- CodeView ---------------------------------------------------------------- internal CV_DebugS * lnk_parse_debug_s_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *sect_list_arr); internal CV_DebugT * lnk_parse_debug_t_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *debug_t_list_arr); @@ -536,8 +534,7 @@ internal CV_DebugT * lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, internal void lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name); -//////////////////////////////// -// RAD Debug info +// --- RAD Debug info ---------------------------------------------------------- internal U64 lnk_udt_name_hash_table_hash(String8 string); internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, U64 *buckets_cap_out); @@ -563,8 +560,7 @@ internal String8List lnk_build_rad_debug_info(TP_Context *tp, CV_SymbolListArray *parsed_symbols, CV_DebugT types[CV_TypeIndexSource_COUNT]); -//////////////////////////////// -// PDB +// --- PDB --------------------------------------------------------------------- internal LNK_ProcessedCodeViewC11Data lnk_process_c11_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr); internal LNK_ProcessedCodeViewC13Data lnk_process_c13_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr); @@ -586,8 +582,7 @@ internal String8List lnk_build_pdb(TP_Context *tp, CV_SymbolListArray *parsed_symbols, CV_DebugT types[CV_TypeIndexSource_COUNT]); -//////////////////////////////// -// RAD Debug Info +// --- RAD Debug Info ---------------------------------------------------------- internal U64 lnk_udt_name_hash_table_hash(String8 string); internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, U64 *buckets_cap_out); diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c index bb67b134..1ff236be 100644 --- a/src/linker/lnk_io.c +++ b/src/linker/lnk_io.c @@ -1,6 +1,3 @@ -//////////////////////////////// -// Shared File API - shared_function int lnk_open_file_read(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max) { @@ -51,8 +48,6 @@ lnk_write_file(void *raw_handle, uint64_t offset, void *buffer, uint64_t buffer_ return write_size; } -//////////////////////////////// - internal String8List lnk_file_search(Arena *arena, String8List dir_list, String8 file_path) { @@ -104,7 +99,7 @@ internal OS_Handle lnk_file_open_with_rename_permissions(String8 path) { OS_Handle file_handle = os_handle_zero(); -#if _WIN32 +#if OS_WINDOWS Temp scratch = scratch_begin(0,0); // open file with permissions to rename @@ -123,7 +118,7 @@ lnk_file_open_with_rename_permissions(String8 path) scratch_end(scratch); #else -#error "TODO: file rename" +# error "TODO: file rename" #endif return file_handle; } @@ -131,12 +126,12 @@ lnk_file_open_with_rename_permissions(String8 path) internal B32 lnk_file_set_delete_on_close(OS_Handle handle, B32 delete_file) { -#if _WIN32 +#if OS_WINDOWS FILE_DISPOSITION_INFO file_disposition = {0}; file_disposition.DeleteFile = (BOOL)delete_file; B32 is_set = SetFileInformationByHandle((HANDLE)handle.u64[0], FileDispositionInfo, &file_disposition, sizeof(file_disposition)); #else -#error "TODO: file rename" +# error "TODO: file rename" #endif return is_set; } @@ -145,7 +140,7 @@ internal B32 lnk_file_rename(OS_Handle handle, String8 new_name) { Temp scratch = scratch_begin(0,0); -#if _WIN32 +#if OS_WINDOWS String16 new_name16 = str16_from_8(scratch.arena, new_name); U64 file_rename_info_size = sizeof(FILE_RENAME_INFO); @@ -218,7 +213,7 @@ internal THREAD_POOL_TASK_FUNC(lnk_memory_map_file_task) { LNK_DiskReader *task = raw_task; -#if _WIN32 +#if OS_WINDOWS Temp scratch = scratch_begin(&arena, 1); String16 path16 = str16_from_8(scratch.arena, task->path_arr.v[task_id]); HANDLE file_handle = CreateFileW(path16.str, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); @@ -376,4 +371,3 @@ lnk_write_data_to_file_path(String8 path, String8 temp_path, String8 data) scratch_end(scratch); } - diff --git a/src/linker/lnk_io.h b/src/linker/lnk_io.h index 9ff2a085..3e1b1705 100644 --- a/src/linker/lnk_io.h +++ b/src/linker/lnk_io.h @@ -1,15 +1,11 @@ #pragma once -//////////////////////////////// - typedef U32 LNK_IO_Flags; enum { LNK_IO_Flags_MemoryMapFiles = (1 << 0), }; -//////////////////////////////// - typedef struct { LNK_IO_Flags io_flags; @@ -21,8 +17,7 @@ typedef struct U8 *buffer; } LNK_DiskReader; -//////////////////////////////// -// Shared File API +// --- Shared File API --------------------------------------------------------- shared_function int lnk_open_file_read(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max); shared_function int lnk_open_file_write(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max); @@ -31,7 +26,7 @@ shared_function uint64_t lnk_size_from_file(void *raw_handle); shared_function uint64_t lnk_read_file(void *raw_handle, void *buffer, uint64_t buffer_max); shared_function uint64_t lnk_write_file(void *raw_handle, uint64_t offset, void *buffer, uint64_t buffer_size); -//////////////////////////////// +// --- IO Functions ------------------------------------------------------------ internal String8List lnk_file_search(Arena *arena, String8List dir_list, String8 file_path); diff --git a/src/linker/lnk_lib.h b/src/linker/lnk_lib.h index c15d0687..daff7528 100644 --- a/src/linker/lnk_lib.h +++ b/src/linker/lnk_lib.h @@ -34,8 +34,6 @@ typedef struct LNK_LibList struct LNK_LibNode *last; } LNK_LibList; -//////////////////////////////// - typedef struct { LNK_LibNode *node_arr; @@ -44,8 +42,6 @@ typedef struct U64 base_input_idx; } LNK_LibIniter; -//////////////////////////////// - internal LNK_Lib lnk_lib_from_data(Arena *arena, String8 data, String8 path); internal LNK_LibNodeArray lnk_lib_list_push_parallel(TP_Context *tp, TP_Arena *arena, LNK_LibList *list, String8Array data_arr, String8Array path_arr); diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c index 537c7539..6dd393c4 100644 --- a/src/linker/lnk_symbol_table.c +++ b/src/linker/lnk_symbol_table.c @@ -1,8 +1,6 @@ // Copyright (c) 2025 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -//////////////////////////////// - internal LNK_Symbol * lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx) { @@ -45,8 +43,6 @@ lnk_make_import_symbol(Arena *arena, String8 name, String8 import_header) return symbol; } -//////////////////////////////// - internal void lnk_symbol_list_push_node(LNK_SymbolList *list, LNK_SymbolNode *node) { @@ -107,50 +103,6 @@ lnk_symbol_array_from_list(Arena *arena, LNK_SymbolList list) return arr; } -//////////////////////////////// - -internal ISectOff -lnk_sc_from_symbol(LNK_Symbol *symbol) -{ - COFF_ParsedSymbol parsed_symbol = lnk_parsed_symbol_from_coff_symbol_idx(symbol->u.defined.obj, symbol->u.defined.symbol_idx); - - 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; -} - -//////////////////////////////// - internal LNK_SymbolHashTrie * lnk_symbol_hash_trie_chunk_list_push(Arena *arena, LNK_SymbolHashTrieChunkList *list, U64 cap) { @@ -498,8 +450,6 @@ lnk_symbol_hash_trie_remove(LNK_SymbolHashTrie *trie) ins_atomic_ptr_eval_assign(&trie->symbol, 0); } -//////////////////////////////// - internal U64 lnk_symbol_hash(String8 string) { @@ -607,3 +557,44 @@ lnk_symbol_table_push_alt_name(LNK_SymbolTable *symtab, LNK_Obj *obj, String8 fr } } +internal ISectOff +lnk_sc_from_symbol(LNK_Symbol *symbol) +{ + COFF_ParsedSymbol parsed_symbol = lnk_parsed_symbol_from_coff_symbol_idx(symbol->u.defined.obj, symbol->u.defined.symbol_idx); + + 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 5c5ee11b..80f11b3a 100644 --- a/src/linker/lnk_symbol_table.h +++ b/src/linker/lnk_symbol_table.h @@ -3,8 +3,6 @@ #pragma once -//////////////////////////////// - typedef enum { LNK_Symbol_Null, @@ -111,24 +109,14 @@ typedef struct LNK_SymbolTable HashTable *alt_names; } LNK_SymbolTable; -//////////////////////////////// -// parallel for wrappers - -typedef struct -{ - LNK_SymbolTable *symtab; - Rng1U64 *ranges; - LNK_Symbol *arr; -} LNK_LazySymbolInserter; - -//////////////////////////////// +// --- Symbol Make ------------------------------------------------------------- internal LNK_Symbol * lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx); internal LNK_Symbol * lnk_make_lib_symbol(Arena *arena, String8 name, struct LNK_Lib *lib, U64 member_offset); internal LNK_Symbol * lnk_make_undefined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj); internal LNK_Symbol * lnk_make_import_symbol(Arena *arena, String8 name, String8 import_header); -//////////////////////////////// +// --- Symbol 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); @@ -137,21 +125,13 @@ internal LNK_SymbolList lnk_symbol_list_from_array(Arena *arena, LNK_Symbol 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 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); - -//////////////////////////////// +// --- Symbol Hash Trie -------------------------------------------------------- internal void lnk_symbol_hash_trie_insert_or_replace(Arena *arena, LNK_SymbolHashTrieChunkList *chunks, LNK_SymbolHashTrie **trie, U64 hash, LNK_Symbol *symbol); internal LNK_SymbolHashTrie * lnk_symbol_hash_trie_search(LNK_SymbolHashTrie *trie, U64 hash, String8 name); internal void lnk_symbol_hash_trie_remove(LNK_SymbolHashTrie *trie); -//////////////////////////////// +// --- Symbol Table ------------------------------------------------------------ internal U64 lnk_symbol_hash(String8 string); @@ -165,3 +145,10 @@ internal void lnk_symbol_table_remove(LNK_SymbolTable *symtab, LNK_ internal void lnk_symbol_table_push_alt_name(LNK_SymbolTable *symtab, struct LNK_Obj *obj, String8 from, String8 to); +// --- 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);