diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 15b65416..65286173 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -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}; diff --git a/src/lib_raddbgi_format/raddbgi_format.h b/src/lib_raddbgi_format/raddbgi_format.h index 6f89ccca..16a03d44 100644 --- a/src/lib_raddbgi_format/raddbgi_format.h +++ b/src/lib_raddbgi_format/raddbgi_format.h @@ -533,6 +533,7 @@ typedef struct RDI_TypeNode{ // (kind = Bitfield) struct{ + RDI_U32 direct_type_idx; RDI_U32 off; RDI_U32 size; } bitfield; diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 88026e8b..7f15dcbe 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -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; } diff --git a/src/type_graph/type_graph.c b/src/type_graph/type_graph.c index 30661277..16558851 100644 --- a/src/type_graph/type_graph.c +++ b/src/type_graph/type_graph.c @@ -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: