helper for finding parent type

This commit is contained in:
Nikita Smith
2025-09-26 16:28:46 -07:00
parent eb4e6d2883
commit 7084320a83
2 changed files with 18 additions and 21 deletions
+13 -16
View File
@@ -106,7 +106,7 @@ d2r_find_or_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64
internal RDIM_Type * 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) 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 // find attrib
DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); 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 { } else {
Assert(!"unexpected attrib class"); 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; 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 internal Rng1U64List
d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) 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->byte_size = dw_byte_size_32_from_tag(&input, cu, tag);
type->udt = udt; type->udt = udt;
type->direct_type = d2r_type_from_attrib(arena, type_table, &input, cu, tag, DW_AttribKind_Type); type->direct_type = d2r_type_from_attrib(arena, type_table, &input, cu, tag, DW_AttribKind_Type);
tag_stack->type = type;
} }
} break; } break;
case DW_TagKind_StructureType: { case DW_TagKind_StructureType: {
@@ -1459,8 +1462,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
type->kind = RDI_TypeKind_Struct; type->kind = RDI_TypeKind_Struct;
type->udt = udt; type->udt = udt;
type->byte_size = dw_byte_size_32_from_tag(&input, cu, tag); type->byte_size = dw_byte_size_32_from_tag(&input, cu, tag);
tag_stack->type = type;
} }
} break; } break;
case DW_TagKind_UnionType: { case DW_TagKind_UnionType: {
@@ -1481,8 +1482,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
type->kind = RDI_TypeKind_Union; type->kind = RDI_TypeKind_Union;
type->byte_size = dw_byte_size_32_from_tag(&input, cu, tag); type->byte_size = dw_byte_size_32_from_tag(&input, cu, tag);
type->udt = udt; type->udt = udt;
tag_stack->type = type;
} }
} break; } break;
case DW_TagKind_EnumerationType: { case DW_TagKind_EnumerationType: {
@@ -1503,8 +1502,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
type->kind = RDI_TypeKind_Enum; type->kind = RDI_TypeKind_Enum;
type->byte_size = dw_byte_size_32_from_tag(&input, cu, tag); type->byte_size = dw_byte_size_32_from_tag(&input, cu, tag);
type->udt = udt; type->udt = udt;
tag_stack->type = type;
} }
} break; } break;
case DW_TagKind_SubroutineType: { case DW_TagKind_SubroutineType: {
@@ -1788,7 +1785,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
AssertAlways(!"unexpected parent tag"); 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); RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, parent->udt);
member->kind = RDI_MemberKind_Base; member->kind = RDI_MemberKind_Base;
member->type = d2r_type_from_attrib(arena, type_table, &input, cu, tag, DW_AttribKind_Type); 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"); 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); 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->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); 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"); 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); RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, type->udt);
member->kind = RDI_MemberKind_DataField; member->kind = RDI_MemberKind_DataField;
member->name = dw_string_from_tag_attrib_kind(&input, cu, tag, DW_AttribKind_Name); 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; //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); RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, type->udt);
member->kind = member_kind; member->kind = member_kind;
member->type = type; member->type = type;
+5 -5
View File
@@ -27,7 +27,6 @@ typedef struct D2R_TagNode
{ {
struct D2R_TagNode *next; struct D2R_TagNode *next;
DW_TagNode *cur_node; DW_TagNode *cur_node;
RDIM_Type *type;
RDIM_Scope *scope; RDIM_Scope *scope;
} D2R_TagNode; } 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 //~ rjf: Type Conversion Helpers
internal RDIM_Type *d2r_create_type(Arena *arena, D2R_TypeTable *type_table); 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_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_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 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_unsigned_type_kind_from_size(U64 byte_size);
internal RDI_TypeKind d2r_signed_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); internal RDI_EvalTypeGroup d2r_type_group_from_type_kind(RDI_TypeKind x);