update code block dividers

This commit is contained in:
Nikita Smith
2025-06-25 10:53:24 -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 // Copyright (c) 2025 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
//////////////////////////////// // --- Build Options -----------------------------------------------------------
// Build Options
#define BUILD_CONSOLE_INTERFACE 1 #define BUILD_CONSOLE_INTERFACE 1
#define BUILD_TITLE "Epic Games Tools (R) RAD PE/COFF Linker" #define BUILD_TITLE "Epic Games Tools (R) RAD PE/COFF Linker"
//////////////////////////////// // --- Arena -------------------------------------------------------------------
#define ARENA_FREE_LIST 1 #define ARENA_FREE_LIST 1
//////////////////////////////// // --- Third Party -------------------------------------------------------------
// Third Party
#include "base_ext/base_blake3.h" #include "base_ext/base_blake3.h"
#include "base_ext/base_blake3.c" #include "base_ext/base_blake3.c"
@@ -22,8 +20,7 @@
#include "third_party/xxHash/xxhash.h" #include "third_party/xxHash/xxhash.h"
#include "third_party/radsort/radsort.h" #include "third_party/radsort/radsort.h"
//////////////////////////////// // --- Code Base ---------------------------------------------------------------
// Code Base
#if defined(__clang__) #if defined(__clang__)
# pragma clang diagnostic push # pragma clang diagnostic push
@@ -78,8 +75,7 @@
# pragma clang diagnostic pop # pragma clang diagnostic pop
#endif #endif
//////////////////////////////// // --- RDI ---------------------------------------------------------------------
// RDI
#include "rdi/rdi_overrides.h" #include "rdi/rdi_overrides.h"
#include "lib_rdi_format/rdi_format.h" #include "lib_rdi_format/rdi_format.h"
@@ -87,8 +83,7 @@
#include "lib_rdi_format/rdi_format.c" #include "lib_rdi_format/rdi_format.c"
#include "rdi/rdi.c" #include "rdi/rdi.c"
//////////////////////////////// // --- Code Base Extensions ----------------------------------------------------
// Code Base Extensions
#include "base_ext/base_inc.h" #include "base_ext/base_inc.h"
#include "thread_pool/thread_pool.h" #include "thread_pool/thread_pool.h"
@@ -106,8 +101,7 @@
#include "pdb_ext/pdb_helpers.c" #include "pdb_ext/pdb_helpers.c"
#include "pdb_ext/pdb_builder.c" #include "pdb_ext/pdb_builder.c"
//////////////////////////////// // --- RDI Builder -------------------------------------------------------------
// RDI Builder
#include "rdi/rdi_builder.h" #include "rdi/rdi_builder.h"
#include "rdi/rdi_coff.h" #include "rdi/rdi_coff.h"
@@ -117,8 +111,7 @@
#include "rdi/rdi_coff.c" #include "rdi/rdi_coff.c"
#include "rdi/rdi_cv.c" #include "rdi/rdi_cv.c"
//////////////////////////////// // --- Linker ------------------------------------------------------------------
// Linker
#include "lnk_error.h" #include "lnk_error.h"
#include "lnk_log.h" #include "lnk_log.h"
@@ -149,12 +142,8 @@
#include "lnk_lib.c" #include "lnk_lib.c"
#include "lnk_debug_info.c" #include "lnk_debug_info.c"
////////////////////////////////
global read_only LNK_SectionContrib g_null_sc; global read_only LNK_SectionContrib g_null_sc;
////////////////////////////////
internal LNK_Config * internal LNK_Config *
lnk_config_from_argcv(Arena *arena, int argc, char **argv) lnk_config_from_argcv(Arena *arena, int argc, char **argv)
{ {
-16
View File
@@ -1,8 +1,6 @@
// Copyright (c) 2025 Epic Games Tools // Copyright (c) 2025 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
////////////////////////////////
internal internal
THREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task) 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; return cv;
} }
////////////////////////////////
// Leaf Deduper
internal LNK_LeafRef internal LNK_LeafRef
lnk_leaf_ref(U32 enc_loc_idx, U32 enc_leaf_idx) 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; return match;
} }
////////////////////////////////
internal internal
THREAD_POOL_TASK_FUNC(lnk_count_per_source_leaf_task) 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(); ProfEnd();
} }
////////////////////////////////
// PDB Builder
internal internal
THREAD_POOL_TASK_FUNC(lnk_filter_out_gsi_symbols_task) 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 internal
THREAD_POOL_TASK_FUNC(lnk_build_pdb_public_symbols_defined_task) 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; return page_data_list;
} }
////////////////////////////////
// RAD Debug Info
internal U64 internal U64
lnk_udt_name_hash_table_hash(String8 string) lnk_udt_name_hash_table_hash(String8 string)
{ {
+11 -16
View File
@@ -3,7 +3,7 @@
#pragma once #pragma once
//////////////////////////////// // --- Code View Input ---------------------------------------------------------
typedef struct LNK_PchInfo typedef struct LNK_PchInfo
{ {
@@ -60,7 +60,7 @@ typedef struct LNK_CodeViewInput
Rng1U64 external_obj_range; Rng1U64 external_obj_range;
} LNK_CodeViewInput; } LNK_CodeViewInput;
//////////////////////////////// // --- Leaf Ref ----------------------------------------------------------------
typedef enum typedef enum
{ {
@@ -118,7 +118,7 @@ typedef union
U128Array **v[CV_TypeIndexSource_COUNT]; U128Array **v[CV_TypeIndexSource_COUNT];
} LNK_LeafHashes; } LNK_LeafHashes;
//////////////////////////////// // --- Symbol Parsing Tasks ----------------------------------------------------
typedef struct typedef struct
{ {
@@ -155,7 +155,7 @@ typedef struct
B8 *is_corrupted; B8 *is_corrupted;
} LNK_GetExternalLeavesTask; } LNK_GetExternalLeavesTask;
//////////////////////////////// // --- Leaf Deduping Tasks -----------------------------------------------------
typedef struct typedef struct
{ {
@@ -261,7 +261,7 @@ typedef struct
Arena **fixed_arena_arr; Arena **fixed_arena_arr;
} LNK_PatchLeavesTask; } LNK_PatchLeavesTask;
//////////////////////////////// // --- Code View Processing Trasks ---------------------------------------------
typedef struct typedef struct
{ {
@@ -378,8 +378,7 @@ typedef struct
String8List *maps; String8List *maps;
} LNK_TypeNameReplacer; } LNK_TypeNameReplacer;
//////////////////////////////// // --- RAD Debug Info ----------------------------------------------------------
// RAD Debug Info
typedef struct typedef struct
{ {
@@ -405,7 +404,7 @@ typedef struct
CV_TypeIndex *fwdmap; CV_TypeIndex *fwdmap;
} LNK_BuildUDTFwdMapTask; } LNK_BuildUDTFwdMapTask;
//////////////////////////////// // --- RDI Conversion Tasks ----------------------------------------------------
typedef struct typedef struct
{ {
@@ -492,8 +491,7 @@ typedef struct
RDIB_LineTableChunkList *line_tables; RDIB_LineTableChunkList *line_tables;
} LNK_ConvertUnitToRDITask; } 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_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); 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); 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 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); 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_SymbolListArray *parsed_symbols,
CV_DebugT types[CV_TypeIndexSource_COUNT]); 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_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); 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_SymbolListArray *parsed_symbols,
CV_DebugT types[CV_TypeIndexSource_COUNT]); CV_DebugT types[CV_TypeIndexSource_COUNT]);
//////////////////////////////// // --- RAD Debug Info ----------------------------------------------------------
// RAD Debug Info
internal U64 lnk_udt_name_hash_table_hash(String8 string); 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); 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 shared_function int
lnk_open_file_read(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max) 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; return write_size;
} }
////////////////////////////////
internal String8List internal String8List
lnk_file_search(Arena *arena, String8List dir_list, String8 file_path) 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) lnk_file_open_with_rename_permissions(String8 path)
{ {
OS_Handle file_handle = os_handle_zero(); OS_Handle file_handle = os_handle_zero();
#if _WIN32 #if OS_WINDOWS
Temp scratch = scratch_begin(0,0); Temp scratch = scratch_begin(0,0);
// open file with permissions to rename // open file with permissions to rename
@@ -123,7 +118,7 @@ lnk_file_open_with_rename_permissions(String8 path)
scratch_end(scratch); scratch_end(scratch);
#else #else
#error "TODO: file rename" # error "TODO: file rename"
#endif #endif
return file_handle; return file_handle;
} }
@@ -131,12 +126,12 @@ lnk_file_open_with_rename_permissions(String8 path)
internal B32 internal B32
lnk_file_set_delete_on_close(OS_Handle handle, B32 delete_file) 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_INFO file_disposition = {0};
file_disposition.DeleteFile = (BOOL)delete_file; file_disposition.DeleteFile = (BOOL)delete_file;
B32 is_set = SetFileInformationByHandle((HANDLE)handle.u64[0], FileDispositionInfo, &file_disposition, sizeof(file_disposition)); B32 is_set = SetFileInformationByHandle((HANDLE)handle.u64[0], FileDispositionInfo, &file_disposition, sizeof(file_disposition));
#else #else
#error "TODO: file rename" # error "TODO: file rename"
#endif #endif
return is_set; return is_set;
} }
@@ -145,7 +140,7 @@ internal B32
lnk_file_rename(OS_Handle handle, String8 new_name) lnk_file_rename(OS_Handle handle, String8 new_name)
{ {
Temp scratch = scratch_begin(0,0); Temp scratch = scratch_begin(0,0);
#if _WIN32 #if OS_WINDOWS
String16 new_name16 = str16_from_8(scratch.arena, new_name); String16 new_name16 = str16_from_8(scratch.arena, new_name);
U64 file_rename_info_size = sizeof(FILE_RENAME_INFO); U64 file_rename_info_size = sizeof(FILE_RENAME_INFO);
@@ -218,7 +213,7 @@ internal
THREAD_POOL_TASK_FUNC(lnk_memory_map_file_task) THREAD_POOL_TASK_FUNC(lnk_memory_map_file_task)
{ {
LNK_DiskReader *task = raw_task; LNK_DiskReader *task = raw_task;
#if _WIN32 #if OS_WINDOWS
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
String16 path16 = str16_from_8(scratch.arena, task->path_arr.v[task_id]); 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); 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); scratch_end(scratch);
} }
+2 -7
View File
@@ -1,15 +1,11 @@
#pragma once #pragma once
////////////////////////////////
typedef U32 LNK_IO_Flags; typedef U32 LNK_IO_Flags;
enum enum
{ {
LNK_IO_Flags_MemoryMapFiles = (1 << 0), LNK_IO_Flags_MemoryMapFiles = (1 << 0),
}; };
////////////////////////////////
typedef struct typedef struct
{ {
LNK_IO_Flags io_flags; LNK_IO_Flags io_flags;
@@ -21,8 +17,7 @@ typedef struct
U8 *buffer; U8 *buffer;
} LNK_DiskReader; } 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_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); 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_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); 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); 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; struct LNK_LibNode *last;
} LNK_LibList; } LNK_LibList;
////////////////////////////////
typedef struct typedef struct
{ {
LNK_LibNode *node_arr; LNK_LibNode *node_arr;
@@ -44,8 +42,6 @@ typedef struct
U64 base_input_idx; U64 base_input_idx;
} LNK_LibIniter; } LNK_LibIniter;
////////////////////////////////
internal LNK_Lib lnk_lib_from_data(Arena *arena, String8 data, String8 path); 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); 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 // Copyright (c) 2025 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
////////////////////////////////
internal LNK_Symbol * internal LNK_Symbol *
lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx) 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; return symbol;
} }
////////////////////////////////
internal void internal void
lnk_symbol_list_push_node(LNK_SymbolList *list, LNK_SymbolNode *node) 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; 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 * internal LNK_SymbolHashTrie *
lnk_symbol_hash_trie_chunk_list_push(Arena *arena, LNK_SymbolHashTrieChunkList *list, U64 cap) 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); ins_atomic_ptr_eval_assign(&trie->symbol, 0);
} }
////////////////////////////////
internal U64 internal U64
lnk_symbol_hash(String8 string) 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 #pragma once
////////////////////////////////
typedef enum typedef enum
{ {
LNK_Symbol_Null, LNK_Symbol_Null,
@@ -111,24 +109,14 @@ typedef struct LNK_SymbolTable
HashTable *alt_names; HashTable *alt_names;
} LNK_SymbolTable; } LNK_SymbolTable;
//////////////////////////////// // --- Symbol Make -------------------------------------------------------------
// parallel for wrappers
typedef struct
{
LNK_SymbolTable *symtab;
Rng1U64 *ranges;
LNK_Symbol *arr;
} LNK_LazySymbolInserter;
////////////////////////////////
internal LNK_Symbol * lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx); 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_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_undefined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj);
internal LNK_Symbol * lnk_make_import_symbol(Arena *arena, String8 name, String8 import_header); 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 void lnk_symbol_list_push_node(LNK_SymbolList *list, LNK_SymbolNode *node);
internal LNK_SymbolNode * lnk_symbol_list_push(Arena *arena, LNK_SymbolList *list, LNK_Symbol *symbol); internal 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_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 LNK_SymbolArray lnk_symbol_array_from_list(Arena *arena, LNK_SymbolList list);
//////////////////////////////// // --- Symbol Hash Trie --------------------------------------------------------
internal ISectOff lnk_sc_from_symbol (LNK_Symbol *symbol);
internal U64 lnk_isect_from_symbol (LNK_Symbol *symbol);
internal U64 lnk_sect_off_from_symbol(LNK_Symbol *symbol);
internal U64 lnk_virt_off_from_symbol(COFF_SectionHeader **section_table, LNK_Symbol *symbol);
internal U64 lnk_file_off_from_symbol(COFF_SectionHeader **section_table, LNK_Symbol *symbol);
////////////////////////////////
internal void lnk_symbol_hash_trie_insert_or_replace(Arena *arena, LNK_SymbolHashTrieChunkList *chunks, LNK_SymbolHashTrie **trie, U64 hash, LNK_Symbol *symbol); 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 LNK_SymbolHashTrie * lnk_symbol_hash_trie_search(LNK_SymbolHashTrie *trie, U64 hash, String8 name);
internal void lnk_symbol_hash_trie_remove(LNK_SymbolHashTrie *trie); internal void lnk_symbol_hash_trie_remove(LNK_SymbolHashTrie *trie);
//////////////////////////////// // --- Symbol Table ------------------------------------------------------------
internal U64 lnk_symbol_hash(String8 string); 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); 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);