checkpoint on new local baking

This commit is contained in:
Ryan Fleury
2026-04-20 09:57:31 -07:00
parent d68e19db8b
commit abb0199936
5 changed files with 117 additions and 32 deletions
+2
View File
@@ -1115,6 +1115,7 @@ rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Sc
list->scope_voff_count += 2;
}
#if 0 // TODO(rjf): @locpass
RDI_PROC RDIM_Local *
rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope)
{
@@ -1141,6 +1142,7 @@ rdim_local_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RD
{
return rdim_push_location_case(arena, scopes, &local->location_cases, location, voff_range);
}
#endif
////////////////////////////////
//~ rjf: [Building] Bake Parameter Joining
+7
View File
@@ -884,6 +884,7 @@ struct RDIM_Symbol
{
struct RDIM_SymbolChunkNode *chunk;
RDI_S32 is_extern;
RDI_S32 is_param;
RDIM_String8 name;
RDIM_String8 link_name;
RDIM_Type *type;
@@ -968,10 +969,13 @@ struct RDIM_Scope
RDIM_Scope *last_child;
RDIM_Scope *next_sibling;
RDIM_Rng1U64List voff_ranges;
#if 0 // TODO(rjf): @locpass
RDIM_Local *first_local;
RDIM_Local *last_local;
RDI_U32 local_count;
#endif
RDIM_InlineSite *inline_site;
RDIM_SymbolChunkList locals;
};
typedef struct RDIM_ScopeChunkNode RDIM_ScopeChunkNode;
@@ -1497,8 +1501,11 @@ RDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChu
RDI_PROC RDI_U64 rdim_idx_from_scope(RDIM_Scope *scope);
RDI_PROC void rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push);
RDI_PROC void rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range);
#if 0 // TODO(rjf): @locpass
RDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope);
RDI_PROC RDIM_LocationCase *rdim_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationCaseList *list, RDIM_Location *location, RDIM_Rng1U64 voff_range);
RDI_PROC RDIM_LocationCase *rdim_local_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *location, RDIM_Rng1U64 voff_range);
#endif
////////////////////////////////
//~ rjf: [Building] Bake Parameter Joining
+81 -15
View File
@@ -372,6 +372,41 @@ p2r_local_push_location_cases_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunk
}
}
internal void
p2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDIM_LocationCaseList *loc_cases, RDIM_Location loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count)
{
//- rjf: extract range info
U64 voff_first = 0;
U64 voff_opl = 0;
if(section != 0)
{
voff_first = section->voff + range->off;
voff_opl = voff_first + range->len;
}
//- rjf: emit location for ranges not coverd by gaps
CV_LvarAddrGap *gap_ptr = gaps;
U64 voff_cursor = voff_first;
for(U64 i = 0; i < gap_count; i += 1, gap_ptr += 1)
{
U64 voff_gap_first = voff_first + gap_ptr->off;
U64 voff_gap_opl = voff_gap_first + gap_ptr->len;
if(voff_cursor < voff_gap_first)
{
RDIM_Rng1U64 voff_range = {voff_cursor, voff_gap_first};
rdim_location_case_list_push(arena, loc_cases, loc, voff_range);
}
voff_cursor = voff_gap_opl;
}
//- rjf: emit remaining range
if(voff_cursor < voff_opl)
{
RDIM_Rng1U64 voff_range = {voff_cursor, voff_opl};
rdim_location_case_list_push(arena, loc_cases, loc, voff_range);
}
}
////////////////////////////////
//~ rjf: Top-Level Conversion Entry Point
@@ -3344,8 +3379,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
//
ProfScope("symbols pass 2: construct all symbols, given procedure frame info map")
{
RDIM_Local *defrange_target = 0;
B32 defrange_target_is_param = 0;
RDIM_Symbol *defrange_target = 0;
U64 procedure_num = 0;
U64 procedure_base_voff = 0;
CV_ProcFlags proc_flags = 0;
@@ -3376,7 +3410,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
SLLStackPush(free_scope_node, n);
}
defrange_target = 0;
defrange_target_is_param = 0;
}break;
//- rjf: BLOCK32
@@ -3623,7 +3656,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
U32 var_off = regrel32->reg_off;
// rjf: determine if this is a parameter
RDI_LocalKind local_kind = regrel_idx < curr_proc_symbol->type->count ? RDI_LocalKind_Parameter : RDI_LocalKind_Variable;
B32 is_param = (regrel_idx < curr_proc_symbol->type->count);
RDI_LocalKind local_kind = is_param ? RDI_LocalKind_Parameter : RDI_LocalKind_Variable;
// rjf: determine if we need an extra indirection to the value
B32 extra_indirection_to_value = 0;
@@ -3666,6 +3700,30 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
}
}
// rjf: build local
{
RDIM_Scope *scope = top_scope_node->scope;
RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8);
local->is_param = is_param;
local->name = name;
local->type = type;
// rjf: equip location info
{
// rjf: get raddbg register code
RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg);
// TODO(rjf): real byte_size & byte_pos from cv_reg goes here
U32 byte_size = 8;
U32 byte_pos = 0;
// rjf: build location
RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value);
RDIM_Rng1U64 voff_range = {0, max_U64};
rdim_location_case_list_push(arena, &local->location_cases, loc, voff_range);
}
}
#if 0 // TODO(rjf): @locpass
// rjf: build local
RDIM_Scope *scope = top_scope_node->scope;
RDIM_Local *local = rdim_scope_push_local(arena, sym_scopes, scope);
@@ -3686,6 +3744,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
RDIM_Rng1U64 voff_range = {0, max_U64};
rdim_local_push_location_case(arena, sym_scopes, local, &loc, voff_range);
}
#endif
}
regrel_idx += 1;
@@ -3760,7 +3819,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
{
// TODO(rjf): add global modification symbols
defrange_target = 0;
defrange_target_is_param = 0;
}
// rjf: is not a global modification -> emit a local variable
@@ -3773,16 +3831,26 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
local_kind = RDI_LocalKind_Parameter;
}
// rjf: build local
RDIM_Scope *scope = top_scope_node->scope;
RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8);
{
local->is_param = !!(slocal->flags & CV_LocalFlag_Param);
local->name = name;
local->type = type;
}
#if 0 // TODO(rjf): @locpass
// rjf: build local
RDIM_Scope *scope = top_scope_node->scope;
RDIM_Local *local = rdim_scope_push_local(arena, sym_scopes, scope);
local->kind = local_kind;
local->name = name;
local->type = type;
#endif
// rjf: save defrange target, for subsequent defrange symbols
defrange_target = local;
defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter);
}
}break;
@@ -3809,7 +3877,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code};
// rjf: emit locations over ranges
p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &loc, range, range_section, gaps, gap_count);
p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count);
}break;
//- rjf: DEFRANGE_FRAMEPOINTER_REL
@@ -3844,7 +3912,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps);
// rjf: select frame pointer register
CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target_is_param);
CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param);
RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg);
// rjf: build location
@@ -3855,7 +3923,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
RDIM_Location location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection);
// rjf: emit locations over ranges
p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &location, range, range_section, gaps, gap_count);
p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, location, range, range_section, gaps, gap_count);
}break;
//- rjf: DEFRANGE_SUBFIELD_REGISTER
@@ -3887,7 +3955,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code};
// rjf: emit locations over ranges
p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &loc, range, range_section, gaps, gap_count);
p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count);
}break;
//- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE
@@ -3916,7 +3984,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
// rjf: unpack sym
CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)iter.struct_base;
CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target_is_param);
CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param);
RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg);
// rjf: build location
@@ -3928,7 +3996,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
// rjf: emit location over ranges
RDIM_Rng1U64 voff_range = {0, max_U64};
rdim_local_push_location_case(arena, sym_scopes, defrange_target, &loc, voff_range);
rdim_location_case_list_push(arena, &defrange_target->location_cases, loc, voff_range);
}break;
//- rjf: DEFRANGE_REGISTER_REL
@@ -3959,7 +4027,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, var_off, extra_indirection_to_value);
// rjf: emit locations over ranges
p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &loc, range, range_section, gaps, gap_count);
p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count);
}break;
//- rjf: FILESTATIC
@@ -3970,7 +4038,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype);
// TODO(rjf): emit a global modifier symbol
defrange_target = 0;
defrange_target_is_param = 0;
}break;
//- rjf: INLINESITE
@@ -4103,7 +4170,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
SLLStackPush(free_scope_node, n);
}
defrange_target = 0;
defrange_target_is_param = 0;
}break;
//- rjf: CONSTANT
+1
View File
@@ -113,6 +113,7 @@ internal RDI_ChecksumKind p2r_rdi_from_cv_c13_checksum_kind(CV_C13ChecksumKind k
internal RDI_RegCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg);
internal RDIM_Location p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection);
internal void p2r_local_push_location_cases_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count);
internal void p2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDIM_LocationCaseList *loc_cases, RDIM_Location loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count);
////////////////////////////////
//~ rjf: Top-Level Conversion Entry Point
+18 -9
View File
@@ -1236,9 +1236,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
Rng1U64 range = lane_range(n->count);
for EachInRange(n_idx, range)
{
for EachNode(local, RDIM_Local, n->v[n_idx].first_local)
for EachNode(local_n, RDIM_SymbolChunkNode, n->v[n_idx].locals.first)
{
rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, local->name);
for EachIndex(local_n_idx, local_n->count)
{
rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, local_n->v[local_n_idx].name);
}
}
}
}
@@ -2701,6 +2704,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
//////////////////////////////////////////////////////////////
//- rjf: @rdim_bake_stage compute lane location block layout
//
#if 0 // TODO(rjf): @locpass
typedef struct LocLayout LocLayout;
struct LocLayout
{
@@ -2782,6 +2786,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
}
}
lane_sync();
#endif
//////////////////////////////////////////////////////////////
//- rjf: @rdim_bake_stage bake location blocks
@@ -2941,7 +2946,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
Rng1U64 range = lane_range(n->count);
for EachInRange(n_idx, range)
{
num_locals_in_this_lane_and_node += n->v[n_idx].local_count;
num_locals_in_this_lane_and_node += n->v[n_idx].locals.total_count;
num_voffs_in_this_lane_and_node += n->v[n_idx].voff_ranges.count*2;
}
scope_layout->scope_local_chunk_lane_counts[lane_idx()*params->scopes.chunk_count + chunk_idx] = num_locals_in_this_lane_and_node;
@@ -2984,7 +2989,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
RDI_U64 scopes_count;
RDI_U64 *scope_voffs;
RDI_U64 scope_voffs_count;
RDI_Local *locals;
RDI_Symbol *locals;
RDI_U64 locals_count;
};
BakedScopes *baked_scopes = 0;
@@ -3009,7 +3014,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
if(lane_idx() == lane_from_task_idx(2))
{
baked_scopes->locals_count = params->scopes.local_count+1;
baked_scopes->locals = push_array(arena, RDI_Local, baked_scopes->locals_count);
baked_scopes->locals = push_array(arena, RDI_Symbol, baked_scopes->locals_count);
}
lane_sync();
@@ -3022,8 +3027,6 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
U64 scope_chunk_lane_slot_idx = lane_idx()*params->scopes.chunk_count + chunk_idx;
U64 chunk_local_off = scope_layout->scope_local_chunk_lane_offs[scope_chunk_lane_slot_idx];
U64 chunk_voff_off = scope_layout->scope_voff_chunk_lane_offs[scope_chunk_lane_slot_idx];
U64 location_block_chunk_lane_slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx;
U64 chunk_location_block_off = loc_layout->location_case_chunk_lane_offs[location_block_chunk_lane_slot_idx];
for EachInRange(n_idx, range)
{
U64 dst_idx = 1 + n->base_idx + n_idx;
@@ -3042,9 +3045,13 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
//- rjf: fill locals
U64 local_idx_first = chunk_local_off;
for EachNode(src_local, RDIM_Local, src_scope->first_local)
for EachNode(src_local_n, RDIM_SymbolChunkNode, src_scope->locals.first)
{
RDI_Local *dst_local = &baked_scopes->locals[chunk_local_off];
for EachIndex(src_local_idx, src_local_n->count)
{
RDIM_Symbol *src_local = &src_local_n->v[src_local_idx];
RDI_Symbol *dst_local = &baked_scopes->locals[chunk_local_off];
#if 0
dst_local->kind = src_local->kind;
dst_local->name_string_idx = rdim_bake_idx_from_string(bake_strings, src_local->name);
dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32
@@ -3054,8 +3061,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
dst_local->location_opl = chunk_location_block_off + src_local->location_cases.count;
chunk_location_block_off += src_local->location_cases.count;
}
#endif
chunk_local_off += 1;
}
}
U64 local_idx_opl = chunk_local_off;
//- rjf: fill scope