mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-03 12:38:11 +00:00
finish new udt baking; pull members & enum vals out of sub-udt lists, makes it much harder to layout & parallelize - instead pull them aside into their own chunk lists, require that UDTs just point to their first member; that way we can go wide when baking UDT members/enum-vals
This commit is contained in:
@@ -2266,13 +2266,19 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
if(lane_idx() == 0)
|
||||
{
|
||||
p2r2_shared->lanes_udts = push_array(arena, RDIM_UDTChunkList, lane_count());
|
||||
p2r2_shared->lanes_members = push_array(arena, RDIM_UDTMemberChunkList, lane_count());
|
||||
p2r2_shared->lanes_enum_vals = push_array(arena, RDIM_UDTEnumValChunkList, lane_count());
|
||||
}
|
||||
lane_sync();
|
||||
|
||||
//- rjf: do wide fill
|
||||
{
|
||||
U64 udts_chunk_cap = 1024;
|
||||
U64 udts_chunk_cap = 4096;
|
||||
U64 members_chunk_cap = 4096;
|
||||
U64 enum_vals_chunk_cap = 4096;
|
||||
RDIM_UDTChunkList *udts = &p2r2_shared->lanes_udts[lane_idx()];
|
||||
RDIM_UDTMemberChunkList *members = &p2r2_shared->lanes_members[lane_idx()];
|
||||
RDIM_UDTEnumValChunkList *enum_vals = &p2r2_shared->lanes_enum_vals[lane_idx()];
|
||||
Rng1U64 range = lane_range(itype_opl);
|
||||
for EachInRange(idx, range)
|
||||
{
|
||||
@@ -2404,6 +2410,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
}
|
||||
|
||||
// rjf: process field
|
||||
RDIM_UDTMember *new_member = 0;
|
||||
switch(field_kind)
|
||||
{
|
||||
//- rjf: unhandled/invalid cases
|
||||
@@ -2459,11 +2466,12 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
next_read_ptr = name.str+name.size+1;
|
||||
|
||||
// rjf: emit member
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_DataField;
|
||||
mem->name = name;
|
||||
mem->type = p2r_type_ptr_from_itype(lf->itype);
|
||||
mem->off = (U32)offset64;
|
||||
new_member = mem;
|
||||
}break;
|
||||
|
||||
//- rjf: STMEMBER
|
||||
@@ -2480,10 +2488,11 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
next_read_ptr = name.str+name.size+1;
|
||||
|
||||
// rjf: emit member
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_StaticData;
|
||||
mem->name = name;
|
||||
mem->type = p2r_type_ptr_from_itype(lf->itype);
|
||||
new_member = mem;
|
||||
}break;
|
||||
|
||||
//- rjf: METHOD
|
||||
@@ -2557,27 +2566,30 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
{
|
||||
default:
|
||||
{
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_Method;
|
||||
mem->name = name;
|
||||
mem->type = method_type;
|
||||
new_member = mem;
|
||||
}break;
|
||||
case CV_MethodProp_Static:
|
||||
{
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_StaticMethod;
|
||||
mem->name = name;
|
||||
mem->type = method_type;
|
||||
new_member = mem;
|
||||
}break;
|
||||
case CV_MethodProp_Virtual:
|
||||
case CV_MethodProp_PureVirtual:
|
||||
case CV_MethodProp_Intro:
|
||||
case CV_MethodProp_PureIntro:
|
||||
{
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_VirtualMethod;
|
||||
mem->name = name;
|
||||
mem->type = method_type;
|
||||
new_member = mem;
|
||||
}break;
|
||||
}
|
||||
}
|
||||
@@ -2612,29 +2624,30 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
{
|
||||
default:
|
||||
{
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_Method;
|
||||
mem->name = name;
|
||||
mem->type = method_type;
|
||||
new_member = mem;
|
||||
}break;
|
||||
|
||||
case CV_MethodProp_Static:
|
||||
{
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_StaticMethod;
|
||||
mem->name = name;
|
||||
mem->type = method_type;
|
||||
new_member = mem;
|
||||
}break;
|
||||
|
||||
case CV_MethodProp_Virtual:
|
||||
case CV_MethodProp_PureVirtual:
|
||||
case CV_MethodProp_Intro:
|
||||
case CV_MethodProp_PureIntro:
|
||||
{
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_VirtualMethod;
|
||||
mem->name = name;
|
||||
mem->type = method_type;
|
||||
new_member = mem;
|
||||
}break;
|
||||
}
|
||||
}break;
|
||||
@@ -2651,10 +2664,11 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
next_read_ptr = name.str+name.size+1;
|
||||
|
||||
// rjf: emit member
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_NestedType;
|
||||
mem->name = name;
|
||||
mem->type = p2r_type_ptr_from_itype(lf->itype);
|
||||
new_member = mem;
|
||||
}break;
|
||||
|
||||
//- rjf: NESTTYPEEX
|
||||
@@ -2671,10 +2685,11 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
next_read_ptr = name.str+name.size+1;
|
||||
|
||||
// rjf: emit member
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_NestedType;
|
||||
mem->name = name;
|
||||
mem->type = p2r_type_ptr_from_itype(lf->itype);
|
||||
new_member = mem;
|
||||
}break;
|
||||
|
||||
//- rjf: BCLASS
|
||||
@@ -2692,10 +2707,11 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
next_read_ptr = offset_ptr+offset.encoded_size;
|
||||
|
||||
// rjf: emit member
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_Base;
|
||||
mem->type = p2r_type_ptr_from_itype(lf->itype);
|
||||
mem->off = (U32)offset64;
|
||||
new_member = mem;
|
||||
}break;
|
||||
|
||||
//- rjf: VBCLASS/IVBCLASS
|
||||
@@ -2717,9 +2733,10 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
next_read_ptr = (U8 *)(lf+1);
|
||||
|
||||
// rjf: emit member
|
||||
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
|
||||
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
|
||||
mem->kind = RDI_MemberKind_VirtualBase;
|
||||
mem->type = p2r_type_ptr_from_itype(lf->itype);
|
||||
new_member = mem;
|
||||
}break;
|
||||
|
||||
//- rjf: VFUNCTAB
|
||||
@@ -2735,6 +2752,16 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
}break;
|
||||
}
|
||||
|
||||
// rjf: add member to UDT
|
||||
if(new_member != 0)
|
||||
{
|
||||
if(dst_udt->first_member == 0)
|
||||
{
|
||||
dst_udt->first_member = new_member;
|
||||
}
|
||||
dst_udt->member_count += 1;
|
||||
}
|
||||
|
||||
// rjf: align-up next field
|
||||
next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4);
|
||||
}
|
||||
@@ -2825,6 +2852,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
}
|
||||
|
||||
// rjf: process field
|
||||
RDIM_UDTEnumVal *new_enum_val = 0;
|
||||
switch(field_kind)
|
||||
{
|
||||
//- rjf: unhandled/invalid cases
|
||||
@@ -2877,12 +2905,23 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
next_read_ptr = name.str+name.size+1;
|
||||
|
||||
// rjf: emit member
|
||||
RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, udts, dst_udt);
|
||||
RDIM_UDTEnumVal *enum_val = rdim_udt_enum_val_chunk_list_push(arena, enum_vals, enum_vals_chunk_cap);
|
||||
enum_val->name = name;
|
||||
enum_val->val = val64;
|
||||
new_enum_val = enum_val;
|
||||
}break;
|
||||
}
|
||||
|
||||
// rjf: push new enum val to udt
|
||||
if(new_enum_val != 0)
|
||||
{
|
||||
if(dst_udt->first_enum_val == 0)
|
||||
{
|
||||
dst_udt->first_enum_val = new_enum_val;
|
||||
}
|
||||
dst_udt->enum_val_count += 1;
|
||||
}
|
||||
|
||||
// rjf: align-up next field
|
||||
next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4);
|
||||
}
|
||||
@@ -2898,6 +2937,8 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
}
|
||||
lane_sync();
|
||||
RDIM_UDTChunkList *lanes_udts = p2r2_shared->lanes_udts;
|
||||
RDIM_UDTMemberChunkList *lanes_members = p2r2_shared->lanes_members;
|
||||
RDIM_UDTEnumValChunkList *lanes_enum_vals = p2r2_shared->lanes_enum_vals;
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
//- rjf: join all UDTs
|
||||
@@ -2907,10 +2948,14 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
for EachIndex(idx, lane_count())
|
||||
{
|
||||
rdim_udt_chunk_list_concat_in_place(&p2r2_shared->all_udts, &lanes_udts[idx]);
|
||||
rdim_udt_member_chunk_list_concat_in_place(&p2r2_shared->all_members, &lanes_members[idx]);
|
||||
rdim_udt_enum_val_chunk_list_concat_in_place(&p2r2_shared->all_enum_vals, &lanes_enum_vals[idx]);
|
||||
}
|
||||
}
|
||||
lane_sync();
|
||||
RDIM_UDTChunkList all_udts = p2r2_shared->all_udts;
|
||||
RDIM_UDTMemberChunkList all_members = p2r2_shared->all_members;
|
||||
RDIM_UDTEnumValChunkList all_enum_vals = p2r2_shared->all_enum_vals;
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
//- rjf: produce symbols from all streams
|
||||
@@ -3957,6 +4002,8 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
|
||||
result.units = all_units;
|
||||
result.types = all_types;
|
||||
result.udts = all_udts;
|
||||
result.members = all_members;
|
||||
result.enum_vals = all_enum_vals;
|
||||
result.src_files = all_src_files;
|
||||
result.line_tables = all_line_tables;
|
||||
result.global_variables = all_global_variables;
|
||||
|
||||
@@ -111,8 +111,12 @@ struct P2R2_Shared
|
||||
RDIM_TypeChunkList all_types__pre_typedefs;
|
||||
|
||||
RDIM_UDTChunkList *lanes_udts;
|
||||
RDIM_UDTMemberChunkList *lanes_members;
|
||||
RDIM_UDTEnumValChunkList *lanes_enum_vals;
|
||||
|
||||
RDIM_UDTChunkList all_udts;
|
||||
RDIM_UDTMemberChunkList all_members;
|
||||
RDIM_UDTEnumValChunkList all_enum_vals;
|
||||
|
||||
RDIM_SymbolChunkList *lanes_procedures;
|
||||
RDIM_SymbolChunkList *lanes_global_variables;
|
||||
|
||||
Reference in New Issue
Block a user