mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-26 05:25:00 -07:00
raddbg cons: extend u64 -> ptr map api with separate channel for hash, which reduces scan space, independently from unique keys which were previously assumed to be a reasonable hash (which they weren't)
This commit is contained in:
@@ -518,7 +518,7 @@ cons_add_binary_section(CONS_Root *root, String8 name, RADDBG_BinarySectionFlags
|
||||
static CONS_Unit*
|
||||
cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id){
|
||||
CONS__U64ToPtrLookup lookup = {0};
|
||||
cons__u64toptr_lookup(&root->unit_map, unit_user_id, &lookup);
|
||||
cons__u64toptr_lookup(&root->unit_map, unit_user_id, unit_user_id, &lookup);
|
||||
|
||||
CONS_Unit *result = 0;
|
||||
if (lookup.match != 0){
|
||||
@@ -529,7 +529,7 @@ cons_unit_handle_from_user_id(CONS_Root *root, U64 unit_user_id){
|
||||
result->idx = root->unit_count;
|
||||
SLLQueuePush_N(root->unit_first, root->unit_last, result, next_order);
|
||||
root->unit_count += 1;
|
||||
cons__u64toptr_insert(root->arena, &root->unit_map, unit_user_id, &lookup, result);
|
||||
cons__u64toptr_insert(root->arena, &root->unit_map, unit_user_id, unit_user_id, &lookup, result);
|
||||
}
|
||||
|
||||
return(result);
|
||||
@@ -590,7 +590,7 @@ cons_unit_vmap_add_range(CONS_Root *root, CONS_Unit *unit, U64 first, U64 opl){
|
||||
static CONS_Type*
|
||||
cons_type_from_id(CONS_Root *root, U64 type_user_id){
|
||||
CONS__U64ToPtrLookup lookup = {0};
|
||||
cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, &lookup);
|
||||
cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id, &lookup);
|
||||
|
||||
CONS_Type *result = (CONS_Type*)lookup.match;
|
||||
return(result);
|
||||
@@ -599,11 +599,11 @@ cons_type_from_id(CONS_Root *root, U64 type_user_id){
|
||||
static CONS_Reservation*
|
||||
cons_type_reserve_id(CONS_Root *root, U64 type_user_id){
|
||||
CONS__U64ToPtrLookup lookup = {0};
|
||||
cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, &lookup);
|
||||
cons__u64toptr_lookup(&root->type_from_id_map, type_user_id, type_user_id, &lookup);
|
||||
|
||||
CONS_Reservation *result = 0;
|
||||
if (lookup.match == 0){
|
||||
cons__u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, &lookup, root->nil_type);
|
||||
cons__u64toptr_insert(root->arena, &root->type_from_id_map, type_user_id, type_user_id, &lookup, root->nil_type);
|
||||
void **slot = &lookup.fill_node->ptr[lookup.fill_k];
|
||||
result = (CONS_Reservation*)slot;
|
||||
}
|
||||
@@ -1319,7 +1319,8 @@ cons_type_list_push(Arena *arena, CONS_TypeList *list, CONS_Type *type){
|
||||
static CONS_Symbol*
|
||||
cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id){
|
||||
CONS__U64ToPtrLookup lookup = {0};
|
||||
cons__u64toptr_lookup(&root->symbol_map, symbol_user_id, &lookup);
|
||||
U64 symbol_hash = raddbg_hash((U8 *)&symbol_user_id, sizeof(symbol_user_id));
|
||||
cons__u64toptr_lookup(&root->symbol_map, symbol_user_id, symbol_hash, &lookup);
|
||||
|
||||
CONS_Symbol *result = 0;
|
||||
if (lookup.match != 0){
|
||||
@@ -1329,7 +1330,7 @@ cons_symbol_handle_from_user_id(CONS_Root *root, U64 symbol_user_id){
|
||||
result = push_array(root->arena, CONS_Symbol, 1);
|
||||
SLLQueuePush_N(root->first_symbol, root->last_symbol, result, next_order);
|
||||
root->symbol_count += 1;
|
||||
cons__u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, &lookup, result);
|
||||
cons__u64toptr_insert(root->arena, &root->symbol_map, symbol_user_id, symbol_hash, &lookup, result);
|
||||
}
|
||||
|
||||
return(result);
|
||||
@@ -1430,7 +1431,7 @@ cons_symbol_set_info(CONS_Root *root, CONS_Symbol *symbol, CONS_SymbolInfo *info
|
||||
static CONS_Scope*
|
||||
cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id){
|
||||
CONS__U64ToPtrLookup lookup = {0};
|
||||
cons__u64toptr_lookup(&root->scope_map, scope_user_id, &lookup);
|
||||
cons__u64toptr_lookup(&root->scope_map, scope_user_id, scope_user_id, &lookup);
|
||||
|
||||
CONS_Scope *result = 0;
|
||||
if (lookup.match != 0){
|
||||
@@ -1441,7 +1442,7 @@ cons_scope_handle_from_user_id(CONS_Root *root, U64 scope_user_id){
|
||||
result->idx = root->scope_count;
|
||||
SLLQueuePush_N(root->first_scope, root->last_scope, result, next_order);
|
||||
root->scope_count += 1;
|
||||
cons__u64toptr_insert(root->arena, &root->scope_map, scope_user_id, &lookup, result);
|
||||
cons__u64toptr_insert(root->arena, &root->scope_map, scope_user_id, scope_user_id, &lookup, result);
|
||||
}
|
||||
|
||||
return(result);
|
||||
@@ -1478,7 +1479,8 @@ cons_scope_add_voff_range(CONS_Root *root, CONS_Scope *scope, U64 voff_first, U6
|
||||
static CONS_Local*
|
||||
cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id){
|
||||
CONS__U64ToPtrLookup lookup = {0};
|
||||
cons__u64toptr_lookup(&root->local_map, local_user_id, &lookup);
|
||||
U64 local_hash = raddbg_hash((U8*)&local_user_id, sizeof(local_user_id));
|
||||
cons__u64toptr_lookup(&root->local_map, local_user_id, local_hash, &lookup);
|
||||
|
||||
CONS_Local *result = 0;
|
||||
if (lookup.match != 0){
|
||||
@@ -1486,7 +1488,7 @@ cons_local_handle_from_user_id(CONS_Root *root, U64 local_user_id){
|
||||
}
|
||||
else{
|
||||
result = push_array(root->arena, CONS_Local, 1);
|
||||
cons__u64toptr_insert(root->arena, &root->local_map, local_user_id, &lookup, result);
|
||||
cons__u64toptr_insert(root->arena, &root->local_map, local_user_id, local_hash, &lookup, result);
|
||||
}
|
||||
|
||||
return(result);
|
||||
@@ -1799,9 +1801,9 @@ cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count){
|
||||
}
|
||||
|
||||
static void
|
||||
cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, CONS__U64ToPtrLookup *lookup_out){
|
||||
cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup_out){
|
||||
ProfBeginFunction();
|
||||
U64 bucket_idx = key&(map->buckets_count - 1);
|
||||
U64 bucket_idx = hash&(map->buckets_count - 1);
|
||||
CONS__U64ToPtrNode *check_node = map->buckets[bucket_idx];
|
||||
for (;check_node != 0; check_node = check_node->next){
|
||||
for (U32 k = 0; k < ArrayCount(check_node->key); k += 1){
|
||||
@@ -1820,8 +1822,9 @@ cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, CONS__U64ToPtrLookup *loo
|
||||
}
|
||||
|
||||
static void
|
||||
cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key,
|
||||
cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash,
|
||||
CONS__U64ToPtrLookup *lookup, void *ptr){
|
||||
ProfBeginFunction();
|
||||
if (lookup->fill_node != 0){
|
||||
CONS__U64ToPtrNode *node = lookup->fill_node;
|
||||
U32 k = lookup->fill_k;
|
||||
@@ -1829,7 +1832,7 @@ cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key,
|
||||
node->ptr[k] = ptr;
|
||||
}
|
||||
else{
|
||||
U64 bucket_idx = key&(map->buckets_count - 1);
|
||||
U64 bucket_idx = hash&(map->buckets_count - 1);
|
||||
|
||||
CONS__U64ToPtrNode *node = push_array(arena, CONS__U64ToPtrNode, 1);
|
||||
SLLStackPush(map->buckets[bucket_idx], node);
|
||||
@@ -1842,6 +1845,7 @@ cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key,
|
||||
map->pair_count += 1;
|
||||
map->bucket_collision_count += (node->next != 0);
|
||||
}
|
||||
ProfEnd();
|
||||
}
|
||||
|
||||
// str8 to ptr map
|
||||
|
||||
@@ -500,8 +500,9 @@ static void cons__name_map_add_pair(CONS_Root *root, CONS__NameMap *ma
|
||||
// u64 to ptr map
|
||||
typedef struct CONS__U64ToPtrNode{
|
||||
struct CONS__U64ToPtrNode *next;
|
||||
U64 key[3];
|
||||
void *ptr[3];
|
||||
U64 _padding_;
|
||||
U64 key[1];
|
||||
void *ptr[1];
|
||||
} CONS__U64ToPtrNode;
|
||||
|
||||
typedef struct CONS__U64ToPtrMap{
|
||||
@@ -519,8 +520,8 @@ typedef struct CONS__U64ToPtrLookup{
|
||||
|
||||
static void cons__u64toptr_init(Arena *arena, CONS__U64ToPtrMap *map, U64 bucket_count);
|
||||
|
||||
static void cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, CONS__U64ToPtrLookup *lookup_out);
|
||||
static void cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key,
|
||||
static void cons__u64toptr_lookup(CONS__U64ToPtrMap *map, U64 key, U64 hash, CONS__U64ToPtrLookup *lookup_out);
|
||||
static void cons__u64toptr_insert(Arena *arena, CONS__U64ToPtrMap *map, U64 key, U64 hash,
|
||||
CONS__U64ToPtrLookup *lookup, void *ptr);
|
||||
|
||||
|
||||
|
||||
@@ -1898,8 +1898,9 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){
|
||||
}
|
||||
|
||||
CV_SymKind kind = rec_range->hdr.kind;
|
||||
switch (kind){
|
||||
default:break;
|
||||
switch(kind)
|
||||
{
|
||||
default:{}break;
|
||||
|
||||
case CV_SymKind_END:
|
||||
ProfScope("CV_SymKind_END")
|
||||
@@ -2278,13 +2279,15 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id){
|
||||
// emit local
|
||||
U64 user_id = user_id_base + off;
|
||||
CONS_Local *local_var = cons_local_handle_from_user_id(ctx->root, user_id);
|
||||
local_var->kind = local_kind;
|
||||
local_var->name = name;
|
||||
local_var->type = type;
|
||||
|
||||
CONS_LocalInfo info = {0};
|
||||
info.kind = local_kind;
|
||||
info.scope = current_scope;
|
||||
info.name = name;
|
||||
info.type = type;
|
||||
|
||||
cons_local_set_basic_info(ctx->root, local_var, &info);
|
||||
|
||||
defrange_target = cons_location_set_from_local(ctx->root, local_var);
|
||||
|
||||
Reference in New Issue
Block a user