mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
raddbgi_make: name maps
This commit is contained in:
@@ -1149,6 +1149,70 @@ rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string)
|
||||
return path_node->idx;
|
||||
}
|
||||
|
||||
//- rjf: name maps
|
||||
|
||||
RDI_PROC void
|
||||
rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDIM_String8 string, RDI_U32 idx)
|
||||
{
|
||||
// rjf: hash
|
||||
RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember);
|
||||
RDI_U64 slot_idx = hash%map->slots_count;
|
||||
|
||||
// rjf: find existing node
|
||||
RDIM_BakeNameMapNode *node = 0;
|
||||
for(RDIM_BakeNameMapNode *n = map->slots[slot_idx]; n != 0; n = n->slot_next)
|
||||
{
|
||||
if(rdim_str8_match(string, n->string, 0))
|
||||
{
|
||||
node = n;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: make node if necessary
|
||||
if(node == 0)
|
||||
{
|
||||
node = rdim_push_array(arena, RDIM_BakeNameMapNode, 1);
|
||||
node->string = rdim_str8_copy(arena, string);
|
||||
RDIM_SLLStackPush_N(map->slots[slot_idx], node, slot_next);
|
||||
RDIM_SLLQueuePush_N(map->first, map->last, node, order_next);
|
||||
map->name_count += 1;
|
||||
map->slot_collision_count += (node->slot_next != 0);
|
||||
}
|
||||
|
||||
// rjf: find existing idx
|
||||
RDI_S32 existing_idx = 0;
|
||||
for(RDIM_BakeNameMapValNode *n = node->val_first; n != 0; n = n->next)
|
||||
{
|
||||
for(RDI_U32 i = 0; i < sizeof(n->val)/sizeof(n->val[0]); i += 1)
|
||||
{
|
||||
if(n->val[i] == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if(n->val[i] == idx)
|
||||
{
|
||||
existing_idx = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: insert new idx if necessary
|
||||
if(!existing_idx)
|
||||
{
|
||||
RDIM_BakeNameMapValNode *val_node = node->val_last;
|
||||
RDI_U32 insert_i = node->val_count%(sizeof(val_node->val)/sizeof(val_node->val[0]));
|
||||
if(insert_i == 0)
|
||||
{
|
||||
val_node = rdim_push_array(arena, RDIM_BakeNameMapValNode, 1);
|
||||
SLLQueuePush(node->val_first, node->val_last, val_node);
|
||||
}
|
||||
val_node->val[insert_i] = idx;
|
||||
node->val_count += 1;
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: vmap baking
|
||||
|
||||
RDI_PROC RDIM_VMap
|
||||
@@ -1326,12 +1390,21 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params)
|
||||
RDIM_BakeStringMap strings = {0};
|
||||
RDIM_BakeIdxRunMap idx_runs = {0};
|
||||
RDIM_BakePathTree path_tree = {0};
|
||||
RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT] = {0};
|
||||
{
|
||||
// TODO(rjf): adjust slots based on good estimates from params
|
||||
rdim_bake_section_list_push_new(arena, §ions, 0, 0, RDI_DataSectionTag_NULL);
|
||||
strings.slots_count = 65536;
|
||||
strings.slots = rdim_push_array(arena, RDIM_BakeStringNode *, strings.slots_count);
|
||||
idx_runs.slots_count = 65536;
|
||||
idx_runs.slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs.slots_count);
|
||||
for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1);
|
||||
k < RDI_NameMapKind_COUNT;
|
||||
k = (RDI_NameMapKind)(k+1))
|
||||
{
|
||||
name_maps[k].slots_count = 65536;
|
||||
name_maps[k].slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, name_maps[k].slots_count);
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
@@ -1762,7 +1835,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params)
|
||||
RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, params->types.total_count);
|
||||
RDIM_ProfScope("push all type nodes")
|
||||
{
|
||||
RDI_U64 dst_idx = 0;
|
||||
RDI_U32 dst_idx = 0;
|
||||
for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next)
|
||||
{
|
||||
for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1)
|
||||
@@ -1778,6 +1851,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params)
|
||||
if(RDI_TypeKind_FirstBuiltIn <= dst->kind && dst->kind <= RDI_TypeKind_LastBuiltIn)
|
||||
{
|
||||
dst->built_in.name_string_idx = rdim_bake_string(arena, &strings, src->name);
|
||||
rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_Types], src->name, dst_idx);
|
||||
}
|
||||
|
||||
//- rjf: fill constructed type node info
|
||||
@@ -1807,6 +1881,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params)
|
||||
dst->user_defined.name_string_idx = rdim_bake_string(arena, &strings, src->name);
|
||||
dst->user_defined.udt_idx = (RDI_U32)rdim_idx_from_udt(src->udt); // TODO(rjf): @u64_to_u32
|
||||
dst->user_defined.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32
|
||||
rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_Types], src->name, dst_idx);
|
||||
}
|
||||
|
||||
//- rjf: fill bitfield info
|
||||
@@ -1931,6 +2006,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params)
|
||||
dst->link_flags |= RDI_LinkFlag_ProcScoped;
|
||||
dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32
|
||||
}
|
||||
rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_GlobalVariables], src->name, dst_idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1965,6 +2041,7 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params)
|
||||
dst->link_flags |= RDI_LinkFlag_ProcScoped;
|
||||
dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32
|
||||
}
|
||||
rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_ThreadVariables], src->name, dst_idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2000,6 +2077,11 @@ rdim_bake(RDIM_Arena *arena, RDIM_BakeParams *params)
|
||||
}
|
||||
dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32
|
||||
dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32
|
||||
rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_Procedures], src->name, dst_idx);
|
||||
if(src->link_name.size > 0)
|
||||
{
|
||||
rdim_bake_name_map_push(arena, &name_maps[RDI_NameMapKind_LinkNameProcedures], src->link_name, dst_idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -755,38 +755,6 @@ struct RDIM_ScopeChunkList
|
||||
RDI_U64 location_count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Name Map Types
|
||||
|
||||
typedef struct RDIM_NameMapValNode RDIM_NameMapValNode;
|
||||
struct RDIM_NameMapValNode
|
||||
{
|
||||
RDIM_NameMapValNode *next;
|
||||
void *val[8];
|
||||
};
|
||||
|
||||
typedef struct RDIM_NameMapNode RDIM_NameMapNode;
|
||||
struct RDIM_NameMapNode
|
||||
{
|
||||
RDIM_NameMapNode *slot_next;
|
||||
RDIM_NameMapNode *order_next;
|
||||
RDIM_String8 string;
|
||||
RDIM_NameMapValNode *val_first;
|
||||
RDIM_NameMapValNode *val_last;
|
||||
RDI_U64 val_count;
|
||||
};
|
||||
|
||||
typedef struct RDIM_NameMap RDIM_NameMap;
|
||||
struct RDIM_NameMap
|
||||
{
|
||||
RDIM_NameMapNode **slots;
|
||||
RDI_U64 slots_count;
|
||||
RDI_U64 slot_collision_count;
|
||||
RDIM_NameMapNode *first;
|
||||
RDIM_NameMapNode *last;
|
||||
RDI_U64 name_count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Baking Types
|
||||
|
||||
@@ -943,6 +911,37 @@ struct RDIM_BakePathTree
|
||||
RDI_U32 src_count;
|
||||
};
|
||||
|
||||
//- rjf: name maps
|
||||
|
||||
typedef struct RDIM_BakeNameMapValNode RDIM_BakeNameMapValNode;
|
||||
struct RDIM_BakeNameMapValNode
|
||||
{
|
||||
RDIM_BakeNameMapValNode *next;
|
||||
RDI_U32 val[6];
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeNameMapNode RDIM_BakeNameMapNode;
|
||||
struct RDIM_BakeNameMapNode
|
||||
{
|
||||
RDIM_BakeNameMapNode *slot_next;
|
||||
RDIM_BakeNameMapNode *order_next;
|
||||
RDIM_String8 string;
|
||||
RDIM_BakeNameMapValNode *val_first;
|
||||
RDIM_BakeNameMapValNode *val_last;
|
||||
RDI_U64 val_count;
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeNameMap RDIM_BakeNameMap;
|
||||
struct RDIM_BakeNameMap
|
||||
{
|
||||
RDIM_BakeNameMapNode **slots;
|
||||
RDI_U64 slots_count;
|
||||
RDI_U64 slot_collision_count;
|
||||
RDIM_BakeNameMapNode *first;
|
||||
RDIM_BakeNameMapNode *last;
|
||||
RDI_U64 name_count;
|
||||
};
|
||||
|
||||
//- rjf: vmaps
|
||||
|
||||
typedef struct RDIM_VMap RDIM_VMap;
|
||||
@@ -1434,6 +1433,9 @@ RDI_PROC RDIM_BakePathNode *rdim_bake_path_node_from_string(RDIM_Arena *arena, R
|
||||
RDI_PROC RDIM_BakeSrcNode *rdim_bake_src_node_from_path_node(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_BakePathNode *path_node);
|
||||
RDI_PROC RDI_U32 rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string);
|
||||
|
||||
//- rjf: name maps
|
||||
RDI_PROC void rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDIM_String8 string, RDI_U32 idx);
|
||||
|
||||
//- rjf: vmap baking
|
||||
RDI_PROC RDIM_VMap rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count);
|
||||
|
||||
|
||||
@@ -5804,10 +5804,13 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
|
||||
//////////////////////////
|
||||
//- rjf: merge this stream's outputs with collated list
|
||||
//
|
||||
rdim_symbol_chunk_list_concat_in_place(&all_procedures, &sym_procedures);
|
||||
rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &sym_global_variables);
|
||||
rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &sym_thread_variables);
|
||||
rdim_scope_chunk_list_concat_in_place(&all_scopes, &sym_scopes);
|
||||
ProfScope("merge this stream's outputs with collated list")
|
||||
{
|
||||
rdim_symbol_chunk_list_concat_in_place(&all_procedures, &sym_procedures);
|
||||
rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &sym_global_variables);
|
||||
rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &sym_thread_variables);
|
||||
rdim_scope_chunk_list_concat_in_place(&all_scopes, &sym_scopes);
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
}
|
||||
|
||||
@@ -109,7 +109,6 @@ main(int argc, char **argv)
|
||||
os_file_close(output_file);
|
||||
}
|
||||
|
||||
|
||||
//- rjf: end capture
|
||||
if(should_capture)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user