From 6f9b22b2588cd13899c81c09a9e2ce9905053b56 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 4 Sep 2025 15:23:49 -0700 Subject: [PATCH] plug in new location building code to pdb conversion --- src/lib_rdi_make/rdi_make.c | 174 ++++++++++++++++-------------- src/lib_rdi_make/rdi_make.h | 25 +++-- src/rdi_from_pdb/rdi_from_pdb_2.c | 40 +++++-- 3 files changed, 141 insertions(+), 98 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 45d2c074..2cc36a6f 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -937,6 +937,91 @@ rdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkList *dst, RDIM_ //////////////////////////////// //~ rjf: [Building] Location Info Building +//- rjf: bytecode + +RDI_PROC void +rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p) +{ + RDI_U16 ctrlbits = rdi_eval_op_ctrlbits_table[op]; + RDI_U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + + RDIM_EvalBytecodeOp *node = rdim_push_array(arena, RDIM_EvalBytecodeOp, 1); + node->op = op; + node->p_size = p_size; + node->p = p; + + RDIM_SLLQueuePush(bytecode->first_op, bytecode->last_op, node); + bytecode->op_count += 1; + bytecode->encoded_size += 1 + p_size; +} + +RDI_PROC void +rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x) +{ + if(x <= 0xFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, x); + } + else if(x <= 0xFFFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, x); + } + else if(x <= 0xFFFFFFFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, x); + } + else + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, x); + } +} + +RDI_PROC void +rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x) +{ + if(-0x80 <= x && x <= 0x7F) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 8); + } + else if(-0x8000 <= x && x <= 0x7FFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 16); + } + else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 32); + } + else + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, (RDI_U64)x); + } +} + +RDI_PROC void +rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed) +{ + if(right_destroyed->first_op != 0) + { + if(left_dst->first_op == 0) + { + rdim_memcpy_struct(left_dst, right_destroyed); + } + else + { + left_dst->last_op->next = right_destroyed->first_op; + left_dst->last_op = right_destroyed->last_op; + left_dst->op_count += right_destroyed->op_count; + left_dst->encoded_size += right_destroyed->encoded_size; + } + rdim_memzero_struct(right_destroyed); + } +} + +//- rjf: locations + RDI_PROC RDI_U64 rdim_encoded_size_from_location_info(RDIM_LocationInfo *info) { @@ -1052,87 +1137,16 @@ rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope return local; } -//- rjf: bytecode - -RDI_PROC void -rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p) +RDI_PROC RDIM_LocationCase2 * +rdim_local_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location2 *location, RDIM_Rng1U64 voff_range) { - RDI_U16 ctrlbits = rdi_eval_op_ctrlbits_table[op]; - RDI_U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); - - RDIM_EvalBytecodeOp *node = rdim_push_array(arena, RDIM_EvalBytecodeOp, 1); - node->op = op; - node->p_size = p_size; - node->p = p; - - RDIM_SLLQueuePush(bytecode->first_op, bytecode->last_op, node); - bytecode->op_count += 1; - bytecode->encoded_size += 1 + p_size; -} - -RDI_PROC void -rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x) -{ - if(x <= 0xFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, x); - } - else if(x <= 0xFFFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, x); - } - else if(x <= 0xFFFFFFFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, x); - } - else - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, x); - } -} - -RDI_PROC void -rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x) -{ - if(-0x80 <= x && x <= 0x7F) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, (RDI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 8); - } - else if(-0x8000 <= x && x <= 0x7FFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, (RDI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 16); - } - else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, (RDI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 32); - } - else - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, (RDI_U64)x); - } -} - -RDI_PROC void -rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed) -{ - if(right_destroyed->first_op != 0) - { - if(left_dst->first_op == 0) - { - rdim_memcpy_struct(left_dst, right_destroyed); - } - else - { - left_dst->last_op->next = right_destroyed->first_op; - left_dst->last_op = right_destroyed->last_op; - left_dst->op_count += right_destroyed->op_count; - left_dst->encoded_size += right_destroyed->encoded_size; - } - rdim_memzero_struct(right_destroyed); - } + RDIM_LocationCase2 *loc_case = rdim_push_array(arena, RDIM_LocationCase2, 1); + RDIM_SLLQueuePush(local->location_cases.first, local->location_cases.last, loc_case); + local->location_cases.count += 1; + loc_case->location = location; + loc_case->voff_range = voff_range; + scopes->location_case_count += 1; + return loc_case; } //- rjf: individual locations diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 7066f103..4311659d 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -853,6 +853,14 @@ struct RDIM_LocationCase2 RDIM_Rng1U64 voff_range; }; +typedef struct RDIM_LocationCaseList RDIM_LocationCaseList; +struct RDIM_LocationCaseList +{ + RDIM_LocationCase2 *first; + RDIM_LocationCase2 *last; + RDI_U64 count; +}; + //- rjf: locations (OLD) typedef struct RDIM_Location RDIM_Location; @@ -964,8 +972,7 @@ struct RDIM_Local RDIM_String8 name; RDIM_Type *type; RDIM_LocationSet locset; - RDIM_LocationCase2 *first_location_case; - RDI_U64 location_case_count; + RDIM_LocationCaseList location_cases; }; typedef struct RDIM_Scope RDIM_Scope; @@ -1681,6 +1688,13 @@ RDI_PROC void rdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkLi //////////////////////////////// //~ rjf: [Building] Location Info Building +//- rjf: bytecode +RDI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); +RDI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x); +RDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x); +RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); + +//- rjf: locations 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); @@ -1696,12 +1710,7 @@ 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); RDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope); - -//- rjf: bytecode -RDI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); -RDI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x); -RDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x); -RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); +RDI_PROC RDIM_LocationCase2 *rdim_local_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location2 *location, RDIM_Rng1U64 voff_range); //- rjf: individual locations RDI_PROC RDIM_Location *rdim_push_location_addr_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode); diff --git a/src/rdi_from_pdb/rdi_from_pdb_2.c b/src/rdi_from_pdb/rdi_from_pdb_2.c index 6bacf123..e90fd41f 100644 --- a/src/rdi_from_pdb/rdi_from_pdb_2.c +++ b/src/rdi_from_pdb/rdi_from_pdb_2.c @@ -2941,6 +2941,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") { RDIM_LocationSet *defrange_target = 0; + RDIM_Local *defrange_target2 = 0; B32 defrange_target_is_param = 0; U64 procedure_num = 0; U64 procedure_base_voff = 0; @@ -2996,6 +2997,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) SLLStackPush(free_scope_node, n); } defrange_target = 0; + defrange_target2 = 0; defrange_target_is_param = 0; }break; @@ -3291,16 +3293,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) // rjf: build location RDIM_LocationInfo loc_info = p2r2_location_info_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); RDIM_Location2 *loc2 = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info); -#if 0 - RDIM_LocationCase2 *loc_case = rdim_location_case_chunk_list_push(arena, sym_location_cases, sym_locations_chunk_cap); - loc_case->location = loc2; - loc_case->voff_range.min = 0; - loc_case->voff_range.max = max_U64; - - // rjf: equip location case to local - local->first_location_case = loc_case; - local->location_case_count = 1; -#endif + rdim_local_push_location_case(arena, sym_scopes, local, loc2, (RDIM_Rng1U64){0, max_U64}); // rjf: set location case 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); @@ -3374,6 +3367,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) { // TODO(rjf): add global modification symbols defrange_target = 0; + defrange_target2 = 0; defrange_target_is_param = 0; } @@ -3396,6 +3390,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) // rjf: save defrange target, for subsequent defrange symbols defrange_target = &local->locset; + defrange_target2 = local; defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter); } }break; @@ -3409,6 +3404,10 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) { break; } + if(defrange_target2 == 0) + { + break; + } // rjf: unpack sym CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; @@ -3435,6 +3434,10 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) { break; } + if(defrange_target2 == 0) + { + break; + } // rjf: find current procedure's frameproc CV_SymFrameproc *frameproc = 0; @@ -3482,6 +3485,10 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) { break; } + if(defrange_target2 == 0) + { + break; + } // rjf: unpack sym CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base; @@ -3514,6 +3521,10 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) { break; } + if(defrange_target2 == 0) + { + break; + } // rjf: find current procedure's frameproc CV_SymFrameproc *frameproc = 0; @@ -3540,10 +3551,13 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) U32 byte_pos = 0; S64 var_off = (S64)defrange_fprel_full_scope->off; RDIM_Location *location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + RDIM_LocationInfo loc_info = p2r2_location_info_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + RDIM_Location2 *loc = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info); // rjf: emit location over ranges RDIM_Rng1U64 voff_range = {0, max_U64}; rdim_location_set_push_case(arena, sym_scopes, defrange_target, voff_range, location); + rdim_local_push_location_case(arena, sym_scopes, defrange_target2, loc, voff_range); }break; //- rjf: DEFRANGE_REGISTER_REL @@ -3555,6 +3569,10 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) { break; } + if(defrange_target2 == 0) + { + break; + } // rjf: unpack sym CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; @@ -3585,6 +3603,7 @@ p2r2_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_target2 = 0; defrange_target_is_param = 0; }break; @@ -3717,6 +3736,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params) SLLStackPush(free_scope_node, n); } defrange_target = 0; + defrange_target2 = 0; defrange_target_is_param = 0; }break;