raddbgi: correctly encode bitfields; type_graph: correctly stringify bitfield types

This commit is contained in:
Ryan Fleury
2024-03-29 09:22:13 -07:00
parent d9675f2565
commit 60e1f105e4
4 changed files with 33 additions and 5 deletions
+2 -2
View File
@@ -5785,7 +5785,7 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly)
//
DF_Entity *process = df_entity_from_handle(dv->process);
Architecture arch = df_architecture_from_entity(process);
U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(4));
U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(64));
Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64));
U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0);
U128 dasm_data_hash = {0};
@@ -6021,7 +6021,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly)
//
DF_Entity *process = df_entity_from_handle(dv->process);
Architecture arch = df_architecture_from_entity(process);
U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(4));
U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(64));
Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64));
U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0);
U128 dasm_data_hash = {0};
+1
View File
@@ -533,6 +533,7 @@ typedef struct RDI_TypeNode{
// (kind = Bitfield)
struct{
RDI_U32 direct_type_idx;
RDI_U32 off;
RDI_U32 size;
} bitfield;
+1
View File
@@ -2763,6 +2763,7 @@ rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringM
//- rjf: fill bitfield info
else if(dst->kind == RDI_TypeKind_Bitfield)
{
dst->bitfield.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32
dst->bitfield.off = src->off;
dst->bitfield.size = src->count;
}
+29 -3
View File
@@ -440,7 +440,7 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Ke
}
//- rjf: constructed types
if(RDI_TypeKind_FirstConstructed <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastConstructed)
else if(RDI_TypeKind_FirstConstructed <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastConstructed)
{
// rjf: unpack direct type
B32 direct_type_is_good = 0;
@@ -607,6 +607,29 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Ke
type->direct_type_key = direct_type_key;
}
//- rjf: bitfields
else if(RDI_TypeKind_Bitfield == rdi_type->kind)
{
// rjf: unpack direct type
TG_Key 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->type_nodes[rdi_type->bitfield.direct_type_idx];
TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind);
direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->bitfield.direct_type_idx);
direct_type_byte_size = direct_type_node->byte_size;
}
// rjf: produce
type = push_array(arena, TG_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;
}
//- rjf: incomplete types
else if(RDI_TypeKind_FirstIncomplete <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastIncomplete)
{
@@ -1257,8 +1280,11 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key ke
case TG_Kind_Bitfield:
{
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_rhs_string_from_key(arena, graph, rdi, direct, out, prec);
Temp scratch = scratch_begin(&arena, 1);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
tg_rhs_string_from_key(arena, graph, rdi, type->direct_type_key, out, prec);
str8_list_pushf(arena, out, ": %I64u", type->count);
scratch_end(scratch);
}break;
case TG_Kind_Modifier: