mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-14 09:18:09 +00:00
fix incorrect marking of non-stale results by artifact cache lookup; fix view addr parameterizations when a register value is used
This commit is contained in:
@@ -191,7 +191,7 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6
|
|||||||
if(!got_artifact && ins_atomic_u64_eval(&node->completion_count) != 0 && ((node->last_completed_gen == params->gen) || !(params->flags & AC_Flag_WaitForFresh) || out_of_time))
|
if(!got_artifact && ins_atomic_u64_eval(&node->completion_count) != 0 && ((node->last_completed_gen == params->gen) || !(params->flags & AC_Flag_WaitForFresh) || out_of_time))
|
||||||
{
|
{
|
||||||
got_artifact = 1;
|
got_artifact = 1;
|
||||||
artifact_is_stale = (node->last_completed_gen == params->gen);
|
artifact_is_stale = (node->last_completed_gen != params->gen);
|
||||||
artifact = node->val;
|
artifact = node->val;
|
||||||
access_touch(access, &node->access_pt, stripe->cv);
|
access_touch(access, &node->access_pt, stripe->cv);
|
||||||
ins_atomic_u64_eval_assign(&node->last_touched_ac_request_gen, ins_atomic_u64_eval(&ac_shared->request_gen));
|
ins_atomic_u64_eval_assign(&node->last_touched_ac_request_gen, ins_atomic_u64_eval(&ac_shared->request_gen));
|
||||||
|
|||||||
@@ -1857,7 +1857,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us)
|
|||||||
|
|
||||||
//- rjf: do one unwind step
|
//- rjf: do one unwind step
|
||||||
B32 step_is_good = 0;
|
B32 step_is_good = 0;
|
||||||
for(;!unwind.flags;)
|
for(;!unwind.flags && !step_is_good;)
|
||||||
{
|
{
|
||||||
// rjf: remember registers pre-step
|
// rjf: remember registers pre-step
|
||||||
MemoryCopy(regs_block_restore, regs_block, arch_reg_block_size);
|
MemoryCopy(regs_block_restore, regs_block, arch_reg_block_size);
|
||||||
@@ -1905,14 +1905,18 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us)
|
|||||||
{
|
{
|
||||||
last_frame_node->v.cfa = cfa;
|
last_frame_node->v.cfa = cfa;
|
||||||
step_is_good = 1;
|
step_is_good = 1;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: push successful steps to frame list
|
//- rjf: push successful steps to frame list - we disqualify steps that are:
|
||||||
if(step_is_good && arch_ip_from_reg_block(arch_info, regs_block) != 0 &&
|
//
|
||||||
(arch_ip_from_reg_block(arch_info, regs_block) != start_ip ||
|
// (a) bad
|
||||||
arch_sp_from_reg_block(arch_info, regs_block) != start_sp))
|
// (b) advance ip to 0
|
||||||
|
// (c) do not modify either ip *or* sp (just one is fine)
|
||||||
|
//
|
||||||
|
B32 step_made_process = (arch_ip_from_reg_block(arch_info, regs_block) != start_ip ||
|
||||||
|
arch_sp_from_reg_block(arch_info, regs_block) != start_sp);
|
||||||
|
if(step_is_good && step_made_process && arch_ip_from_reg_block(arch_info, regs_block) != 0)
|
||||||
{
|
{
|
||||||
D_UnwindFrameNode *frame_node = push_array(scratch.arena, D_UnwindFrameNode, 1);
|
D_UnwindFrameNode *frame_node = push_array(scratch.arena, D_UnwindFrameNode, 1);
|
||||||
D_UnwindFrame *f = &frame_node->v;
|
D_UnwindFrame *f = &frame_node->v;
|
||||||
@@ -1926,8 +1930,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us)
|
|||||||
access_close(access);
|
access_close(access);
|
||||||
|
|
||||||
//- rjf: exit if we made no progress on the unwind
|
//- rjf: exit if we made no progress on the unwind
|
||||||
if(arch_ip_from_reg_block(arch_info, regs_block) == start_ip &&
|
if(!step_made_process)
|
||||||
arch_sp_from_reg_block(arch_info, regs_block) == start_sp)
|
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4843,7 +4843,12 @@ rd_view_setting_addr_from_name(String8 name)
|
|||||||
E_Eval eval = e_eval_from_string(string);
|
E_Eval eval = e_eval_from_string(string);
|
||||||
E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative);
|
E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative);
|
||||||
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
||||||
if(eval.irtree.mode == E_Mode_Offset && !e_type_kind_is_pointer_or_ref(type_kind))
|
if(eval.irtree.mode == E_Mode_Offset && e_space_match(e_base_ctx->thread_reg_space, eval.space))
|
||||||
|
{
|
||||||
|
E_Eval value_eval = e_value_eval_from_eval(eval);
|
||||||
|
result = value_eval.value.u64;
|
||||||
|
}
|
||||||
|
else if(eval.irtree.mode == E_Mode_Offset && !e_type_kind_is_pointer_or_ref(type_kind))
|
||||||
{
|
{
|
||||||
result = eval.value.u64;
|
result = eval.value.u64;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user