diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbg_cons/raddbg_cons.c index c752ab0e..445e1e1e 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbg_cons/raddbg_cons.c @@ -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 diff --git a/src/raddbg_cons/raddbg_cons.h b/src/raddbg_cons/raddbg_cons.h index a84df50c..db9b86ed 100644 --- a/src/raddbg_cons/raddbg_cons.h +++ b/src/raddbg_cons/raddbg_cons.h @@ -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); diff --git a/src/raddbg_convert/pdb/raddbg_from_pdb.c b/src/raddbg_convert/pdb/raddbg_from_pdb.c index 0e2afe47..e35df47e 100644 --- a/src/raddbg_convert/pdb/raddbg_from_pdb.c +++ b/src/raddbg_convert/pdb/raddbg_from_pdb.c @@ -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);