mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
helper for finding parent type
This commit is contained in:
@@ -106,7 +106,7 @@ d2r_find_or_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64
|
||||
internal RDIM_Type *
|
||||
d2r_type_from_attrib(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)
|
||||
{
|
||||
RDIM_Type *type = 0;
|
||||
RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_NULL];
|
||||
|
||||
// find attrib
|
||||
DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind);
|
||||
@@ -127,14 +127,19 @@ d2r_type_from_attrib(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, D
|
||||
} else {
|
||||
Assert(!"unexpected attrib class");
|
||||
}
|
||||
} else if (attrib->attrib_kind == DW_AttribKind_Null) {
|
||||
// TODO(rjf):
|
||||
// type = rdim_builtin_type_from_kind(*type_table->types, RDI_TypeKind_NULL);
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
internal RDIM_Type *
|
||||
d2r_infer_parent_type(DW_CompUnit *cu, D2R_TagNode *tag_stack)
|
||||
{
|
||||
D2R_TagNode *parent = tag_stack->next;
|
||||
RDIM_Type *type = hash_table_search_u64_raw(cu->tag_ht, parent->cur_node->tag.info_off);
|
||||
return type;
|
||||
}
|
||||
|
||||
internal Rng1U64List
|
||||
d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag)
|
||||
{
|
||||
@@ -1437,8 +1442,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
|
||||
type->byte_size = dw_byte_size_32_from_tag(&input, cu, tag);
|
||||
type->udt = udt;
|
||||
type->direct_type = d2r_type_from_attrib(arena, type_table, &input, cu, tag, DW_AttribKind_Type);
|
||||
|
||||
tag_stack->type = type;
|
||||
}
|
||||
} break;
|
||||
case DW_TagKind_StructureType: {
|
||||
@@ -1459,8 +1462,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
|
||||
type->kind = RDI_TypeKind_Struct;
|
||||
type->udt = udt;
|
||||
type->byte_size = dw_byte_size_32_from_tag(&input, cu, tag);
|
||||
|
||||
tag_stack->type = type;
|
||||
}
|
||||
} break;
|
||||
case DW_TagKind_UnionType: {
|
||||
@@ -1481,8 +1482,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
|
||||
type->kind = RDI_TypeKind_Union;
|
||||
type->byte_size = dw_byte_size_32_from_tag(&input, cu, tag);
|
||||
type->udt = udt;
|
||||
|
||||
tag_stack->type = type;
|
||||
}
|
||||
} break;
|
||||
case DW_TagKind_EnumerationType: {
|
||||
@@ -1503,8 +1502,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
|
||||
type->kind = RDI_TypeKind_Enum;
|
||||
type->byte_size = dw_byte_size_32_from_tag(&input, cu, tag);
|
||||
type->udt = udt;
|
||||
|
||||
tag_stack->type = type;
|
||||
}
|
||||
} break;
|
||||
case DW_TagKind_SubroutineType: {
|
||||
@@ -1788,7 +1785,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
|
||||
AssertAlways(!"unexpected parent tag");
|
||||
}
|
||||
|
||||
RDIM_Type *parent = tag_stack->next->type;
|
||||
RDIM_Type *parent = d2r_infer_parent_type(cu, tag_stack);
|
||||
RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, parent->udt);
|
||||
member->kind = RDI_MemberKind_Base;
|
||||
member->type = d2r_type_from_attrib(arena, type_table, &input, cu, tag, DW_AttribKind_Type);
|
||||
@@ -1801,7 +1798,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
|
||||
AssertAlways(!"unexpected parent tag");
|
||||
}
|
||||
|
||||
RDIM_Type *type = tag_stack->next->type;
|
||||
RDIM_Type *type = d2r_infer_parent_type(cu, tag_stack);
|
||||
RDIM_UDTEnumVal *member = rdim_udt_push_enum_val(arena, &udts, type->udt);
|
||||
member->name = dw_string_from_tag_attrib_kind(&input, cu, tag, DW_AttribKind_Name);
|
||||
member->val = dw_const_u64_from_tag_attrib_kind(&input, cu, tag, DW_AttribKind_ConstValue);
|
||||
@@ -1822,7 +1819,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
|
||||
AssertAlways(!"UDT member with multiple locations are not supported");
|
||||
}
|
||||
|
||||
RDIM_Type *type = tag_stack->next->type;
|
||||
RDIM_Type *type = d2r_infer_parent_type(cu, tag_stack);
|
||||
RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, type->udt);
|
||||
member->kind = RDI_MemberKind_DataField;
|
||||
member->name = dw_string_from_tag_attrib_kind(&input, cu, tag, DW_AttribKind_Name);
|
||||
@@ -1886,7 +1883,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
|
||||
//default: InvalidPath; break;
|
||||
}
|
||||
|
||||
RDIM_Type *type = tag_stack->next->type;
|
||||
RDIM_Type *type = d2r_infer_parent_type(cu, tag_stack);
|
||||
RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, type->udt);
|
||||
member->kind = member_kind;
|
||||
member->type = type;
|
||||
|
||||
@@ -27,7 +27,6 @@ typedef struct D2R_TagNode
|
||||
{
|
||||
struct D2R_TagNode *next;
|
||||
DW_TagNode *cur_node;
|
||||
RDIM_Type *type;
|
||||
RDIM_Scope *scope;
|
||||
} D2R_TagNode;
|
||||
|
||||
@@ -49,11 +48,12 @@ internal RDI_RegCode d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v);
|
||||
////////////////////////////////
|
||||
//~ rjf: Type Conversion Helpers
|
||||
|
||||
internal RDIM_Type *d2r_create_type(Arena *arena, D2R_TypeTable *type_table);
|
||||
internal RDIM_Type *d2r_find_or_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off);
|
||||
internal RDIM_Type *d2r_type_from_attrib(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);
|
||||
internal RDIM_Type * d2r_create_type(Arena *arena, D2R_TypeTable *type_table);
|
||||
internal RDIM_Type * d2r_find_or_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off);
|
||||
internal RDIM_Type * d2r_type_from_attrib(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);
|
||||
internal RDIM_Type * d2r_infer_parent_type(DW_CompUnit *cu, D2R_TagNode *tag_stack);
|
||||
internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag);
|
||||
internal RDIM_Type **d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out);
|
||||
internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out);
|
||||
internal RDI_TypeKind d2r_unsigned_type_kind_from_size(U64 byte_size);
|
||||
internal RDI_TypeKind d2r_signed_type_kind_from_size(U64 byte_size);
|
||||
internal RDI_EvalTypeGroup d2r_type_group_from_type_kind(RDI_TypeKind x);
|
||||
|
||||
Reference in New Issue
Block a user