update code block dividers

This commit is contained in:
Nikita Smith
2025-06-19 15:26:40 -07:00
committed by Ryan Fleury
parent 46663688e2
commit 0aadf60359
8 changed files with 79 additions and 148 deletions
+8 -19
View File
@@ -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)
{
-16
View File
@@ -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)
{
+11 -16
View File
@@ -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);
+6 -12
View File
@@ -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);
}
+2 -7
View File
@@ -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);
-4
View File
@@ -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);
+41 -50
View File
@@ -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;
}
+11 -24
View File
@@ -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);