location info baking

This commit is contained in:
Ryan Fleury
2025-09-05 15:19:29 -07:00
parent 71cbdba76e
commit 3b1aae44d0
6 changed files with 309 additions and 26 deletions
+82 -4
View File
@@ -983,16 +983,94 @@ rdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkList *dst, RDIM_
////////////////////////////////
//~ rjf: [Building] Location Info Building
RDI_PROC RDIM_Location *
rdim_location_chunk_list_push_new(RDIM_Arena *arena, RDIM_LocationChunkList *list, RDI_U64 cap, RDIM_Location *loc)
RDI_PROC RDI_U64
rdim_encoded_size_from_location_info(RDIM_LocationInfo *info)
{
RDI_U64 result = 0;
switch((RDI_LocationKindEnum)info->kind)
{
case RDI_LocationKind_NULL:{}break;
case RDI_LocationKind_AddrBytecodeStream:
case RDI_LocationKind_ValBytecodeStream:
{
result = sizeof(RDI_LocationBytecodeStream) + info->bytecode.encoded_size + 1;
}break;
case RDI_LocationKind_AddrRegPlusU16:
case RDI_LocationKind_AddrAddrRegPlusU16:
{
result = sizeof(RDI_LocationRegPlusU16);
}break;
case RDI_LocationKind_ValReg:
{
result = sizeof(RDI_LocationReg);
}break;
}
return result;
}
RDI_PROC RDIM_Location2 *
rdim_location_chunk_list_push_new(RDIM_Arena *arena, RDIM_LocationChunkList *list, RDI_U64 cap, RDIM_LocationInfo *info)
{
RDIM_IdxedChunkListPush(arena, list, RDIM_LocationChunkNode, RDIM_Location2, cap, result);
{
RDI_U64 encoded_size = rdim_encoded_size_from_location_info(info);
rdim_memcpy_struct(&result->info, info);
result->relative_encoding_off = list->last->encoded_size;
list->last->encoded_size += encoded_size;
list->total_encoded_size += encoded_size;
}
return result;
}
RDI_PROC RDI_U64
rdim_idx_from_location(RDIM_Location2 *location)
{
RDIM_IdxedChunkListElementGetIdx(location, idx);
return idx;
}
RDI_PROC RDI_U64
rdim_off_from_location(RDIM_Location2 *location)
{
RDI_U64 off = 0;
if(location != 0 && location->chunk != 0)
{
off = location->chunk->base_encoding_off + location->relative_encoding_off + 1;
}
return off;
}
RDI_PROC void
rdim_location_chunk_list_concat_in_place(RDIM_LocationChunkList *dst, RDIM_LocationChunkList *to_push)
{
for(RDIM_LocationChunkNode *n = to_push->first; n != 0; n = n->next)
{
n->base_encoding_off += dst->total_encoded_size;
}
RDIM_IdxedChunkListConcatInPlace(RDIM_LocationChunkNode, dst, to_push, dst->total_encoded_size += to_push->total_encoded_size);
}
RDI_PROC RDIM_LocationCase2 *
rdim_location_case_chunk_list_push(RDIM_Arena *arena, RDIM_LocationCaseChunkList *list, RDI_U64 cap)
{
RDIM_IdxedChunkListPush(arena, list, RDIM_LocationCaseChunkNode, RDIM_LocationCase2, cap, result);
return result;
}
RDI_PROC RDI_U64
rdim_idx_from_location_case(RDIM_LocationCase2 *location_case)
{
RDIM_IdxedChunkListElementGetIdx(location_case, idx);
return idx;
}
RDI_PROC void
rdim_location_case_chunk_list_concat_in_place(RDIM_LocationCaseChunkList *dst, RDIM_LocationCaseChunkList *to_push)
{
RDIM_IdxedChunkListConcatInPlace(RDIM_LocationCaseChunkNode, dst, to_push);
}
////////////////////////////////
+72 -5
View File
@@ -844,8 +844,8 @@ struct RDIM_EvalBytecode
//- rjf: location types
typedef struct RDIM_Location RDIM_Location;
struct RDIM_Location
typedef struct RDIM_LocationInfo RDIM_LocationInfo;
struct RDIM_LocationInfo
{
RDI_LocationKind kind;
RDI_U8 reg_code;
@@ -853,15 +853,24 @@ struct RDIM_Location
RDIM_EvalBytecode bytecode;
};
typedef struct RDIM_Location2 RDIM_Location2;
struct RDIM_Location2
{
struct RDIM_LocationChunkNode *chunk;
RDIM_LocationInfo info;
RDI_U64 relative_encoding_off;
};
typedef struct RDIM_LocationChunkNode RDIM_LocationChunkNode;
struct RDIM_LocationChunkNode
{
RDIM_LocationChunkNode *next;
RDIM_Location *v;
RDIM_Location2 *v;
RDI_U64 count;
RDI_U64 cap;
RDI_U64 base_idx;
RDI_U64 base_encoding_off;
RDI_U64 encoded_size;
};
typedef struct RDIM_LocationChunkList RDIM_LocationChunkList;
@@ -874,7 +883,47 @@ struct RDIM_LocationChunkList
RDI_U64 total_encoded_size;
};
//- rjf: location case types (location * voff range)
//- rjf: location cases
typedef struct RDIM_LocationCase2 RDIM_LocationCase2;
struct RDIM_LocationCase2
{
struct RDIM_LocationCaseChunkNode *chunk;
RDIM_Location2 *location;
RDIM_Rng1U64 voff_range;
};
typedef struct RDIM_LocationCaseChunkNode RDIM_LocationCaseChunkNode;
struct RDIM_LocationCaseChunkNode
{
RDIM_LocationCaseChunkNode *next;
RDIM_LocationCase2 *v;
RDI_U64 count;
RDI_U64 cap;
RDI_U64 base_idx;
};
typedef struct RDIM_LocationCaseChunkList RDIM_LocationCaseChunkList;
struct RDIM_LocationCaseChunkList
{
RDIM_LocationCaseChunkNode *first;
RDIM_LocationCaseChunkNode *last;
RDI_U64 chunk_count;
RDI_U64 total_count;
};
//- rjf: locations (OLD)
typedef struct RDIM_Location RDIM_Location;
struct RDIM_Location
{
RDI_LocationKind kind;
RDI_U8 reg_code;
RDI_U16 offset;
RDIM_EvalBytecode bytecode;
};
//- rjf: location case types (location * voff range) (OLD)
typedef struct RDIM_LocationCase RDIM_LocationCase;
struct RDIM_LocationCase
@@ -974,6 +1023,8 @@ struct RDIM_Local
RDIM_String8 name;
RDIM_Type *type;
RDIM_LocationSet locset;
RDIM_LocationCase2 *first_location_case;
RDI_U64 location_case_count;
};
typedef struct RDIM_Scope RDIM_Scope;
@@ -1031,6 +1082,8 @@ struct RDIM_BakeParams
RDIM_UDTEnumValChunkList enum_vals;
RDIM_SrcFileChunkList src_files;
RDIM_LineTableChunkList line_tables;
RDIM_LocationChunkList locations;
RDIM_LocationCaseChunkList location_cases;
RDIM_SymbolChunkList global_variables;
RDIM_SymbolChunkList thread_variables;
RDIM_SymbolChunkList constants;
@@ -1407,6 +1460,13 @@ struct RDIM_UDTBakeResult
RDI_U64 enum_members_count;
};
typedef struct RDIM_LocationBakeResult RDIM_LocationBakeResult;
struct RDIM_LocationBakeResult
{
RDI_U8 *location_data;
RDI_U64 location_data_size;
};
typedef struct RDIM_GlobalVariableBakeResult RDIM_GlobalVariableBakeResult;
struct RDIM_GlobalVariableBakeResult
{
@@ -1695,9 +1755,16 @@ RDI_PROC void rdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkLi
////////////////////////////////
//~ rjf: [Building] Location Info Building
RDI_PROC RDIM_Location *rdim_location_chunk_list_push_new(RDIM_Arena *arena, RDIM_LocationChunkList *list, RDI_U64 cap, RDIM_Location *loc);
RDI_PROC RDI_U64 rdim_encoded_size_from_location_info(RDIM_LocationInfo *info);
RDI_PROC RDIM_Location2 *rdim_location_chunk_list_push_new(RDIM_Arena *arena, RDIM_LocationChunkList *list, RDI_U64 cap, RDIM_LocationInfo *info);
RDI_PROC RDI_U64 rdim_idx_from_location(RDIM_Location2 *location);
RDI_PROC RDI_U64 rdim_off_from_location(RDIM_Location2 *location);
RDI_PROC void rdim_location_chunk_list_concat_in_place(RDIM_LocationChunkList *dst, RDIM_LocationChunkList *to_push);
RDI_PROC RDIM_LocationCase2 *rdim_location_case_chunk_list_push(RDIM_Arena *arena, RDIM_LocationCaseChunkList *list, RDI_U64 cap);
RDI_PROC RDI_U64 rdim_idx_from_location_case(RDIM_LocationCase2 *location_case);
RDI_PROC void rdim_location_case_chunk_list_concat_in_place(RDIM_LocationCaseChunkList *dst, RDIM_LocationCaseChunkList *to_push);
////////////////////////////////
//~ rjf: [Building] Scope Info Building