mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-09 11:01:37 -07:00
raddbgi: correctly encode bitfields; type_graph: correctly stringify bitfield types
This commit is contained in:
@@ -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};
|
||||
|
||||
@@ -533,6 +533,7 @@ typedef struct RDI_TypeNode{
|
||||
|
||||
// (kind = Bitfield)
|
||||
struct{
|
||||
RDI_U32 direct_type_idx;
|
||||
RDI_U32 off;
|
||||
RDI_U32 size;
|
||||
} bitfield;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user