From a84142ed771f89659ba67be58a987a8acf6cb424 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 4 Sep 2025 11:58:36 -0700 Subject: [PATCH] re-nest enum vals & members into udts; we want to keep the building API flexible with order of member building, and we can assume ~statistically-uniform distribution across all udts, so it makes more sense to just parallelize on udts, and pay the small cost of an upfront per-lane layout. --- src/lib_rdi_make/rdi_make.c | 44 ------------------------- src/lib_rdi_make/rdi_make.h | 54 ------------------------------- src/rdi_from_pdb/rdi_from_pdb_2.c | 40 ++++++++--------------- src/rdi_from_pdb/rdi_from_pdb_2.h | 4 --- src/rdi_make/rdi_make_local_2.c | 38 +++++++++++++--------- 5 files changed, 35 insertions(+), 145 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 715211a7..ce468cc9 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -837,50 +837,6 @@ rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList RDIM_IdxedChunkListConcatInPlace(RDIM_TypeChunkNode, dst, to_push); } -//- rjf: UDT members - -RDI_PROC RDIM_UDTMember * -rdim_udt_member_chunk_list_push(RDIM_Arena *arena, RDIM_UDTMemberChunkList *list, RDI_U64 cap) -{ - RDIM_IdxedChunkListPush(arena, list, RDIM_UDTMemberChunkNode, RDIM_UDTMember, cap, result); - return result; -} - -RDI_PROC RDI_U64 -rdim_idx_from_udt_member(RDIM_UDTMember *member) -{ - RDIM_IdxedChunkListElementGetIdx(member, idx); - return idx; -} - -RDI_PROC void -rdim_udt_member_chunk_list_concat_in_place(RDIM_UDTMemberChunkList *dst, RDIM_UDTMemberChunkList *to_push) -{ - RDIM_IdxedChunkListConcatInPlace(RDIM_UDTMemberChunkNode, dst, to_push); -} - -//- rjf: UDT enum values - -RDI_PROC RDIM_UDTEnumVal * -rdim_udt_enum_val_chunk_list_push(RDIM_Arena *arena, RDIM_UDTEnumValChunkList *list, RDI_U64 cap) -{ - RDIM_IdxedChunkListPush(arena, list, RDIM_UDTEnumValChunkNode, RDIM_UDTEnumVal, cap, result); - return result; -} - -RDI_PROC RDI_U64 -rdim_idx_from_udt_enum_val(RDIM_UDTEnumVal *enum_val) -{ - RDIM_IdxedChunkListElementGetIdx(enum_val, idx); - return idx; -} - -RDI_PROC void -rdim_udt_enum_val_chunk_list_concat_in_place(RDIM_UDTEnumValChunkList *dst, RDIM_UDTEnumValChunkList *to_push) -{ - RDIM_IdxedChunkListConcatInPlace(RDIM_UDTEnumValChunkNode, dst, to_push); -} - //- rjf: UDTs RDI_PROC RDIM_UDT * diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index a81271cb..db7aea55 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -723,7 +723,6 @@ struct RDIM_TypeChunkList typedef struct RDIM_UDTMember RDIM_UDTMember; struct RDIM_UDTMember { - struct RDIM_UDTMemberChunkNode *chunk; RDIM_UDTMember *next; RDI_MemberKind kind; RDIM_String8 name; @@ -731,55 +730,16 @@ struct RDIM_UDTMember RDI_U32 off; }; -typedef struct RDIM_UDTMemberChunkNode RDIM_UDTMemberChunkNode; -struct RDIM_UDTMemberChunkNode -{ - RDIM_UDTMemberChunkNode *next; - RDIM_UDTMember *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_UDTMemberChunkList RDIM_UDTMemberChunkList; -struct RDIM_UDTMemberChunkList -{ - RDIM_UDTMemberChunkNode *first; - RDIM_UDTMemberChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; -}; - //- rjf: UDT enum values typedef struct RDIM_UDTEnumVal RDIM_UDTEnumVal; struct RDIM_UDTEnumVal { - struct RDIM_UDTEnumValChunkNode *chunk; RDIM_UDTEnumVal *next; RDIM_String8 name; RDI_U64 val; }; -typedef struct RDIM_UDTEnumValChunkNode RDIM_UDTEnumValChunkNode; -struct RDIM_UDTEnumValChunkNode -{ - RDIM_UDTEnumValChunkNode *next; - RDIM_UDTEnumVal *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_UDTEnumValChunkList RDIM_UDTEnumValChunkList; -struct RDIM_UDTEnumValChunkList -{ - RDIM_UDTEnumValChunkNode *first; - RDIM_UDTEnumValChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; -}; - //- rjf: UDTs typedef struct RDIM_UDT RDIM_UDT; @@ -1078,8 +1038,6 @@ struct RDIM_BakeParams RDIM_UnitChunkList units; RDIM_TypeChunkList types; RDIM_UDTChunkList udts; - RDIM_UDTMemberChunkList members; - RDIM_UDTEnumValChunkList enum_vals; RDIM_SrcFileChunkList src_files; RDIM_LineTableChunkList line_tables; RDIM_LocationChunkList locations; @@ -1718,22 +1676,10 @@ RDI_PROC RDIM_Type *rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkL RDI_PROC RDI_U64 rdim_idx_from_type(RDIM_Type *type); RDI_PROC void rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push); -//- rjf: UDT members -RDI_PROC RDIM_UDTMember *rdim_udt_member_chunk_list_push(RDIM_Arena *arena, RDIM_UDTMemberChunkList *list, RDI_U64 cap); -RDI_PROC RDI_U64 rdim_idx_from_udt_member(RDIM_UDTMember *member); -RDI_PROC void rdim_udt_member_chunk_list_concat_in_place(RDIM_UDTMemberChunkList *dst, RDIM_UDTMemberChunkList *to_push); - -//- rjf: UDT enum values -RDI_PROC RDIM_UDTEnumVal *rdim_udt_enum_val_chunk_list_push(RDIM_Arena *arena, RDIM_UDTEnumValChunkList *list, RDI_U64 cap); -RDI_PROC RDI_U64 rdim_idx_from_udt_enum_val(RDIM_UDTEnumVal *enum_val); -RDI_PROC void rdim_udt_enum_val_chunk_list_concat_in_place(RDIM_UDTEnumValChunkList *dst, RDIM_UDTEnumValChunkList *to_push); - //- rjf: UDTs RDI_PROC RDIM_UDT *rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap); RDI_PROC RDI_U64 rdim_idx_from_udt(RDIM_UDT *udt); RDI_PROC void rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push); - -//- TODO(rjf): to be removed: RDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); diff --git a/src/rdi_from_pdb/rdi_from_pdb_2.c b/src/rdi_from_pdb/rdi_from_pdb_2.c index 2a6f50e7..3ece1c98 100644 --- a/src/rdi_from_pdb/rdi_from_pdb_2.c +++ b/src/rdi_from_pdb/rdi_from_pdb_2.c @@ -2171,19 +2171,13 @@ 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 = 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) { @@ -2371,7 +2365,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_DataField; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -2393,7 +2387,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_StaticData; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -2471,7 +2465,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) { default: { - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_Method; mem->name = name; mem->type = method_type; @@ -2479,7 +2473,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) }break; case CV_MethodProp_Static: { - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_StaticMethod; mem->name = name; mem->type = method_type; @@ -2490,7 +2484,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) case CV_MethodProp_Intro: case CV_MethodProp_PureIntro: { - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_VirtualMethod; mem->name = name; mem->type = method_type; @@ -2529,7 +2523,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) { default: { - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_Method; mem->name = name; mem->type = method_type; @@ -2537,7 +2531,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) }break; case CV_MethodProp_Static: { - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_StaticMethod; mem->name = name; mem->type = method_type; @@ -2548,7 +2542,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) case CV_MethodProp_Intro: case CV_MethodProp_PureIntro: { - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_VirtualMethod; mem->name = name; mem->type = method_type; @@ -2569,7 +2563,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_NestedType; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -2590,7 +2584,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_NestedType; mem->name = name; mem->type = p2r_type_ptr_from_itype(lf->itype); @@ -2612,7 +2606,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) next_read_ptr = offset_ptr+offset.encoded_size; // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_Base; mem->type = p2r_type_ptr_from_itype(lf->itype); mem->off = (U32)offset64; @@ -2638,7 +2632,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) next_read_ptr = (U8 *)(lf+1); // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap); + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); mem->kind = RDI_MemberKind_VirtualBase; mem->type = p2r_type_ptr_from_itype(lf->itype); new_member = mem; @@ -2810,7 +2804,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) next_read_ptr = name.str+name.size+1; // rjf: emit member - RDIM_UDTEnumVal *enum_val = rdim_udt_enum_val_chunk_list_push(arena, enum_vals, enum_vals_chunk_cap); + RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, udts, dst_udt); enum_val->name = name; enum_val->val = val64; new_enum_val = enum_val; @@ -2842,8 +2836,6 @@ 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 @@ -2853,14 +2845,10 @@ 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 @@ -3934,8 +3922,6 @@ 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.locations = all_locations; diff --git a/src/rdi_from_pdb/rdi_from_pdb_2.h b/src/rdi_from_pdb/rdi_from_pdb_2.h index 0c0a4fc8..47b0cd06 100644 --- a/src/rdi_from_pdb/rdi_from_pdb_2.h +++ b/src/rdi_from_pdb/rdi_from_pdb_2.h @@ -84,12 +84,8 @@ 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_LocationChunkList *syms_locations; RDIM_LocationCaseChunkList *syms_location_cases; diff --git a/src/rdi_make/rdi_make_local_2.c b/src/rdi_make/rdi_make_local_2.c index b1453e6c..f2e43fc4 100644 --- a/src/rdi_make/rdi_make_local_2.c +++ b/src/rdi_make/rdi_make_local_2.c @@ -766,23 +766,23 @@ rdim2_bake(Arena *arena, RDIM_BakeParams *params) } } - // rjf: push strings from udt members - ProfScope("udt members") + // rjf: push strings from udts + ProfScope("udts") { - for EachNode(n, RDIM_UDTMemberChunkNode, params->members.first) + for EachNode(n, RDIM_UDTChunkNode, params->udts.first) { Rng1U64 range = lane_range(n->count); - rdim_bake_string_map_loose_push_udt_member_slice(arena, lane_map_top, lane_map, n->v + range.min, dim_1u64(range)); - } - } - - // rjf: push strings from udt enum values - ProfScope("udt enum values") - { - for EachNode(n, RDIM_UDTEnumValChunkNode, params->enum_vals.first) - { - Rng1U64 range = lane_range(n->count); - rdim_bake_string_map_loose_push_udt_enum_val_slice(arena, lane_map_top, lane_map, n->v + range.min, dim_1u64(range)); + for EachInRange(idx, range) + { + for EachNode(mem, RDIM_UDTMember, n->v[idx].first_member) + { + rdim_bake_string_map_loose_insert(arena, lane_map_top, lane_map, 4, mem->name); + } + for EachNode(enum_val, RDIM_UDTEnumVal, n->v[idx].first_enum_val) + { + rdim_bake_string_map_loose_insert(arena, lane_map_top, lane_map, 4, enum_val->name); + } + } } } @@ -1808,12 +1808,12 @@ rdim2_bake(Arena *arena, RDIM_BakeParams *params) } if(lane_idx() == lane_from_task_idx(3)) { - rdim2_shared->baked_udts.members_count = params->members.total_count+1; + rdim2_shared->baked_udts.members_count = params->udts.total_member_count+1; rdim2_shared->baked_udts.members = push_array(arena, RDI_Member, rdim2_shared->baked_udts.members_count); } if(lane_idx() == lane_from_task_idx(4)) { - rdim2_shared->baked_udts.enum_members_count = params->enum_vals.total_count+1; + rdim2_shared->baked_udts.enum_members_count = params->udts.total_enum_val_count+1; rdim2_shared->baked_udts.enum_members = push_array(arena, RDI_EnumMember, rdim2_shared->baked_udts.enum_members_count); } if(lane_idx() == lane_from_task_idx(5)) @@ -1960,6 +1960,7 @@ rdim2_bake(Arena *arena, RDIM_BakeParams *params) } //- rjf: bake UDT members +#if 0 ProfScope("bake UDT members") { for EachNode(n, RDIM_UDTMemberChunkNode, params->members.first) @@ -1992,6 +1993,7 @@ rdim2_bake(Arena *arena, RDIM_BakeParams *params) } } } +#endif //- rjf: bake UDTs ProfScope("bake UDTs") @@ -2011,19 +2013,23 @@ rdim2_bake(Arena *arena, RDIM_BakeParams *params) dst_udt->col = src_udt->col; //- rjf: fill member info +#if 0 if(src_udt->member_count != 0) { dst_udt->member_first = rdim_idx_from_udt_member(src_udt->first_member); dst_udt->member_count = src_udt->member_count; } +#endif //- rjf: fill enum members +#if 0 else if(src_udt->enum_val_count != 0) { dst_udt->flags |= RDI_UDTFlag_EnumMembers; dst_udt->member_first = rdim_idx_from_udt_enum_val(src_udt->first_enum_val); dst_udt->member_count = src_udt->enum_val_count; } +#endif } } }