diff --git a/lldb/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp b/lldb/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp --- a/lldb/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp +++ b/lldb/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp @@ -14453,10 +14453,10 @@ return false; } - success = before_state.CompareState(after_state); + success = before_state.CompareState(after_state, out_stream); if (!success) out_stream->Printf( - "TestEmulation: 'before' and 'after' states do not match.\n"); + "TestEmulation: State after emulation does not match 'after' state.\n"); return success; } diff --git a/lldb/source/Plugins/Instruction/ARM/EmulationStateARM.h b/lldb/source/Plugins/Instruction/ARM/EmulationStateARM.h --- a/lldb/source/Plugins/Instruction/ARM/EmulationStateARM.h +++ b/lldb/source/Plugins/Instruction/ARM/EmulationStateARM.h @@ -36,7 +36,8 @@ bool LoadStateFromDictionary(lldb_private::OptionValueDictionary *test_data); - bool CompareState(EmulationStateARM &other_state); + bool CompareState(EmulationStateARM &other_state, + lldb_private::Stream *out_stream); static size_t ReadPseudoMemory(lldb_private::EmulateInstruction *instruction, void *baton, diff --git a/lldb/source/Plugins/Instruction/ARM/EmulationStateARM.cpp b/lldb/source/Plugins/Instruction/ARM/EmulationStateARM.cpp --- a/lldb/source/Plugins/Instruction/ARM/EmulationStateARM.cpp +++ b/lldb/source/Plugins/Instruction/ARM/EmulationStateARM.cpp @@ -251,22 +251,32 @@ reg_value.GetAsUInt64()); } -bool EmulationStateARM::CompareState(EmulationStateARM &other_state) { +bool EmulationStateARM::CompareState(EmulationStateARM &other_state, + Stream *out_stream) { bool match = true; for (int i = 0; match && i < 17; ++i) { - if (m_gpr[i] != other_state.m_gpr[i]) + if (m_gpr[i] != other_state.m_gpr[i]) { match = false; + out_stream->Printf("r%d: 0x%x != 0x%x\n", i, m_gpr[i], + other_state.m_gpr[i]); + } } for (int i = 0; match && i < 32; ++i) { - if (m_vfp_regs.s_regs[i] != other_state.m_vfp_regs.s_regs[i]) + if (m_vfp_regs.s_regs[i] != other_state.m_vfp_regs.s_regs[i]) { match = false; + out_stream->Printf("s%d: 0x%x != 0x%x\n", i, m_vfp_regs.s_regs[i], + other_state.m_vfp_regs.s_regs[i]); + } } for (int i = 0; match && i < 16; ++i) { - if (m_vfp_regs.d_regs[i] != other_state.m_vfp_regs.d_regs[i]) + if (m_vfp_regs.d_regs[i] != other_state.m_vfp_regs.d_regs[i]) { match = false; + out_stream->Printf("d%d: 0x%lx != 0x%lx\n", i + 16, m_vfp_regs.d_regs[i], + other_state.m_vfp_regs.d_regs[i]); + } } return match;