mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-02 20:18:12 +00:00
pass over the make RDI library
- Handle type layout in the library so converts simply define type graph and let the library handle DAG layout. - Changed location baking. For now the library waits for scope, procs, global vars, and thread vars steps to serially finish because of common dependency on location sections, we need to parallel for each step. - Changed encoded offset size for RDI_EvalOp_FrameOff to 8 bytes (1 byte is not enough to cover all cases) - Added frame base location to RDI_Procedure (WASM encodes frame base as an index into a global array and so we have to resolve the base at runtime).
This commit is contained in:
@@ -197,7 +197,7 @@ ASYNC_WORK_DEF(rdim_build_bake_name_map_work)
|
||||
Arena *arena = rdim_help_state->work_thread_arenas[thread_idx];
|
||||
RDIM_BuildBakeNameMapIn *in = (RDIM_BuildBakeNameMapIn *)input;
|
||||
RDIM_BakeNameMap *name_map = 0;
|
||||
ProfScope("build name map %i", in->k) name_map = rdim_bake_name_map_from_kind_params(arena, in->k, in->params);
|
||||
ProfScope("build name map %i", in->k) name_map = rdim_bake_name_map_from_kind_params(arena, in->k, in->type_indices, in->params);
|
||||
ProfEnd();
|
||||
return name_map;
|
||||
}
|
||||
@@ -243,7 +243,7 @@ ASYNC_WORK_DEF(rdim_bake_udts_work)
|
||||
Arena *arena = rdim_help_state->work_thread_arenas[thread_idx];
|
||||
RDIM_BakeUDTsIn *in = (RDIM_BakeUDTsIn *)input;
|
||||
RDIM_UDTBakeResult *out = push_array(arena, RDIM_UDTBakeResult, 1);
|
||||
ProfScope("bake udts") *out = rdim_bake_udts(arena, in->strings, in->udts);
|
||||
ProfScope("bake udts") *out = rdim_bake_udts(arena, in->strings, in->type_indices, in->udts);
|
||||
ProfEnd();
|
||||
return out;
|
||||
}
|
||||
@@ -254,7 +254,7 @@ ASYNC_WORK_DEF(rdim_bake_global_variables_work)
|
||||
Arena *arena = rdim_help_state->work_thread_arenas[thread_idx];
|
||||
RDIM_BakeGlobalVariablesIn *in = (RDIM_BakeGlobalVariablesIn *)input;
|
||||
RDIM_GlobalVariableBakeResult *out = push_array(arena, RDIM_GlobalVariableBakeResult, 1);
|
||||
ProfScope("bake global variables") *out = rdim_bake_global_variables(arena, in->strings, in->global_variables);
|
||||
ProfScope("bake global variables") *out = rdim_bake_global_variables(arena, in->strings, in->type_indices, in->global_variables);
|
||||
ProfEnd();
|
||||
return out;
|
||||
}
|
||||
@@ -276,7 +276,7 @@ ASYNC_WORK_DEF(rdim_bake_thread_variables_work)
|
||||
Arena *arena = rdim_help_state->work_thread_arenas[thread_idx];
|
||||
RDIM_BakeThreadVariablesIn *in = (RDIM_BakeThreadVariablesIn *)input;
|
||||
RDIM_ThreadVariableBakeResult *out = push_array(arena, RDIM_ThreadVariableBakeResult, 1);
|
||||
ProfScope("bake thread variables") *out = rdim_bake_thread_variables(arena, in->strings, in->thread_variables);
|
||||
ProfScope("bake thread variables") *out = rdim_bake_thread_variables(arena, in->strings, in->type_indices, in->thread_variables);
|
||||
ProfEnd();
|
||||
return out;
|
||||
}
|
||||
@@ -287,7 +287,7 @@ ASYNC_WORK_DEF(rdim_bake_procedures_work)
|
||||
Arena *arena = rdim_help_state->work_thread_arenas[thread_idx];
|
||||
RDIM_BakeProceduresIn *in = (RDIM_BakeProceduresIn *)input;
|
||||
RDIM_ProcedureBakeResult *out = push_array(arena, RDIM_ProcedureBakeResult, 1);
|
||||
ProfScope("bake procedures") *out = rdim_bake_procedures(arena, in->strings, in->procedures);
|
||||
ProfScope("bake procedures") *out = rdim_bake_procedures(arena, in->strings, in->type_indices, in->location_blocks, in->location_data_blobs, in->procedures);
|
||||
ProfEnd();
|
||||
return out;
|
||||
}
|
||||
@@ -298,7 +298,7 @@ ASYNC_WORK_DEF(rdim_bake_scopes_work)
|
||||
Arena *arena = rdim_help_state->work_thread_arenas[thread_idx];
|
||||
RDIM_BakeScopesIn *in = (RDIM_BakeScopesIn *)input;
|
||||
RDIM_ScopeBakeResult *out = push_array(arena, RDIM_ScopeBakeResult, 1);
|
||||
ProfScope("bake scopes") *out = rdim_bake_scopes(arena, in->strings, in->scopes);
|
||||
ProfScope("bake scopes") *out = rdim_bake_scopes(arena, in->strings, in->type_indices, in->location_blocks, in->location_data_blobs, in->scopes);
|
||||
ProfEnd();
|
||||
return out;
|
||||
}
|
||||
@@ -320,7 +320,7 @@ ASYNC_WORK_DEF(rdim_bake_inline_sites_work)
|
||||
Arena *arena = rdim_help_state->work_thread_arenas[thread_idx];
|
||||
RDIM_BakeInlineSitesIn *in = (RDIM_BakeInlineSitesIn *)input;
|
||||
RDIM_InlineSiteBakeResult *out = push_array(arena, RDIM_InlineSiteBakeResult, 1);
|
||||
ProfScope("bake inline sites") *out = rdim_bake_inline_sites(arena, in->strings, in->inline_sites);
|
||||
ProfScope("bake inline sites") *out = rdim_bake_inline_sites(arena, in->strings, in->type_indices, in->inline_sites);
|
||||
ProfEnd();
|
||||
return out;
|
||||
}
|
||||
@@ -355,7 +355,7 @@ ASYNC_WORK_DEF(rdim_bake_type_nodes_work)
|
||||
Arena *arena = rdim_help_state->work_thread_arenas[thread_idx];
|
||||
RDIM_BakeTypeNodesIn *in = (RDIM_BakeTypeNodesIn *)input;
|
||||
RDIM_TypeNodeBakeResult *out = push_array(arena, RDIM_TypeNodeBakeResult, 1);
|
||||
ProfScope("bake type nodes") *out = rdim_bake_types(arena, in->strings, in->idx_runs, in->types);
|
||||
ProfScope("bake type nodes") *out = rdim_bake_types(arena, in->strings, in->idx_runs, in->type_indices, in->types);
|
||||
ProfEnd();
|
||||
return out;
|
||||
}
|
||||
@@ -404,6 +404,11 @@ rdim_bake(RDIM_HelpState *state, RDIM_BakeParams *in_params)
|
||||
RDIM_BakeResults out = {0};
|
||||
|
||||
rdim_help_state = state;
|
||||
|
||||
////////////////////////////////
|
||||
// compute type indices
|
||||
|
||||
RDI_U64 *type_indices = rdim_make_type_indices(scratch.arena, &in_params->types);
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: kick off line tables baking
|
||||
@@ -634,6 +639,7 @@ rdim_bake(RDIM_HelpState *state, RDIM_BakeParams *in_params)
|
||||
k = (RDI_NameMapKind)(k+1))
|
||||
{
|
||||
build_bake_name_map_in[k].k = k;
|
||||
build_bake_name_map_in[k].type_indices = type_indices;
|
||||
build_bake_name_map_in[k].params = in_params;
|
||||
build_bake_name_map_task[k] = async_task_launch(scratch.arena, rdim_build_bake_name_map_work, .input = &build_bake_name_map_in[k]);
|
||||
}
|
||||
@@ -741,27 +747,43 @@ rdim_bake(RDIM_HelpState *state, RDIM_BakeParams *in_params)
|
||||
ASYNC_Task *bake_unit_vmap_task = async_task_launch(scratch.arena, rdim_bake_unit_vmap_work, .input = &bake_unit_vmap_in);
|
||||
RDIM_BakeSrcFilesIn bake_src_files_in = {&bake_strings, path_tree, &in_params->src_files};
|
||||
ASYNC_Task *bake_src_files_task = async_task_launch(scratch.arena, rdim_bake_src_files_work, .input = &bake_src_files_in);
|
||||
RDIM_BakeUDTsIn bake_udts_in = {&bake_strings, &in_params->udts};
|
||||
RDIM_BakeUDTsIn bake_udts_in = {&bake_strings, &in_params->udts, type_indices};
|
||||
ASYNC_Task *bake_udts_task = async_task_launch(scratch.arena, rdim_bake_udts_work, .input = &bake_udts_in);
|
||||
RDIM_BakeGlobalVariablesIn bake_global_variables_in = {&bake_strings, &in_params->global_variables};
|
||||
ASYNC_Task *bake_global_variables_task = async_task_launch(scratch.arena, rdim_bake_global_variables_work, .input = &bake_global_variables_in);
|
||||
RDIM_BakeGlobalVMapIn bake_global_vmap_in = {&in_params->global_variables};
|
||||
ASYNC_Task *bake_global_vmap_task = async_task_launch(scratch.arena, rdim_bake_global_vmap_work, .input = &bake_global_vmap_in);
|
||||
RDIM_BakeThreadVariablesIn bake_thread_variables_in = {&bake_strings, &in_params->thread_variables};
|
||||
ASYNC_Task *bake_thread_variables_task = async_task_launch(scratch.arena, rdim_bake_thread_variables_work, .input = &bake_thread_variables_in);
|
||||
RDIM_BakeProceduresIn bake_procedures_in = {&bake_strings, &in_params->procedures};
|
||||
ASYNC_Task *bake_procedures_task = async_task_launch(scratch.arena, rdim_bake_procedures_work, .input = &bake_procedures_in);
|
||||
RDIM_BakeScopesIn bake_scopes_in = {&bake_strings, &in_params->scopes};
|
||||
ASYNC_Task *bake_scopes_task = async_task_launch(scratch.arena, rdim_bake_scopes_work, .input = &bake_scopes_in);
|
||||
RDIM_BakeScopeVMapIn bake_scope_vmap_in = {&in_params->scopes};
|
||||
ASYNC_Task *bake_scope_vmap_task = async_task_launch(scratch.arena, rdim_bake_scope_vmap_work, .input = &bake_scope_vmap_in);
|
||||
RDIM_BakeInlineSitesIn bake_inline_sites_in = {&bake_strings, &in_params->inline_sites};
|
||||
RDIM_BakeInlineSitesIn bake_inline_sites_in = {&bake_strings, &in_params->inline_sites, type_indices};
|
||||
ASYNC_Task *bake_inline_sites_task = async_task_launch(scratch.arena, rdim_bake_inline_sites_work, .input = &bake_inline_sites_in);
|
||||
RDIM_BakeFilePathsIn bake_file_paths_in = {&bake_strings, path_tree};
|
||||
ASYNC_Task *bake_file_paths_task = async_task_launch(scratch.arena, rdim_bake_file_paths_work, .input = &bake_file_paths_in);
|
||||
RDIM_BakeStringsIn bake_strings_in = {&bake_strings};
|
||||
ASYNC_Task *bake_strings_task = async_task_launch(scratch.arena, rdim_bake_strings_work, .input = &bake_strings_in);
|
||||
|
||||
|
||||
RDIM_String8List location_blocks = {0};
|
||||
RDIM_String8List location_data_blobs = {0};
|
||||
|
||||
// reserve null location block for opl
|
||||
rdim_location_block_chunk_list_push_array(state->work_thread_arenas[0], &location_blocks, 1);
|
||||
|
||||
// TODO: export location instead of VOFF
|
||||
RDIM_BakeThreadVariablesIn bake_thread_variables_in = {&bake_strings, &in_params->thread_variables, type_indices};
|
||||
ASYNC_Task *bake_thread_variables_task = async_task_launch(scratch.arena, rdim_bake_thread_variables_work, .input = &bake_thread_variables_in);
|
||||
ProfScope("thread variables") out.thread_variables = *async_task_join_struct(bake_thread_variables_task, RDIM_ThreadVariableBakeResult);
|
||||
|
||||
// TODO: export location instead of VOFF
|
||||
RDIM_BakeGlobalVariablesIn bake_global_variables_in = {&bake_strings, &in_params->global_variables, type_indices};
|
||||
ASYNC_Task *bake_global_variables_task = async_task_launch(scratch.arena, rdim_bake_global_variables_work, .input = &bake_global_variables_in);
|
||||
ProfScope("global variables") out.global_variables = *async_task_join_struct(bake_global_variables_task, RDIM_GlobalVariableBakeResult);
|
||||
|
||||
RDIM_BakeScopesIn bake_scopes_in = {&bake_strings, &in_params->scopes, type_indices, &location_blocks, &location_data_blobs};
|
||||
ASYNC_Task *bake_scopes_task = async_task_launch(scratch.arena, rdim_bake_scopes_work, .input = &bake_scopes_in);
|
||||
ProfScope("scopes") out.scopes = *async_task_join_struct(bake_scopes_task, RDIM_ScopeBakeResult);
|
||||
|
||||
RDIM_BakeProceduresIn bake_procedures_in = {&bake_strings, &in_params->procedures, type_indices, &location_blocks, &location_data_blobs};
|
||||
ASYNC_Task *bake_procedures_task = async_task_launch(scratch.arena, rdim_bake_procedures_work, .input = &bake_procedures_in);
|
||||
ProfScope("procedures") out.procedures = *async_task_join_struct(bake_procedures_task, RDIM_ProcedureBakeResult);
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: join name map building tasks
|
||||
//
|
||||
@@ -782,7 +804,7 @@ rdim_bake(RDIM_HelpState *state, RDIM_BakeParams *in_params)
|
||||
RDIM_BakeIdxRunMap *idx_runs = 0;
|
||||
ProfScope("build interned idx run map")
|
||||
{
|
||||
idx_runs = rdim_bake_idx_run_map_from_params(state->work_thread_arenas[0], name_maps, in_params);
|
||||
idx_runs = rdim_bake_idx_run_map_from_params(state->work_thread_arenas[0], name_maps, type_indices, in_params);
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
@@ -795,7 +817,7 @@ rdim_bake(RDIM_HelpState *state, RDIM_BakeParams *in_params)
|
||||
//////////////////////////////
|
||||
//- rjf: kick off pass 3 tasks
|
||||
//
|
||||
RDIM_BakeTypeNodesIn bake_type_nodes_in = {&bake_strings, idx_runs, &in_params->types};
|
||||
RDIM_BakeTypeNodesIn bake_type_nodes_in = {&bake_strings, idx_runs, &in_params->types, type_indices};
|
||||
ASYNC_Task *bake_type_nodes_task = async_task_launch(scratch.arena, rdim_bake_type_nodes_work, .input = &bake_type_nodes_in);
|
||||
ASYNC_Task *bake_name_maps_tasks[RDI_NameMapKind_COUNT] = {0};
|
||||
{
|
||||
@@ -823,11 +845,7 @@ rdim_bake(RDIM_HelpState *state, RDIM_BakeParams *in_params)
|
||||
ProfScope("unit vmap") out.unit_vmap = *async_task_join_struct(bake_unit_vmap_task, RDIM_UnitVMapBakeResult);
|
||||
ProfScope("source files") out.src_files = *async_task_join_struct(bake_src_files_task, RDIM_SrcFileBakeResult);
|
||||
ProfScope("UDTs") out.udts = *async_task_join_struct(bake_udts_task, RDIM_UDTBakeResult);
|
||||
ProfScope("global variables") out.global_variables = *async_task_join_struct(bake_global_variables_task, RDIM_GlobalVariableBakeResult);
|
||||
ProfScope("global vmap") out.global_vmap = *async_task_join_struct(bake_global_vmap_task, RDIM_GlobalVMapBakeResult);
|
||||
ProfScope("thread variables") out.thread_variables = *async_task_join_struct(bake_thread_variables_task, RDIM_ThreadVariableBakeResult);
|
||||
ProfScope("procedures") out.procedures = *async_task_join_struct(bake_procedures_task, RDIM_ProcedureBakeResult);
|
||||
ProfScope("scopes") out.scopes = *async_task_join_struct(bake_scopes_task, RDIM_ScopeBakeResult);
|
||||
ProfScope("scope vmap") out.scope_vmap = *async_task_join_struct(bake_scope_vmap_task, RDIM_ScopeVMapBakeResult);
|
||||
ProfScope("inline sites") out.inline_sites = *async_task_join_struct(bake_inline_sites_task, RDIM_InlineSiteBakeResult);
|
||||
ProfScope("file paths") out.file_paths = *async_task_join_struct(bake_file_paths_task, RDIM_FilePathBakeResult);
|
||||
@@ -860,6 +878,12 @@ rdim_bake(RDIM_HelpState *state, RDIM_BakeParams *in_params)
|
||||
out.name_maps = rdim_name_map_bake_results_combine(state->work_thread_arenas[0], name_map_bakes, ArrayCount(name_map_bakes));
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
out.location_blocks = rdim_str8_list_join(state->work_thread_arenas[0], &location_blocks, rdim_str8(0,0));
|
||||
out.location_data = rdim_str8_list_join(state->work_thread_arenas[0], &location_data_blobs, rdim_str8(0,0));
|
||||
|
||||
rdim_help_state = 0;
|
||||
|
||||
scratch_end(scratch);
|
||||
|
||||
@@ -128,6 +128,7 @@ typedef struct RDIM_BuildBakeNameMapIn RDIM_BuildBakeNameMapIn;
|
||||
struct RDIM_BuildBakeNameMapIn
|
||||
{
|
||||
RDI_NameMapKind k;
|
||||
RDI_U64 *type_indices;
|
||||
RDIM_BakeParams *params;
|
||||
};
|
||||
|
||||
@@ -184,6 +185,7 @@ struct RDIM_BakeUDTsIn
|
||||
{
|
||||
RDIM_BakeStringMapTight *strings;
|
||||
RDIM_UDTChunkList *udts;
|
||||
RDI_U64 *type_indices;
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeGlobalVariablesIn RDIM_BakeGlobalVariablesIn;
|
||||
@@ -191,6 +193,7 @@ struct RDIM_BakeGlobalVariablesIn
|
||||
{
|
||||
RDIM_BakeStringMapTight *strings;
|
||||
RDIM_SymbolChunkList *global_variables;
|
||||
RDI_U64 *type_indices;
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeGlobalVMapIn RDIM_BakeGlobalVMapIn;
|
||||
@@ -204,6 +207,7 @@ struct RDIM_BakeThreadVariablesIn
|
||||
{
|
||||
RDIM_BakeStringMapTight *strings;
|
||||
RDIM_SymbolChunkList *thread_variables;
|
||||
RDI_U64 *type_indices;
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeProceduresIn RDIM_BakeProceduresIn;
|
||||
@@ -211,6 +215,9 @@ struct RDIM_BakeProceduresIn
|
||||
{
|
||||
RDIM_BakeStringMapTight *strings;
|
||||
RDIM_SymbolChunkList *procedures;
|
||||
RDI_U64 *type_indices;
|
||||
RDIM_String8List *location_blocks;
|
||||
RDIM_String8List *location_data_blobs;
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeScopesIn RDIM_BakeScopesIn;
|
||||
@@ -218,6 +225,9 @@ struct RDIM_BakeScopesIn
|
||||
{
|
||||
RDIM_BakeStringMapTight *strings;
|
||||
RDIM_ScopeChunkList *scopes;
|
||||
RDI_U64 *type_indices;
|
||||
RDIM_String8List *location_blocks;
|
||||
RDIM_String8List *location_data_blobs;
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeScopeVMapIn RDIM_BakeScopeVMapIn;
|
||||
@@ -231,6 +241,7 @@ struct RDIM_BakeInlineSitesIn
|
||||
{
|
||||
RDIM_BakeStringMapTight *strings;
|
||||
RDIM_InlineSiteChunkList *inline_sites;
|
||||
RDI_U64 *type_indices;
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeFilePathsIn RDIM_BakeFilePathsIn;
|
||||
@@ -252,6 +263,7 @@ struct RDIM_BakeTypeNodesIn
|
||||
RDIM_BakeStringMapTight *strings;
|
||||
RDIM_BakeIdxRunMap *idx_runs;
|
||||
RDIM_TypeChunkList *types;
|
||||
RDI_U64 *type_indices;
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeNameMapIn RDIM_BakeNameMapIn;
|
||||
|
||||
Reference in New Issue
Block a user