diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 0be0e22dcd..1ec16af2cb 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -1211,26 +1211,7 @@ std::vector> spu_thread::dump_callstack_list() const return !addr || !is_exec_code(addr, ls); }; - if (is_invalid(lr)) - { - if (first) - { - // Function hasn't saved LR, could be because it's a leaf function - // Use LR directly instead - lr = gpr0; - - if (is_invalid(lr)) - { - // Skip it, workaround - continue; - } - } - else - { - break; - } - } - else if (first && lr._u32[3] != gpr0._u32[3] && !is_invalid(gpr0)) + if (first && lr._u32[3] != gpr0._u32[3] && !is_invalid(gpr0)) { // Detect functions with no stack or before LR has been stored std::vector passed(SPU_LS_SIZE / 4); @@ -1319,8 +1300,15 @@ std::vector> spu_thread::dump_callstack_list() const } } - // TODO: function addresses too - call_stack_list.emplace_back(lr._u32[3], sp); + if (!is_invalid(lr)) + { + // TODO: function addresses too + call_stack_list.emplace_back(lr._u32[3], sp); + } + else if (!first) + { + break; + } const u32 temp_sp = _ref(sp);