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:
Ryan Fleury
2024-02-09 16:59:42 -08:00
parent 6c872566af
commit ebfddabd0b
3 changed files with 30 additions and 22 deletions
+19 -15
View File
@@ -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
+5 -4
View File
@@ -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);
+6 -3
View File
@@ -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);