mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-10-14 21:09:41 -07:00
linker checkpoint
This commit is contained in:
1 parent
a60216fa9f
commit
7c071e7238
74 files changed
+3940
-6441
No files matched your search
+56
-113
@@ -1,109 +1,49 @@
|
||||
// Copyright (c) 2024 Epic Games Tools
|
||||
// Copyright (c) 2025 Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
#pragma once
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LNK_SymbolScopeIndex_Defined,
|
||||
LNK_SymbolScopeIndex_Internal, // symbols defined by linker
|
||||
LNK_SymbolScopeIndex_Weak,
|
||||
LNK_SymbolScopeIndex_Lib,
|
||||
LNK_SymbolScopeIndex_Count
|
||||
} LNK_SymbolScopeIndex;
|
||||
////////////////////////////////
|
||||
|
||||
enum
|
||||
{
|
||||
LNK_SymbolScopeFlag_Defined = 1,
|
||||
LNK_SymbolScopeFlag_Internal = 2,
|
||||
LNK_SymbolScopeFlag_Weak = 4,
|
||||
LNK_SymbolScopeFlag_Lib = 8,
|
||||
|
||||
LNK_SymbolScopeFlag_Main = LNK_SymbolScopeFlag_Defined | LNK_SymbolScopeFlag_Weak,
|
||||
LNK_SymbolScopeFlag_All = LNK_SymbolScopeFlag_Defined | LNK_SymbolScopeFlag_Weak | LNK_SymbolScopeFlag_Lib | LNK_SymbolScopeFlag_Internal
|
||||
};
|
||||
typedef U64 LNK_SymbolScopeFlags;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LNK_DefinedSymbolVisibility_Static,
|
||||
LNK_DefinedSymbolVisibility_Extern,
|
||||
LNK_DefinedSymbolVisibility_Internal,
|
||||
} LNK_DefinedSymbolVisibility;
|
||||
|
||||
enum
|
||||
{
|
||||
LNK_DefinedSymbolFlag_IsFunc = (1 << 0),
|
||||
LNK_DefinedSymbolFlag_IsThunk = (1 << 1),
|
||||
};
|
||||
typedef U64 LNK_DefinedSymbolFlags;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LNK_DefinedSymbolValue_Null,
|
||||
LNK_DefinedSymbolValue_Chunk,
|
||||
LNK_DefinedSymbolValue_VA
|
||||
} LNK_DefinedSymbolValueType;
|
||||
|
||||
typedef struct LNK_DefinedSymbol
|
||||
{
|
||||
LNK_DefinedSymbolFlags flags;
|
||||
LNK_DefinedSymbolValueType value_type;
|
||||
union {
|
||||
struct {
|
||||
LNK_Chunk *chunk;
|
||||
U64 chunk_offset;
|
||||
U32 check_sum;
|
||||
COFF_ComdatSelectType selection;
|
||||
};
|
||||
U64 va;
|
||||
} u;
|
||||
} LNK_DefinedSymbol;
|
||||
|
||||
typedef struct LNK_WeakSymbol
|
||||
{
|
||||
LNK_SymbolScopeFlags scope_flags;
|
||||
COFF_WeakExtType lookup_type;
|
||||
struct LNK_Symbol *fallback_symbol;
|
||||
} LNK_WeakSymbol;
|
||||
|
||||
typedef struct LNK_UndefinedSymbol
|
||||
{
|
||||
LNK_SymbolScopeFlags scope_flags;
|
||||
} LNK_UndefinedSymbol;
|
||||
|
||||
typedef struct LNK_LazySymbol
|
||||
{
|
||||
struct LNK_Lib *lib;
|
||||
U64 member_offset;
|
||||
} LNK_LazySymbol;
|
||||
|
||||
#define LNK_Symbol_IsDefined(type) ((type) == LNK_Symbol_DefinedStatic || (type) == LNK_Symbol_DefinedExtern || (type) == LNK_Symbol_DefinedInternal)
|
||||
typedef enum
|
||||
{
|
||||
LNK_Symbol_Null,
|
||||
LNK_Symbol_DefinedStatic,
|
||||
LNK_Symbol_DefinedExtern,
|
||||
LNK_Symbol_DefinedInternal,
|
||||
LNK_Symbol_Weak,
|
||||
LNK_Symbol_Lazy,
|
||||
LNK_Symbol_Undefined,
|
||||
LNK_Symbol_Defined,
|
||||
LNK_Symbol_Import,
|
||||
LNK_Symbol_Lib,
|
||||
LNK_Symbol_Undefined,
|
||||
} LNK_SymbolType;
|
||||
|
||||
typedef struct LNK_SymbolDefined
|
||||
{
|
||||
struct LNK_Obj *obj;
|
||||
U32 symbol_idx;
|
||||
} LNK_SymbolDefined;
|
||||
|
||||
typedef struct LNK_SymbolLib
|
||||
{
|
||||
struct LNK_Lib *lib;
|
||||
U64 member_offset;
|
||||
} LNK_SymbolLib;
|
||||
|
||||
typedef struct LNK_SymbolUndefined
|
||||
{
|
||||
struct LNK_Obj *obj;
|
||||
} LNK_SymbolUndefined;
|
||||
|
||||
typedef struct LNK_Symbol
|
||||
{
|
||||
String8 name;
|
||||
LNK_SymbolType type;
|
||||
struct LNK_Obj *obj;
|
||||
String8 name;
|
||||
LNK_SymbolType type;
|
||||
union {
|
||||
LNK_DefinedSymbol defined;
|
||||
LNK_WeakSymbol weak;
|
||||
LNK_UndefinedSymbol undefined;
|
||||
LNK_LazySymbol lazy;
|
||||
LNK_SymbolDefined defined;
|
||||
LNK_SymbolLib lib;
|
||||
LNK_SymbolUndefined undef;
|
||||
} u;
|
||||
} LNK_Symbol;
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
typedef struct LNK_SymbolNode
|
||||
{
|
||||
struct LNK_SymbolNode *next;
|
||||
@@ -129,6 +69,15 @@ typedef struct LNK_SymbolArray
|
||||
LNK_Symbol *v;
|
||||
} LNK_SymbolArray;
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LNK_SymbolScope_Defined,
|
||||
LNK_SymbolScope_Lib,
|
||||
LNK_SymbolScope_Count
|
||||
} LNK_SymbolScope;
|
||||
|
||||
typedef struct LNK_SymbolHashTrie
|
||||
{
|
||||
String8 *name;
|
||||
@@ -154,8 +103,8 @@ typedef struct LNK_SymbolHashTrieChunkList
|
||||
typedef struct LNK_SymbolTable
|
||||
{
|
||||
TP_Arena *arena;
|
||||
LNK_SymbolHashTrie *scopes[LNK_SymbolScopeIndex_Count];
|
||||
LNK_SymbolHashTrieChunkList *chunk_lists[LNK_SymbolScopeIndex_Count];
|
||||
LNK_SymbolHashTrie *scopes[LNK_SymbolScope_Count];
|
||||
LNK_SymbolHashTrieChunkList *chunk_lists[LNK_SymbolScope_Count];
|
||||
} LNK_SymbolTable;
|
||||
|
||||
////////////////////////////////
|
||||
@@ -170,26 +119,14 @@ typedef struct
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
global read_only LNK_Symbol g_null_symbol = { str8_lit_comp("NULL"), LNK_Symbol_DefinedStatic };
|
||||
global read_only LNK_Symbol g_null_symbol = { str8_lit_comp("NULL"), LNK_Symbol_Null };
|
||||
global read_only LNK_Symbol *g_null_symbol_ptr = &g_null_symbol;
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
internal void lnk_init_symbol(LNK_Symbol *symbol, String8 name, LNK_SymbolType type);
|
||||
internal void lnk_init_defined_symbol(LNK_Symbol *symbol, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags);
|
||||
internal void lnk_init_defined_symbol_chunk(LNK_Symbol *symbol, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, LNK_Chunk *chunk, U64 offset, COFF_ComdatSelectType selection, U32 check_sum);
|
||||
internal void lnk_init_defined_symbol_va(LNK_Symbol *symbol, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, U64 va);
|
||||
internal void lnk_init_undefined_symbol(LNK_Symbol *symbol, String8 name, LNK_SymbolScopeFlags scope_flags);
|
||||
internal void lnk_init_weak_symbol(LNK_Symbol *symbol, String8 name, COFF_WeakExtType lookup, LNK_Symbol *fallback);
|
||||
|
||||
internal LNK_Symbol * lnk_make_defined_symbol(Arena *arena, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags);
|
||||
internal LNK_Symbol * lnk_make_defined_symbol_chunk(Arena *arena, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, LNK_Chunk *chunk, U64 offset, COFF_ComdatSelectType selection, U32 check_sum);
|
||||
internal LNK_Symbol * lnk_make_defined_symbol_va(Arena *arena, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, U64 va);
|
||||
internal LNK_Symbol * lnk_make_undefined_symbol(Arena *arena, String8 name, LNK_SymbolScopeFlags scope_flags);
|
||||
internal LNK_Symbol * lnk_make_weak_symbol(Arena *arena, String8 name, COFF_WeakExtType lookup, LNK_Symbol *fallback);
|
||||
internal LNK_Symbol * lnk_make_lazy_symbol(Arena *arena, String8 name, struct LNK_Lib *lib, U64 member_offset);
|
||||
|
||||
internal LNK_Chunk * lnk_chunk_from_symbol(LNK_Symbol *symbol);
|
||||
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);
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
@@ -202,6 +139,14 @@ internal LNK_SymbolArray lnk_symbol_array_from_list(Arena *arena, LNK_Symbol
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
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 LNK_SymbolHashTrie * lnk_symbol_hash_trie_search(LNK_SymbolHashTrie *trie, U64 hash, String8 name);
|
||||
internal void lnk_symbol_hash_trie_remove(LNK_SymbolHashTrie *trie);
|
||||
@@ -211,12 +156,10 @@ internal void lnk_symbol_hash_trie_remove(LNK_SymbolHashTrie *tr
|
||||
internal U64 lnk_symbol_hash(String8 string);
|
||||
|
||||
internal LNK_SymbolTable * lnk_symbol_table_init(TP_Arena *arena);
|
||||
internal LNK_Symbol * lnk_symbol_table_search_hash(LNK_SymbolTable *symtab, LNK_SymbolScopeFlags scope, U64 hash, String8 name);
|
||||
internal LNK_Symbol * lnk_symbol_table_search(LNK_SymbolTable *symtab, LNK_SymbolScopeFlags scope, String8 name);
|
||||
internal LNK_Symbol * lnk_symbol_table_searchf(LNK_SymbolTable *symtab, LNK_SymbolScopeFlags scope, char *fmt, ...);
|
||||
internal LNK_Symbol * lnk_symbol_table_search_hash(LNK_SymbolTable *symtab, LNK_SymbolScope scope, U64 hash, String8 name);
|
||||
internal LNK_Symbol * lnk_symbol_table_search(LNK_SymbolTable *symtab, LNK_SymbolScope scope, String8 name);
|
||||
internal LNK_Symbol * lnk_symbol_table_searchf(LNK_SymbolTable *symtab, LNK_SymbolScope scope, char *fmt, ...);
|
||||
internal void lnk_symbol_table_push_hash(LNK_SymbolTable *symtab, U64 hash, LNK_Symbol *symbol);
|
||||
internal void lnk_symbol_table_push(LNK_SymbolTable *symtab, LNK_Symbol *symbol);
|
||||
internal void lnk_symbol_table_remove(LNK_SymbolTable *symtab, LNK_SymbolScopeIndex scope, String8 name);
|
||||
|
||||
internal LNK_Symbol * lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_Symbol *resolve_symbol);
|
||||
internal void lnk_symbol_table_remove(LNK_SymbolTable *symtab, LNK_SymbolScope scope, String8 name);
|
||||
|
||||
Reference in new issue
Block a user