mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-10-07 08:25:41 +00:00
processless debug info loading/unloading; separate modules from dbg infos in eval; keep dbg infos around after debugging via config, correllate to new modules, evict when necessary, when generating new versions
This commit is contained in:
+19
-3
@@ -676,8 +676,10 @@ internal void
|
||||
e_select_base_ctx(E_BaseCtx *ctx)
|
||||
{
|
||||
//- rjf: select base context
|
||||
if(ctx->modules == 0) { ctx->modules = &e_module_nil; }
|
||||
if(ctx->primary_module == 0) { ctx->primary_module = &e_module_nil; }
|
||||
if(ctx->modules == 0) { ctx->modules = &e_module_nil; }
|
||||
if(ctx->primary_module == 0) { ctx->primary_module = &e_module_nil; }
|
||||
if(ctx->dbg_infos == 0) { ctx->dbg_infos = &e_dbg_info_nil; }
|
||||
if(ctx->primary_dbg_info == 0) { ctx->primary_dbg_info = &e_dbg_info_nil; }
|
||||
e_base_ctx = ctx;
|
||||
|
||||
//- rjf: reset the evaluation cache
|
||||
@@ -718,7 +720,7 @@ e_select_base_ctx(E_BaseCtx *ctx)
|
||||
.id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(folder),
|
||||
.num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(folder),
|
||||
});
|
||||
e_cache->thread_ip_procedure = rdi_procedure_from_voff(e_base_ctx->primary_module->rdi, e_base_ctx->thread_ip_voff);
|
||||
e_cache->thread_ip_procedure = rdi_procedure_from_voff(e_base_ctx->primary_dbg_info->rdi, e_base_ctx->thread_ip_voff);
|
||||
e_cache->used_expr_map = push_array(e_cache->arena, E_UsedExprMap, 1);
|
||||
e_cache->used_expr_map->slots_count = 64;
|
||||
e_cache->used_expr_map->slots = push_array(e_cache->arena, E_UsedExprSlot, e_cache->used_expr_map->slots_count);
|
||||
@@ -744,6 +746,20 @@ e_select_ir_ctx(E_IRCtx *ctx)
|
||||
e_ir_ctx = ctx;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Context Accessors
|
||||
|
||||
internal E_DbgInfo *
|
||||
e_dbg_info_from_module(E_Module *module)
|
||||
{
|
||||
E_DbgInfo *result = &e_dbg_info_nil;
|
||||
if(0 < module->dbg_info_num && module->dbg_info_num <= e_base_ctx->dbg_infos_count)
|
||||
{
|
||||
result = &e_base_ctx->dbg_infos[module->dbg_info_num-1];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Cache Accessing Functions
|
||||
|
||||
|
||||
+23
-3
@@ -564,15 +564,24 @@ struct E_ConsTypeSlot
|
||||
E_ConsTypeNode *last;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Debug Info
|
||||
|
||||
typedef struct E_DbgInfo E_DbgInfo;
|
||||
struct E_DbgInfo
|
||||
{
|
||||
DI_Key dbgi_key;
|
||||
RDI_Parsed *rdi;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Modules
|
||||
|
||||
typedef struct E_Module E_Module;
|
||||
struct E_Module
|
||||
{
|
||||
DI_Key dbgi_key;
|
||||
RDI_Parsed *rdi;
|
||||
Rng1U64 vaddr_range;
|
||||
U32 dbg_info_num;
|
||||
Arch arch;
|
||||
E_Space space;
|
||||
};
|
||||
@@ -760,6 +769,11 @@ struct E_BaseCtx
|
||||
Arch thread_arch;
|
||||
U64 thread_unwind_count;
|
||||
|
||||
// rjf: debug infos
|
||||
E_DbgInfo *dbg_infos;
|
||||
U64 dbg_infos_count;
|
||||
E_DbgInfo *primary_dbg_info;
|
||||
|
||||
// rjf: modules
|
||||
E_Module *modules;
|
||||
U64 modules_count;
|
||||
@@ -1111,7 +1125,8 @@ read_only global E_String2ExprMap e_string2expr_map_nil = {0};
|
||||
read_only global E_Expr e_expr_nil = {&e_expr_nil, &e_expr_nil, &e_expr_nil, &e_expr_nil, &e_expr_nil};
|
||||
read_only global E_IRNode e_irnode_nil = {&e_irnode_nil, &e_irnode_nil, &e_irnode_nil};
|
||||
read_only global E_Eval e_eval_nil = {{0}, {0}, {0}, &e_expr_nil, {&e_irnode_nil}};
|
||||
read_only global E_Module e_module_nil = {{0}, &rdi_parsed_nil};
|
||||
read_only global E_DbgInfo e_dbg_info_nil = {{0}, &rdi_parsed_nil};
|
||||
read_only global E_Module e_module_nil = {0};
|
||||
read_only global E_CacheBundle e_cache_bundle_nil = {0, {0}, {0}, {0}, {{0}, 0, &e_expr_nil, &e_expr_nil}, {&e_irnode_nil}};
|
||||
thread_static E_BaseCtx *e_base_ctx = 0;
|
||||
thread_static E_IRCtx *e_ir_ctx = 0;
|
||||
@@ -1203,6 +1218,11 @@ internal void e_select_cache(E_Cache *cache);
|
||||
internal void e_select_base_ctx(E_BaseCtx *ctx);
|
||||
internal void e_select_ir_ctx(E_IRCtx *ctx);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Context Accessors
|
||||
|
||||
internal E_DbgInfo *e_dbg_info_from_module(E_Module *module);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Base Cache Accessing Functions
|
||||
//
|
||||
|
||||
+44
-32
@@ -968,28 +968,27 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);
|
||||
E_Interpretation interpretation = e_interpret(bytecode);
|
||||
E_Module *module = &e_module_nil;
|
||||
U32 rdi_idx = 0;
|
||||
for EachIndex(idx, e_base_ctx->modules_count)
|
||||
{
|
||||
E_Module *m = &e_base_ctx->modules[idx];
|
||||
if(e_space_match(interpretation.space, m->space) && contains_1u64(m->vaddr_range, interpretation.value.u64))
|
||||
{
|
||||
module = m;
|
||||
rdi_idx = (U32)idx;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(module != &e_module_nil)
|
||||
{
|
||||
E_DbgInfo *dbg_info = e_dbg_info_from_module(module);
|
||||
U64 voff = interpretation.value.u64 - module->vaddr_range.min;
|
||||
U64 new_vaddr = 0;
|
||||
RDI_Procedure *p = rdi_procedure_from_voff(module->rdi, voff);
|
||||
RDI_GlobalVariable *g = rdi_global_variable_from_voff(module->rdi, voff);
|
||||
RDI_Procedure *p = rdi_procedure_from_voff(dbg_info->rdi, voff);
|
||||
RDI_GlobalVariable *g = rdi_global_variable_from_voff(dbg_info->rdi, voff);
|
||||
U32 type_idx = 0;
|
||||
if(p->name_string_idx != 0)
|
||||
{
|
||||
type_idx = p->type_idx;
|
||||
new_vaddr = module->vaddr_range.min + rdi_first_voff_from_procedure(module->rdi, p);
|
||||
new_vaddr = module->vaddr_range.min + rdi_first_voff_from_procedure(dbg_info->rdi, p);
|
||||
}
|
||||
else if(g->name_string_idx != 0)
|
||||
{
|
||||
@@ -998,10 +997,10 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
}
|
||||
if(type_idx != 0)
|
||||
{
|
||||
RDI_TypeNode *t = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
|
||||
RDI_TypeNode *t = rdi_element_from_name_idx(dbg_info->rdi, TypeNodes, type_idx);
|
||||
result.root = e_irtree_const_u(arena, new_vaddr);
|
||||
result.mode = E_Mode_Value;
|
||||
result.type_key = e_type_key_ext(e_type_kind_from_rdi(t->kind), type_idx, rdi_idx);
|
||||
result.type_key = e_type_key_ext(e_type_kind_from_rdi(t->kind), type_idx, module->dbg_info_num);
|
||||
}
|
||||
}
|
||||
}break;
|
||||
@@ -1797,12 +1796,12 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("member"), 0)))
|
||||
{
|
||||
E_Module *module = e_base_ctx->primary_module;
|
||||
U32 module_idx = (U32)(module - e_base_ctx->modules);
|
||||
RDI_Parsed *rdi = module->rdi;
|
||||
E_DbgInfo *dbg_info = e_dbg_info_from_module(module);
|
||||
RDI_Parsed *rdi = dbg_info->rdi;
|
||||
RDI_Procedure *procedure = e_cache->thread_ip_procedure;
|
||||
RDI_UDT *udt = rdi_container_udt_from_procedure(rdi, procedure);
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);
|
||||
E_TypeKey container_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, module_idx);
|
||||
E_TypeKey container_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, module->dbg_info_num);
|
||||
E_Member member = e_type_member_from_key_name__cached(container_type_key, string);
|
||||
if(member.kind != E_MemberKind_Null)
|
||||
{
|
||||
@@ -1816,8 +1815,8 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("local"), 0)))
|
||||
{
|
||||
E_Module *module = e_base_ctx->primary_module;
|
||||
U32 module_idx = (U32)(module - e_base_ctx->modules);
|
||||
RDI_Parsed *rdi = module->rdi;
|
||||
E_DbgInfo *dbg_info = e_dbg_info_from_module(module);
|
||||
RDI_Parsed *rdi = dbg_info->rdi;
|
||||
U64 local_num = e_num_from_string(e_ir_ctx->locals_map, string__redirected);
|
||||
if(local_num != 0)
|
||||
{
|
||||
@@ -1825,7 +1824,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
|
||||
// rjf: extract local's type key
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, local->type_idx);
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), local->type_idx, module_idx);
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), local->type_idx, module->dbg_info_num);
|
||||
|
||||
// rjf: extract local's location block
|
||||
B32 got_location_block = 0;
|
||||
@@ -1892,13 +1891,14 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
Access *access = access_open();
|
||||
|
||||
// rjf: find match
|
||||
DI_Match match = di_match_from_string(string, 0, e_base_ctx->primary_module->dbgi_key, 0);
|
||||
DI_Match match = di_match_from_string(string, 0, e_base_ctx->primary_dbg_info->dbgi_key, 0);
|
||||
if(match.idx == 0)
|
||||
{
|
||||
String8List namespaceified_strings = {0};
|
||||
{
|
||||
E_Module *module = e_base_ctx->primary_module;
|
||||
RDI_Parsed *rdi = module->rdi;
|
||||
E_DbgInfo *dbg_info = e_dbg_info_from_module(module);
|
||||
RDI_Parsed *rdi = dbg_info->rdi;
|
||||
RDI_Procedure *procedure = e_cache->thread_ip_procedure;
|
||||
U64 name_size = 0;
|
||||
U8 *name_ptr = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size);
|
||||
@@ -1921,7 +1921,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
}
|
||||
for(String8Node *n = namespaceified_strings.first; n != 0; n = n->next)
|
||||
{
|
||||
match = di_match_from_string(n->string, 0, e_base_ctx->primary_module->dbgi_key, 0);
|
||||
match = di_match_from_string(n->string, 0, e_base_ctx->primary_dbg_info->dbgi_key, 0);
|
||||
if(match.idx != 0)
|
||||
{
|
||||
break;
|
||||
@@ -1932,17 +1932,27 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
// rjf: match -> RDI
|
||||
RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0);
|
||||
|
||||
// rjf: find dbg info from rdi
|
||||
E_DbgInfo *dbg_info = &e_dbg_info_nil;
|
||||
U32 dbg_info_num = 0;
|
||||
for EachIndex(idx, e_base_ctx->dbg_infos_count)
|
||||
{
|
||||
if(e_base_ctx->dbg_infos[idx].rdi == rdi)
|
||||
{
|
||||
dbg_info = &e_base_ctx->dbg_infos[idx];
|
||||
dbg_info_num = idx+1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: find module from dbgi key
|
||||
U32 dbgi_idx = 0;
|
||||
E_Module *module = &e_module_nil;
|
||||
for EachIndex(idx, e_base_ctx->modules_count)
|
||||
{
|
||||
if(e_base_ctx->modules[idx].rdi == rdi)
|
||||
if(e_base_ctx->modules[idx].dbg_info_num == dbg_info_num)
|
||||
{
|
||||
module = &e_base_ctx->modules[idx];
|
||||
dbgi_idx = (U32)idx;
|
||||
if(module == e_base_ctx->primary_module ||
|
||||
e_space_match(module->space, e_base_ctx->primary_module->space))
|
||||
if(module == e_base_ctx->primary_module || e_space_match(module->space, e_base_ctx->primary_module->space))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -1950,7 +1960,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
}
|
||||
|
||||
// rjf: form result
|
||||
if(match.idx != 0 && module != &e_module_nil)
|
||||
if(match.idx != 0 && dbg_info != &e_dbg_info_nil)
|
||||
{
|
||||
switch(match.section_kind)
|
||||
{
|
||||
@@ -1963,7 +1973,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + global_var->voff));
|
||||
string_mapped = 1;
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbgi_idx);
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num);
|
||||
mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
mapped_bytecode_mode = E_Mode_Offset;
|
||||
mapped_bytecode_space = module->space;
|
||||
@@ -1976,7 +1986,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(thread_var->tls_off));
|
||||
string_mapped = 1;
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbgi_idx);
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num);
|
||||
mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
mapped_bytecode_mode = E_Mode_Offset;
|
||||
mapped_bytecode_space = module->space;
|
||||
@@ -1999,7 +2009,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(value));
|
||||
string_mapped = 1;
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbgi_idx);
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num);
|
||||
mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
mapped_bytecode_mode = E_Mode_Value;
|
||||
mapped_bytecode_space = module->space;
|
||||
@@ -2017,7 +2027,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff));
|
||||
string_mapped = 1;
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbgi_idx);
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num);
|
||||
mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
mapped_bytecode_mode = E_Mode_Value;
|
||||
mapped_bytecode_space = module->space;
|
||||
@@ -2026,7 +2036,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
{
|
||||
U32 type_idx = match.idx;
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx);
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbgi_idx);
|
||||
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num);
|
||||
string_mapped = 1;
|
||||
}break;
|
||||
}
|
||||
@@ -2111,9 +2121,10 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
if(!generated && mapped_location_block != 0)
|
||||
{
|
||||
E_Module *module = mapped_location_block_module;
|
||||
E_DbgInfo *dbg_info = e_dbg_info_from_module(module);
|
||||
E_Space space = module->space;
|
||||
Arch arch = module->arch;
|
||||
RDI_Parsed *rdi = module->rdi;
|
||||
RDI_Parsed *rdi = dbg_info->rdi;
|
||||
RDI_LocationBlock *block = mapped_location_block;
|
||||
U64 all_location_data_size = 0;
|
||||
U8 *all_location_data = rdi_table_from_name(rdi, LocationData, &all_location_data_size);
|
||||
@@ -2466,17 +2477,18 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
if(e_space_read(interpret.space, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size)))
|
||||
{
|
||||
Arch arch = e_base_ctx->primary_module->arch;
|
||||
U32 rdi_idx = 0;
|
||||
U32 dbg_info_num = 0;
|
||||
RDI_Parsed *rdi = 0;
|
||||
U64 module_base = 0;
|
||||
for(U64 idx = 0; idx < e_base_ctx->modules_count; idx += 1)
|
||||
{
|
||||
if(contains_1u64(e_base_ctx->modules[idx].vaddr_range, vtable_vaddr))
|
||||
{
|
||||
E_DbgInfo *dbg_info = e_dbg_info_from_module(&e_base_ctx->modules[idx]);
|
||||
arch = e_base_ctx->modules[idx].arch;
|
||||
rdi_idx = (U32)idx;
|
||||
rdi = e_base_ctx->modules[idx].rdi;
|
||||
module_base = e_base_ctx->modules[idx].vaddr_range.min;
|
||||
dbg_info_num = e_base_ctx->modules[idx].dbg_info_num;
|
||||
rdi = dbg_info->rdi;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2489,7 +2501,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
{
|
||||
RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx);
|
||||
RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);
|
||||
E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx);
|
||||
E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, dbg_info_num);
|
||||
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 1, 0);
|
||||
result.type_key = ptr_to_derived_type_key;
|
||||
}
|
||||
|
||||
@@ -585,19 +585,19 @@ e_leaf_type_key_from_name(String8 name)
|
||||
E_TypeKey key = e_leaf_builtin_type_key_from_name(name);
|
||||
if(!e_type_key_match(e_type_key_zero(), key))
|
||||
{
|
||||
DI_Match match = di_match_from_string(name, 0, e_base_ctx->primary_module->dbgi_key, 0);
|
||||
DI_Match match = di_match_from_string(name, 0, e_base_ctx->primary_dbg_info->dbgi_key, 0);
|
||||
if(match.section_kind == RDI_SectionKind_TypeNodes)
|
||||
{
|
||||
Access *access = access_open();
|
||||
RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0);
|
||||
for EachIndex(idx, e_base_ctx->modules_count)
|
||||
for EachIndex(idx, e_base_ctx->dbg_infos_count)
|
||||
{
|
||||
E_Module *module = &e_base_ctx->modules[idx];
|
||||
if(module->rdi == rdi)
|
||||
E_DbgInfo *dbg_info = &e_base_ctx->dbg_infos[idx];
|
||||
if(dbg_info->rdi == rdi)
|
||||
{
|
||||
U32 type_idx = match.idx;
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx);
|
||||
key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)idx);
|
||||
key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)idx+1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+297
-289
@@ -271,7 +271,7 @@ e_type_key_basic(E_TypeKind kind)
|
||||
}
|
||||
|
||||
internal E_TypeKey
|
||||
e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_idx)
|
||||
e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_num)
|
||||
{
|
||||
E_TypeKey key = {E_TypeKeyKind_Ext};
|
||||
key.u32[0] = (U32)kind;
|
||||
@@ -282,7 +282,7 @@ e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_idx)
|
||||
else
|
||||
{
|
||||
key.u32[1] = type_idx;
|
||||
key.u32[2] = rdi_idx;
|
||||
key.u32[2] = rdi_num;
|
||||
}
|
||||
return key;
|
||||
}
|
||||
@@ -646,10 +646,13 @@ e_type_byte_size_from_key(E_TypeKey key)
|
||||
case E_TypeKeyKind_Ext:
|
||||
{
|
||||
U64 type_node_idx = key.u32[1];
|
||||
U32 rdi_idx = key.u32[2];
|
||||
RDI_Parsed *rdi = e_base_ctx->modules[rdi_idx].rdi;
|
||||
RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);
|
||||
result = rdi_type->byte_size;
|
||||
U32 rdi_num = key.u32[2];
|
||||
if(0 < rdi_num && rdi_num <= e_base_ctx->dbg_infos_count)
|
||||
{
|
||||
RDI_Parsed *rdi = e_base_ctx->dbg_infos[rdi_num-1].rdi;
|
||||
RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);
|
||||
result = rdi_type->byte_size;
|
||||
}
|
||||
}break;
|
||||
case E_TypeKeyKind_Cons:
|
||||
{
|
||||
@@ -758,322 +761,327 @@ e_push_type_from_key(Arena *arena, E_TypeKey key)
|
||||
case E_TypeKeyKind_Ext:
|
||||
{
|
||||
U64 type_node_idx = key.u32[1];
|
||||
U32 rdi_idx = key.u32[2];
|
||||
RDI_Parsed *rdi = e_base_ctx->modules[rdi_idx].rdi;
|
||||
RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);
|
||||
if(rdi_type->kind != RDI_TypeKind_NULL)
|
||||
U32 rdi_num = key.u32[2];
|
||||
if(0 < rdi_num && rdi_num <= e_base_ctx->dbg_infos_count)
|
||||
{
|
||||
E_TypeKind kind = e_type_kind_from_rdi(rdi_type->kind);
|
||||
|
||||
//- rjf: record types => unpack name * members & produce
|
||||
if(RDI_TypeKind_FirstRecord <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastRecord)
|
||||
RDI_Parsed *rdi = e_base_ctx->dbg_infos[rdi_num-1].rdi;
|
||||
RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0);
|
||||
Arch arch = arch_from_rdi_arch(tli->arch);
|
||||
RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);
|
||||
if(rdi_type->kind != RDI_TypeKind_NULL)
|
||||
{
|
||||
// rjf: unpack name
|
||||
String8 name = {0};
|
||||
name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
|
||||
E_TypeKind kind = e_type_kind_from_rdi(rdi_type->kind);
|
||||
|
||||
// rjf: unpack UDT info
|
||||
RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, rdi_type->user_defined.udt_idx);
|
||||
|
||||
// rjf: unpack members
|
||||
E_Member *members = 0;
|
||||
U32 members_count = 0;
|
||||
//- rjf: record types => unpack name * members & produce
|
||||
if(RDI_TypeKind_FirstRecord <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastRecord)
|
||||
{
|
||||
members_count = udt->member_count;
|
||||
members = push_array(arena, E_Member, members_count);
|
||||
if(members_count != 0)
|
||||
// rjf: unpack name
|
||||
String8 name = {0};
|
||||
name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
|
||||
|
||||
// rjf: unpack UDT info
|
||||
RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, rdi_type->user_defined.udt_idx);
|
||||
|
||||
// rjf: unpack members
|
||||
E_Member *members = 0;
|
||||
U32 members_count = 0;
|
||||
{
|
||||
members_count = udt->member_count;
|
||||
members = push_array(arena, E_Member, members_count);
|
||||
if(members_count != 0)
|
||||
{
|
||||
for(U32 member_idx = udt->member_first;
|
||||
member_idx < udt->member_first+udt->member_count;
|
||||
member_idx += 1)
|
||||
{
|
||||
RDI_Member *src = rdi_element_from_name_idx(rdi, Members, member_idx);
|
||||
E_TypeKind member_type_kind = E_TypeKind_Null;
|
||||
RDI_TypeNode *member_type = rdi_element_from_name_idx(rdi, TypeNodes, src->type_idx);
|
||||
member_type_kind = e_type_kind_from_rdi(member_type->kind);
|
||||
E_Member *dst = &members[member_idx-udt->member_first];
|
||||
dst->kind = e_member_kind_from_rdi(src->kind);
|
||||
dst->type_key = e_type_key_ext(member_type_kind, src->type_idx, rdi_num);
|
||||
dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size);
|
||||
dst->off = (U64)src->off;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: produce
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->name = push_str8_copy(arena, name);
|
||||
type->byte_size = (U64)rdi_type->byte_size;
|
||||
type->count = members_count;
|
||||
type->arch = arch;
|
||||
type->members = members;
|
||||
}
|
||||
|
||||
//- rjf: enum types => unpack name * values & produce
|
||||
else if(rdi_type->kind == RDI_TypeKind_Enum)
|
||||
{
|
||||
// rjf: unpack name
|
||||
String8 name = {0};
|
||||
name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
|
||||
|
||||
// rjf: unpack direct type
|
||||
E_TypeKey direct_type_key = zero_struct;
|
||||
if(rdi_type->user_defined.direct_type_idx < type_node_idx)
|
||||
{
|
||||
RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx);
|
||||
E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);
|
||||
direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->user_defined.direct_type_idx, rdi_num);
|
||||
}
|
||||
|
||||
// rjf: unpack members
|
||||
E_EnumVal *enum_vals = 0;
|
||||
U32 enum_vals_count = 0;
|
||||
{
|
||||
U32 udt_idx = rdi_type->user_defined.udt_idx;
|
||||
RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, udt_idx);
|
||||
enum_vals_count = udt->member_count;
|
||||
enum_vals = push_array(arena, E_EnumVal, enum_vals_count);
|
||||
for(U32 member_idx = udt->member_first;
|
||||
member_idx < udt->member_first+udt->member_count;
|
||||
member_idx += 1)
|
||||
{
|
||||
RDI_Member *src = rdi_element_from_name_idx(rdi, Members, member_idx);
|
||||
E_TypeKind member_type_kind = E_TypeKind_Null;
|
||||
RDI_TypeNode *member_type = rdi_element_from_name_idx(rdi, TypeNodes, src->type_idx);
|
||||
member_type_kind = e_type_kind_from_rdi(member_type->kind);
|
||||
E_Member *dst = &members[member_idx-udt->member_first];
|
||||
dst->kind = e_member_kind_from_rdi(src->kind);
|
||||
dst->type_key = e_type_key_ext(member_type_kind, src->type_idx, rdi_idx);
|
||||
RDI_EnumMember *src = rdi_element_from_name_idx(rdi, EnumMembers, member_idx);
|
||||
E_EnumVal *dst = &enum_vals[member_idx-udt->member_first];
|
||||
dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size);
|
||||
dst->off = (U64)src->off;
|
||||
dst->val = src->val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: produce
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->name = push_str8_copy(arena, name);
|
||||
type->byte_size = (U64)rdi_type->byte_size;
|
||||
type->count = members_count;
|
||||
type->arch = e_base_ctx->modules[rdi_idx].arch;
|
||||
type->members = members;
|
||||
}
|
||||
|
||||
//- rjf: enum types => unpack name * values & produce
|
||||
else if(rdi_type->kind == RDI_TypeKind_Enum)
|
||||
{
|
||||
// rjf: unpack name
|
||||
String8 name = {0};
|
||||
name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
|
||||
|
||||
// rjf: unpack direct type
|
||||
E_TypeKey direct_type_key = zero_struct;
|
||||
if(rdi_type->user_defined.direct_type_idx < type_node_idx)
|
||||
{
|
||||
RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx);
|
||||
E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);
|
||||
direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->user_defined.direct_type_idx, rdi_idx);
|
||||
}
|
||||
|
||||
// rjf: unpack members
|
||||
E_EnumVal *enum_vals = 0;
|
||||
U32 enum_vals_count = 0;
|
||||
{
|
||||
U32 udt_idx = rdi_type->user_defined.udt_idx;
|
||||
RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, udt_idx);
|
||||
enum_vals_count = udt->member_count;
|
||||
enum_vals = push_array(arena, E_EnumVal, enum_vals_count);
|
||||
for(U32 member_idx = udt->member_first;
|
||||
member_idx < udt->member_first+udt->member_count;
|
||||
member_idx += 1)
|
||||
{
|
||||
RDI_EnumMember *src = rdi_element_from_name_idx(rdi, EnumMembers, member_idx);
|
||||
E_EnumVal *dst = &enum_vals[member_idx-udt->member_first];
|
||||
dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size);
|
||||
dst->val = src->val;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: produce
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->name = push_str8_copy(arena, name);
|
||||
type->byte_size = (U64)rdi_type->byte_size;
|
||||
type->count = enum_vals_count;
|
||||
type->arch = e_base_ctx->modules[rdi_idx].arch;
|
||||
type->enum_vals = enum_vals;
|
||||
type->direct_type_key = direct_type_key;
|
||||
}
|
||||
|
||||
//- rjf: constructed types
|
||||
else if(RDI_TypeKind_FirstConstructed <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastConstructed)
|
||||
{
|
||||
// rjf: unpack direct type
|
||||
B32 direct_type_is_good = 0;
|
||||
E_TypeKey direct_type_key = zero_struct;
|
||||
U64 direct_type_byte_size = 0;
|
||||
if(rdi_type->constructed.direct_type_idx < type_node_idx)
|
||||
{
|
||||
RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.direct_type_idx);
|
||||
E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);
|
||||
direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->constructed.direct_type_idx, rdi_idx);
|
||||
direct_type_is_good = 1;
|
||||
direct_type_byte_size = (U64)direct_type_node->byte_size;
|
||||
}
|
||||
|
||||
// rjf: construct based on kind
|
||||
switch(rdi_type->kind)
|
||||
{
|
||||
case RDI_TypeKind_Modifier:
|
||||
{
|
||||
E_TypeFlags flags = 0;
|
||||
if(rdi_type->flags & RDI_TypeModifierFlag_Const)
|
||||
{
|
||||
flags |= E_TypeFlag_Const;
|
||||
}
|
||||
if(rdi_type->flags & RDI_TypeModifierFlag_Volatile)
|
||||
{
|
||||
flags |= E_TypeFlag_Volatile;
|
||||
}
|
||||
if(rdi_type->flags & RDI_TypeModifierFlag_Restrict)
|
||||
{
|
||||
flags |= E_TypeFlag_Restrict;
|
||||
}
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->byte_size = direct_type_byte_size;
|
||||
type->flags = flags;
|
||||
type->arch = e_base_ctx->modules[rdi_idx].arch;
|
||||
}break;
|
||||
case RDI_TypeKind_Ptr:
|
||||
case RDI_TypeKind_LRef:
|
||||
case RDI_TypeKind_RRef:
|
||||
{
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].arch)/8;
|
||||
type->count = 1;
|
||||
type->arch = e_base_ctx->modules[rdi_idx].arch;
|
||||
}break;
|
||||
|
||||
case RDI_TypeKind_Array:
|
||||
// rjf: produce
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->name = push_str8_copy(arena, name);
|
||||
type->byte_size = (U64)rdi_type->byte_size;
|
||||
type->count = enum_vals_count;
|
||||
type->arch = arch;
|
||||
type->enum_vals = enum_vals;
|
||||
type->direct_type_key = direct_type_key;
|
||||
}
|
||||
|
||||
//- rjf: constructed types
|
||||
else if(RDI_TypeKind_FirstConstructed <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastConstructed)
|
||||
{
|
||||
// rjf: unpack direct type
|
||||
B32 direct_type_is_good = 0;
|
||||
E_TypeKey direct_type_key = zero_struct;
|
||||
U64 direct_type_byte_size = 0;
|
||||
if(rdi_type->constructed.direct_type_idx < type_node_idx)
|
||||
{
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->count = rdi_type->constructed.count;
|
||||
type->byte_size = direct_type_byte_size * type->count;
|
||||
type->arch = e_base_ctx->modules[rdi_idx].arch;
|
||||
}break;
|
||||
case RDI_TypeKind_Function:
|
||||
RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.direct_type_idx);
|
||||
E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);
|
||||
direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->constructed.direct_type_idx, rdi_num);
|
||||
direct_type_is_good = 1;
|
||||
direct_type_byte_size = (U64)direct_type_node->byte_size;
|
||||
}
|
||||
|
||||
// rjf: construct based on kind
|
||||
switch(rdi_type->kind)
|
||||
{
|
||||
U32 count = rdi_type->constructed.count;
|
||||
U32 idx_run_first = rdi_type->constructed.param_idx_run_first;
|
||||
U32 check_count = 0;
|
||||
U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count);
|
||||
if(check_count == count)
|
||||
case RDI_TypeKind_Modifier:
|
||||
{
|
||||
E_TypeFlags flags = 0;
|
||||
if(rdi_type->flags & RDI_TypeModifierFlag_Const)
|
||||
{
|
||||
flags |= E_TypeFlag_Const;
|
||||
}
|
||||
if(rdi_type->flags & RDI_TypeModifierFlag_Volatile)
|
||||
{
|
||||
flags |= E_TypeFlag_Volatile;
|
||||
}
|
||||
if(rdi_type->flags & RDI_TypeModifierFlag_Restrict)
|
||||
{
|
||||
flags |= E_TypeFlag_Restrict;
|
||||
}
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].arch)/8;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->count = count;
|
||||
type->param_type_keys = push_array(arena, E_TypeKey, type->count);
|
||||
type->arch = e_base_ctx->modules[rdi_idx].arch;
|
||||
for(U32 idx = 0; idx < type->count; idx += 1)
|
||||
{
|
||||
U32 param_type_idx = idx_run[idx];
|
||||
if(param_type_idx < type_node_idx)
|
||||
{
|
||||
RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx);
|
||||
E_TypeKind param_kind = e_type_kind_from_rdi(param_type_node->kind);
|
||||
type->param_type_keys[idx] = e_type_key_ext(param_kind, param_type_idx, rdi_idx);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}break;
|
||||
case RDI_TypeKind_Method:
|
||||
{
|
||||
// NOTE(rjf): for methods, the `direct` type points at the owner type.
|
||||
// the return type, instead of being encoded via the `direct` type, is
|
||||
// encoded via the first parameter.
|
||||
U32 count = rdi_type->constructed.count;
|
||||
U32 idx_run_first = rdi_type->constructed.param_idx_run_first;
|
||||
U32 check_count = 0;
|
||||
U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count);
|
||||
if(check_count == count)
|
||||
type->byte_size = direct_type_byte_size;
|
||||
type->flags = flags;
|
||||
type->arch = arch;
|
||||
}break;
|
||||
case RDI_TypeKind_Ptr:
|
||||
case RDI_TypeKind_LRef:
|
||||
case RDI_TypeKind_RRef:
|
||||
{
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].arch)/8;
|
||||
type->owner_type_key = direct_type_key;
|
||||
type->count = count;
|
||||
type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->count);
|
||||
type->arch = e_base_ctx->modules[rdi_idx].arch;
|
||||
for(U32 idx = 0; idx < type->count; idx += 1)
|
||||
{
|
||||
U32 param_type_idx = idx_run[idx];
|
||||
if(param_type_idx < type_node_idx)
|
||||
{
|
||||
RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx);
|
||||
E_TypeKind param_kind = e_type_kind_from_rdi(param_type_node->kind);
|
||||
type->param_type_keys[idx] = e_type_key_ext(param_kind, param_type_idx, rdi_idx);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(type->count > 0)
|
||||
{
|
||||
type->direct_type_key = type->param_type_keys[0];
|
||||
type->count -= 1;
|
||||
type->param_type_keys += 1;
|
||||
}
|
||||
}
|
||||
}break;
|
||||
case RDI_TypeKind_MemberPtr:
|
||||
{
|
||||
// rjf: unpack owner type
|
||||
E_TypeKey owner_type_key = zero_struct;
|
||||
if(rdi_type->constructed.owner_type_idx < type_node_idx)
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->byte_size = bit_size_from_arch(arch)/8;
|
||||
type->count = 1;
|
||||
type->arch = arch;
|
||||
}break;
|
||||
|
||||
case RDI_TypeKind_Array:
|
||||
{
|
||||
RDI_TypeNode *owner_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.owner_type_idx);
|
||||
E_TypeKind owner_type_kind = e_type_kind_from_rdi(owner_type_node->kind);
|
||||
owner_type_key = e_type_key_ext(owner_type_kind, rdi_type->constructed.owner_type_idx, rdi_idx);
|
||||
}
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].arch)/8;
|
||||
type->owner_type_key = owner_type_key;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->arch = e_base_ctx->modules[rdi_idx].arch;
|
||||
}break;
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->count = rdi_type->constructed.count;
|
||||
type->byte_size = direct_type_byte_size * type->count;
|
||||
type->arch = arch;
|
||||
}break;
|
||||
case RDI_TypeKind_Function:
|
||||
{
|
||||
U32 count = rdi_type->constructed.count;
|
||||
U32 idx_run_first = rdi_type->constructed.param_idx_run_first;
|
||||
U32 check_count = 0;
|
||||
U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count);
|
||||
if(check_count == count)
|
||||
{
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->byte_size = bit_size_from_arch(arch)/8;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->count = count;
|
||||
type->param_type_keys = push_array(arena, E_TypeKey, type->count);
|
||||
type->arch = arch;
|
||||
for(U32 idx = 0; idx < type->count; idx += 1)
|
||||
{
|
||||
U32 param_type_idx = idx_run[idx];
|
||||
if(param_type_idx < type_node_idx)
|
||||
{
|
||||
RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx);
|
||||
E_TypeKind param_kind = e_type_kind_from_rdi(param_type_node->kind);
|
||||
type->param_type_keys[idx] = e_type_key_ext(param_kind, param_type_idx, rdi_num);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}break;
|
||||
case RDI_TypeKind_Method:
|
||||
{
|
||||
// NOTE(rjf): for methods, the `direct` type points at the owner type.
|
||||
// the return type, instead of being encoded via the `direct` type, is
|
||||
// encoded via the first parameter.
|
||||
U32 count = rdi_type->constructed.count;
|
||||
U32 idx_run_first = rdi_type->constructed.param_idx_run_first;
|
||||
U32 check_count = 0;
|
||||
U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count);
|
||||
if(check_count == count)
|
||||
{
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->byte_size = bit_size_from_arch(arch)/8;
|
||||
type->owner_type_key = direct_type_key;
|
||||
type->count = count;
|
||||
type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->count);
|
||||
type->arch = arch;
|
||||
for(U32 idx = 0; idx < type->count; idx += 1)
|
||||
{
|
||||
U32 param_type_idx = idx_run[idx];
|
||||
if(param_type_idx < type_node_idx)
|
||||
{
|
||||
RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx);
|
||||
E_TypeKind param_kind = e_type_kind_from_rdi(param_type_node->kind);
|
||||
type->param_type_keys[idx] = e_type_key_ext(param_kind, param_type_idx, rdi_num);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(type->count > 0)
|
||||
{
|
||||
type->direct_type_key = type->param_type_keys[0];
|
||||
type->count -= 1;
|
||||
type->param_type_keys += 1;
|
||||
}
|
||||
}
|
||||
}break;
|
||||
case RDI_TypeKind_MemberPtr:
|
||||
{
|
||||
// rjf: unpack owner type
|
||||
E_TypeKey owner_type_key = zero_struct;
|
||||
if(rdi_type->constructed.owner_type_idx < type_node_idx)
|
||||
{
|
||||
RDI_TypeNode *owner_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.owner_type_idx);
|
||||
E_TypeKind owner_type_kind = e_type_kind_from_rdi(owner_type_node->kind);
|
||||
owner_type_key = e_type_key_ext(owner_type_kind, rdi_type->constructed.owner_type_idx, rdi_num);
|
||||
}
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->byte_size = bit_size_from_arch(arch)/8;
|
||||
type->owner_type_key = owner_type_key;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->arch = arch;
|
||||
}break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: alias types
|
||||
else if(rdi_type->kind == RDI_TypeKind_Alias)
|
||||
{
|
||||
// rjf: unpack name
|
||||
String8 name = {0};
|
||||
name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
|
||||
|
||||
// rjf: unpack direct type
|
||||
E_TypeKey direct_type_key = zero_struct;
|
||||
U64 direct_type_byte_size = 0;
|
||||
if(rdi_type->user_defined.direct_type_idx < type_node_idx)
|
||||
//- rjf: alias types
|
||||
else if(rdi_type->kind == RDI_TypeKind_Alias)
|
||||
{
|
||||
RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx);
|
||||
E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);
|
||||
direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->user_defined.direct_type_idx, rdi_idx);
|
||||
direct_type_byte_size = direct_type_node->byte_size;
|
||||
// rjf: unpack name
|
||||
String8 name = {0};
|
||||
name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
|
||||
|
||||
// rjf: unpack direct type
|
||||
E_TypeKey direct_type_key = zero_struct;
|
||||
U64 direct_type_byte_size = 0;
|
||||
if(rdi_type->user_defined.direct_type_idx < type_node_idx)
|
||||
{
|
||||
RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx);
|
||||
E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);
|
||||
direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->user_defined.direct_type_idx, rdi_num);
|
||||
direct_type_byte_size = direct_type_node->byte_size;
|
||||
}
|
||||
|
||||
// rjf: produce
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->name = push_str8_copy(arena, name);
|
||||
type->byte_size = direct_type_byte_size;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->arch = arch;
|
||||
}
|
||||
|
||||
// rjf: produce
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->name = push_str8_copy(arena, name);
|
||||
type->byte_size = direct_type_byte_size;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->arch = e_base_ctx->modules[rdi_idx].arch;
|
||||
}
|
||||
|
||||
//- rjf: bitfields
|
||||
else if(RDI_TypeKind_Bitfield == rdi_type->kind)
|
||||
{
|
||||
// rjf: unpack direct type
|
||||
E_TypeKey direct_type_key = zero_struct;
|
||||
U64 direct_type_byte_size = 0;
|
||||
if(rdi_type->bitfield.direct_type_idx < type_node_idx)
|
||||
//- rjf: bitfields
|
||||
else if(RDI_TypeKind_Bitfield == rdi_type->kind)
|
||||
{
|
||||
RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->bitfield.direct_type_idx);
|
||||
E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);
|
||||
direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->bitfield.direct_type_idx, rdi_idx);
|
||||
direct_type_byte_size = direct_type_node->byte_size;
|
||||
// rjf: unpack direct type
|
||||
E_TypeKey direct_type_key = zero_struct;
|
||||
U64 direct_type_byte_size = 0;
|
||||
if(rdi_type->bitfield.direct_type_idx < type_node_idx)
|
||||
{
|
||||
RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->bitfield.direct_type_idx);
|
||||
E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);
|
||||
direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->bitfield.direct_type_idx, rdi_num);
|
||||
direct_type_byte_size = direct_type_node->byte_size;
|
||||
}
|
||||
|
||||
// rjf: produce
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->byte_size = direct_type_byte_size;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->off = (U32)rdi_type->bitfield.off;
|
||||
type->count = (U64)rdi_type->bitfield.size;
|
||||
type->arch = arch;
|
||||
}
|
||||
|
||||
// rjf: produce
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->byte_size = direct_type_byte_size;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->off = (U32)rdi_type->bitfield.off;
|
||||
type->count = (U64)rdi_type->bitfield.size;
|
||||
type->arch = e_base_ctx->modules[rdi_idx].arch;
|
||||
}
|
||||
|
||||
//- rjf: incomplete types
|
||||
else if(RDI_TypeKind_FirstIncomplete <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastIncomplete)
|
||||
{
|
||||
// rjf: unpack name
|
||||
String8 name = {0};
|
||||
name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
|
||||
//- rjf: incomplete types
|
||||
else if(RDI_TypeKind_FirstIncomplete <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastIncomplete)
|
||||
{
|
||||
// rjf: unpack name
|
||||
String8 name = {0};
|
||||
name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
|
||||
|
||||
// rjf: produce
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->name = push_str8_copy(arena, name);
|
||||
type->arch = arch;
|
||||
}
|
||||
|
||||
// rjf: produce
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->name = push_str8_copy(arena, name);
|
||||
type->arch = e_base_ctx->modules[rdi_idx].arch;
|
||||
}
|
||||
|
||||
}
|
||||
}break;
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ internal E_EnumValArray e_enum_val_array_from_list(Arena *arena, E_EnumValList *
|
||||
//- rjf: basic key constructors
|
||||
internal E_TypeKey e_type_key_zero(void);
|
||||
internal E_TypeKey e_type_key_basic(E_TypeKind kind);
|
||||
internal E_TypeKey e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_idx);
|
||||
internal E_TypeKey e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_num);
|
||||
internal E_TypeKey e_type_key_reg(Arch arch, REGS_RegCode code);
|
||||
internal E_TypeKey e_type_key_reg_alias(Arch arch, REGS_AliasCode code);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user