mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
plug in new location building code to pdb conversion
This commit is contained in:
+94
-80
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user