mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-08 06:48:41 +00:00
add a new boot mode to RADLINK for launching as a type server
checkpoint
This commit is contained in:
@@ -1196,14 +1196,23 @@ cv_debug_t_get_leaf(CV_DebugT *debug_t, U64 leaf_idx)
|
||||
internal U64
|
||||
cv_leaf_idx_from_ti(CV_DebugT *debug_t, CV_TypeIndexSource source, CV_TypeIndex ti)
|
||||
{
|
||||
Assert(contains_1u64(debug_t->ti_ranges[source], ti)); // validate TI
|
||||
Assert(!contains_1u64(debug_t->pch_ti_range[source], ti)); // no PCH indirection
|
||||
// validate TI
|
||||
Assert(contains_1u64(debug_t->ti_ranges[source], ti));
|
||||
|
||||
// no PCH indirection
|
||||
Assert(!contains_1u64(debug_t->pch_ti_range[source], ti));
|
||||
|
||||
U64 leaf_idx = ti;
|
||||
Assert(leaf_idx >= debug_t->ti_ranges[source].min);
|
||||
leaf_idx -= debug_t->ti_ranges[source].min; // strip type index range
|
||||
|
||||
// strip type index range
|
||||
leaf_idx -= debug_t->ti_ranges[source].min;
|
||||
Assert(leaf_idx >= dim_1u64(debug_t->pch_ti_range[source]));
|
||||
leaf_idx -= dim_1u64(debug_t->pch_ti_range[source]); // strip PCH indirection
|
||||
|
||||
// strip PCH indirection
|
||||
leaf_idx -= dim_1u64(debug_t->pch_ti_range[source]);
|
||||
leaf_idx += debug_t->source_offsets[source];
|
||||
|
||||
Assert(leaf_idx < debug_t->count);
|
||||
return leaf_idx;
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ lnk_arg_list_parse_windows_rules(Arena *arena, String8 string)
|
||||
U8 *opl = string.str + string.size;
|
||||
while (ptr < opl) {
|
||||
// skip white space and new lines
|
||||
for (;;) {
|
||||
while(ptr < opl) {
|
||||
U64 size = (U64)(opl - ptr);
|
||||
UnicodeDecode uni = utf8_decode(ptr, size);
|
||||
if (uni.codepoint != ' ' && uni.codepoint != '\n' && uni.codepoint != '\r') {
|
||||
@@ -21,7 +21,7 @@ lnk_arg_list_parse_windows_rules(Arena *arena, String8 string)
|
||||
ptr += uni.inc;
|
||||
}
|
||||
|
||||
if (*ptr == '\0') {
|
||||
if (ptr >= opl || *ptr == '\0') {
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+735
-88
File diff suppressed because it is too large
Load Diff
@@ -3,15 +3,60 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
////////////////////////////////
|
||||
// RRT
|
||||
|
||||
global read_only String8 g_rrt_magic = str8_lit_comp("RAD-TYPE-SERVER\0");
|
||||
global read_only U64 g_rrt_version = 2;
|
||||
|
||||
typedef struct LNK_RRT
|
||||
{
|
||||
String8 path;
|
||||
|
||||
String8 type_data_raw;
|
||||
union {
|
||||
String8 type_hashes;
|
||||
U64 **type_hashes_unpacked[CV_TypeIndexSource_COUNT];
|
||||
};
|
||||
Rng1U64 type_data_ranges[CV_TypeIndexSource_COUNT];
|
||||
String8 type_data [CV_TypeIndexSource_COUNT];
|
||||
Rng1U64 ti_ranges [CV_TypeIndexSource_COUNT];
|
||||
|
||||
U64 obj_count;
|
||||
U64 *obj_leaf_counts;
|
||||
U64 *obj_time_stamps;
|
||||
Rng1U64 *obj_ti_ranges;
|
||||
CV_TypeIndex **obj_ti_maps;
|
||||
String8Array obj_paths;
|
||||
Rng1U64 *obj_pch_ti_ranges;
|
||||
U32 *obj_pch_indices;
|
||||
} LNK_RRT;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
U64 count;
|
||||
LNK_RRT *v;
|
||||
} LNK_RRT_Array;
|
||||
|
||||
////////////////////////////////
|
||||
// CodeView
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LNK_TypeServerKind_Null,
|
||||
LNK_TypeServerKind_PDB,
|
||||
LNK_TypeServerKind_RRT,
|
||||
} LNK_TypeServerKind;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
CV_TypeServerInfo ts_info;
|
||||
U64 ts_idx;
|
||||
LNK_TypeServerKind ts_kind;
|
||||
String8 ts_path;
|
||||
U64List obj_indices;
|
||||
LNK_RRT *rrt;
|
||||
CV_DebugH *debug_h;
|
||||
} LNK_TypeServer;
|
||||
typedef struct LNK_TypeServerNode { LNK_TypeServer v; struct LNK_TypeServerNode *next; } LNK_TypeServerNode;
|
||||
typedef struct LNK_TypeServerList { U64 count; LNK_TypeServerNode *first, *last; } LNK_TypeServerList;
|
||||
@@ -29,6 +74,8 @@ typedef struct
|
||||
U64 obj_count;
|
||||
B32 is_stripped;
|
||||
|
||||
LNK_RRT_Array rrt_input;
|
||||
|
||||
U64 count;
|
||||
LNK_Obj **obj_arr;
|
||||
CV_DebugS *debug_s_arr;
|
||||
@@ -37,9 +84,6 @@ typedef struct
|
||||
U64 *obj_to_ts;
|
||||
|
||||
String8List *debug_s_list_arr;
|
||||
String8List *debug_p_list_arr;
|
||||
String8List *debug_t_list_arr;
|
||||
String8List *debug_h_list_arr;
|
||||
|
||||
U32Array int_obj_indices;
|
||||
U32Array ext_obj_indices;
|
||||
@@ -83,11 +127,22 @@ typedef struct LNK_LeafRange
|
||||
} LNK_LeafRange;
|
||||
typedef struct { U64 count; LNK_LeafRange *first, *last; } LNK_LeafRangeList;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LNK_MergeTypeFlag_BuildObjTiMap = (1 << 0),
|
||||
LNK_MergeTypeFlag_SkipSymbolTypeFixup = (1 << 1),
|
||||
LNK_MergeTypeFlag_ExportHashes = (1 << 2),
|
||||
} LNK_MergeTypeFlags;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
CV_TypeIndex min_type_indices[CV_TypeIndexSource_COUNT];
|
||||
U64 count[CV_TypeIndexSource_COUNT];
|
||||
U64 count [CV_TypeIndexSource_COUNT];
|
||||
U8 **v [CV_TypeIndexSource_COUNT];
|
||||
|
||||
// @type_server
|
||||
CV_TypeIndex **obj_ti_maps;
|
||||
U64 *hashes[CV_TypeIndexSource_COUNT];
|
||||
} LNK_MergedTypes;
|
||||
|
||||
typedef struct
|
||||
@@ -124,6 +179,13 @@ typedef struct
|
||||
CV_TypeIndex min_type_indices [CV_TypeIndexSource_COUNT];
|
||||
LNK_LeafRefArray unique_leaf_refs_arr[CV_TypeIndexSource_COUNT];
|
||||
|
||||
U64 *obj_ti_map_counts;
|
||||
U64 *obj_ti_map_offsets;
|
||||
CV_TypeIndex *obj_ti_batch;
|
||||
|
||||
U64 pop_obj_idx;
|
||||
Rng1U64 *pop_range;
|
||||
|
||||
LNK_MergedTypes result;
|
||||
} LNK_MergeTypes;
|
||||
|
||||
@@ -172,10 +234,16 @@ typedef struct
|
||||
String8List *maps;
|
||||
} LNK_TypeNameReplacer;
|
||||
|
||||
////////////////////////////////
|
||||
// RRT
|
||||
|
||||
internal String8List lnk_string_list_from_rrt(Arena *arena, LNK_RRT *rrt);
|
||||
internal B32 lnk_rrt_from_string (Arena *arena, String8 rrt_data, String8 path, LNK_RRT *rrt_out);
|
||||
|
||||
////////////////////////////////
|
||||
// CodeView
|
||||
|
||||
internal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U64 objs_count, LNK_Obj **objs);
|
||||
internal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U64 objs_count, LNK_Obj **objs, LNK_RRT_Array rrt_input);
|
||||
|
||||
internal int lnk_leaf_ref_compare (LNK_LeafRef a, LNK_LeafRef b);
|
||||
internal int lnk_leaf_ref_is_before (void *raw_a, void *raw_b);
|
||||
@@ -184,11 +252,10 @@ internal U64 lnk_hash_cv_leaf (LNK_CodeViewInput
|
||||
internal void lnk_hash_cv_leaf_deep (Arena *arena, LNK_CodeViewInput *input, LNK_LeafRef leaf_ref, CV_TypeIndexInfoList ti_info_list);
|
||||
internal LNK_LeafRef * lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, CV_DebugH *hashes, U64 hash, LNK_LeafRef *new_bucket);
|
||||
internal LNK_LeafRef * lnk_leaf_hash_table_search (LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafRef leaf_ref);
|
||||
internal LNK_MergedTypes lnk_merge_types (TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input);
|
||||
internal LNK_MergedTypes lnk_merge_types (TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input, LNK_MergeTypeFlags merge_flags);
|
||||
internal void lnk_replace_type_names_with_hashes (TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name);
|
||||
|
||||
////////////////////////////////
|
||||
// PDB
|
||||
|
||||
internal String8List lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types, LNK_PDB_BuilderFlags builder_flags);
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ lnk_write_file(void *raw_handle, uint64_t offset, void *buffer, uint64_t buffer_
|
||||
{
|
||||
File handle = *(File*)raw_handle;
|
||||
U64 write_size = file_write(handle, r1u64(offset, offset + buffer_size), buffer);
|
||||
Assert(write_size == buffer_size);
|
||||
return write_size;
|
||||
}
|
||||
|
||||
|
||||
+25
-9
@@ -9,18 +9,34 @@ typedef struct LNK_Obj
|
||||
{
|
||||
String8 path;
|
||||
String8 data;
|
||||
|
||||
COFF_FileHeaderInfo header;
|
||||
|
||||
// flags
|
||||
B8 hotpatch;
|
||||
B8 exclude_from_debug_info;
|
||||
|
||||
U32 input_idx;
|
||||
|
||||
// COMDAT
|
||||
U32 *comdats;
|
||||
U32Node **associated_sections;
|
||||
LNK_SymbolHashTrie **symlinks;
|
||||
|
||||
// link
|
||||
struct LNK_LibMemberRef *link_member;
|
||||
struct LNK_ObjNode *self;
|
||||
|
||||
// type info
|
||||
U32 debug_t_sect_idx;
|
||||
U32 debug_p_sect_idx;
|
||||
U32 debug_h_sect_idx;
|
||||
U32 input_idx;
|
||||
COFF_FileHeaderInfo header;
|
||||
U32 *comdats;
|
||||
B8 hotpatch;
|
||||
B8 exclude_from_debug_info;
|
||||
U32Node **associated_sections;
|
||||
LNK_SymbolHashTrie **symlinks;
|
||||
struct LNK_LibMemberRef *link_member;
|
||||
struct LNK_ObjNode *self;
|
||||
|
||||
// @type_server
|
||||
Rng1U64 ti_range;
|
||||
CV_TypeIndex *ti_map;
|
||||
Rng1U64 pch_ti_range;
|
||||
U64 pch_obj_idx;
|
||||
} LNK_Obj;
|
||||
|
||||
typedef struct LNK_ObjNode
|
||||
|
||||
Reference in New Issue
Block a user