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:
Ryan Fleury
2025-09-05 15:19:29 -07:00
parent b8414c4bfd
commit e4ac3febd0
5 changed files with 236 additions and 55 deletions
+112
View File
@@ -840,6 +840,8 @@ rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList
////////////////////////////////
//~ rjf: [Building] Type Info Building
//- rjf: type nodes
RDI_PROC RDIM_Type **
rdim_array_from_type_list(RDIM_Arena *arena, RDIM_TypeList list)
{
@@ -914,6 +916,116 @@ rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList
rdim_memzero_struct(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_UDTMemberChunkNode *n = list->last;
if(n == 0 || n->count >= n->cap)
{
n = rdim_push_array(arena, RDIM_UDTMemberChunkNode, 1);
n->cap = cap;
n->base_idx = list->total_count;
n->v = rdim_push_array(arena, RDIM_UDTMember, n->cap);
RDIM_SLLQueuePush(list->first, list->last, n);
list->chunk_count += 1;
}
RDIM_UDTMember *result = &n->v[n->count];
result->chunk = n;
n->count += 1;
list->total_count += 1;
return result;
}
RDI_PROC RDI_U64
rdim_idx_from_udt_member(RDIM_UDTMember *member)
{
RDI_U64 idx = 0;
if(member != 0 && member->chunk != 0)
{
idx = member->chunk->base_idx + (member - member->chunk->v) + 1;
}
return idx;
}
RDI_PROC void
rdim_udt_member_chunk_list_concat_in_place(RDIM_UDTMemberChunkList *dst, RDIM_UDTMemberChunkList *to_push)
{
for(RDIM_UDTMemberChunkNode *n = to_push->first; n != 0; n = n->next)
{
n->base_idx += dst->total_count;
}
if(dst->last != 0 && to_push->first != 0)
{
dst->last->next = to_push->first;
dst->last = to_push->last;
dst->chunk_count += to_push->chunk_count;
dst->total_count += to_push->total_count;
}
else if(dst->first == 0)
{
rdim_memcpy_struct(dst, to_push);
}
rdim_memzero_struct(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_UDTEnumValChunkNode *n = list->last;
if(n == 0 || n->count >= n->cap)
{
n = rdim_push_array(arena, RDIM_UDTEnumValChunkNode, 1);
n->cap = cap;
n->base_idx = list->total_count;
n->v = rdim_push_array(arena, RDIM_UDTEnumVal, n->cap);
RDIM_SLLQueuePush(list->first, list->last, n);
list->chunk_count += 1;
}
RDIM_UDTEnumVal *result = &n->v[n->count];
result->chunk = n;
n->count += 1;
list->total_count += 1;
return result;
}
RDI_PROC RDI_U64
rdim_idx_from_udt_enum_val(RDIM_UDTEnumVal *enum_val)
{
RDI_U64 idx = 0;
if(enum_val != 0 && enum_val->chunk != 0)
{
idx = enum_val->chunk->base_idx + (enum_val - enum_val->chunk->v) + 1;
}
return idx;
}
RDI_PROC void
rdim_udt_enum_val_chunk_list_concat_in_place(RDIM_UDTEnumValChunkList *dst, RDIM_UDTEnumValChunkList *to_push)
{
for(RDIM_UDTEnumValChunkNode *n = to_push->first; n != 0; n = n->next)
{
n->base_idx += dst->total_count;
}
if(dst->last != 0 && to_push->first != 0)
{
dst->last->next = to_push->first;
dst->last = to_push->last;
dst->chunk_count += to_push->chunk_count;
dst->total_count += to_push->total_count;
}
else if(dst->first == 0)
{
rdim_memcpy_struct(dst, to_push);
}
rdim_memzero_struct(to_push);
}
//- rjf: UDTs
RDI_PROC RDIM_UDT *
rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap)
{
+18 -14
View File
@@ -723,6 +723,7 @@ 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;
@@ -730,13 +731,6 @@ struct RDIM_UDTMember
RDI_U32 off;
};
typedef struct RDIM_UDTMemberNode RDIM_UDTMemberNode;
struct RDIM_UDTMemberNode
{
RDIM_UDTMemberNode *next;
RDIM_UDTMember *v;
};
typedef struct RDIM_UDTMemberChunkNode RDIM_UDTMemberChunkNode;
struct RDIM_UDTMemberChunkNode
{
@@ -761,18 +755,12 @@ struct RDIM_UDTMemberChunkList
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_UDTEnumValNode RDIM_UDTEnumValNode;
struct RDIM_UDTEnumValNode
{
RDIM_UDTEnumValNode *next;
RDIM_UDTEnumVal *v;
};
typedef struct RDIM_UDTEnumValChunkNode RDIM_UDTEnumValChunkNode;
struct RDIM_UDTEnumValChunkNode
{
@@ -1012,6 +1000,8 @@ 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_SymbolChunkList global_variables;
@@ -1636,12 +1626,26 @@ RDI_PROC void rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM
////////////////////////////////
//~ rjf: [Building] Type Info & UDT Building
//- rjf: type nodes
RDI_PROC RDIM_Type *rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap);
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);
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);