diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index 54db8c31..7a5ddec8 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -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)) { got_artifact = 1; - artifact_is_stale = (node->last_completed_gen == params->gen); + artifact_is_stale = (node->last_completed_gen != params->gen); artifact = node->val; 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)); diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index fbce7fc1..56279d98 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1857,7 +1857,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) //- rjf: do one unwind step B32 step_is_good = 0; - for(;!unwind.flags;) + for(;!unwind.flags && !step_is_good;) { // rjf: remember registers pre-step 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; step_is_good = 1; - break; } } - //- rjf: push successful steps to frame list - 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 || - arch_sp_from_reg_block(arch_info, regs_block) != start_sp)) + //- rjf: push successful steps to frame list - we disqualify steps that are: + // + // (a) bad + // (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_UnwindFrame *f = &frame_node->v; @@ -1926,8 +1930,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) access_close(access); //- rjf: exit if we made no progress on the unwind - if(arch_ip_from_reg_block(arch_info, regs_block) == start_ip && - arch_sp_from_reg_block(arch_info, regs_block) == start_sp) + if(!step_made_process) { break; } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 309e5628..bbbe7991 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -4843,7 +4843,12 @@ rd_view_setting_addr_from_name(String8 name) E_Eval eval = e_eval_from_string(string); 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); - 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; }