[lldb][ARM] Print mismatched registers in emulation tests

Also correct the test failed message. It implies that what
it's done is compare the 'before' and 'ater' states from the
test input.

Except that that's the whole point of the test, that the state changes.
It should tell you that it compared the result of the emulation to the
'after'.

Reviewed By: clayborg

Differential Revision: https://reviews.llvm.org/D130464
This commit is contained in:
David Spickett 2022-07-22 14:38:03 +00:00
parent 3281138aad
commit 3ebd541944
3 changed files with 18 additions and 7 deletions

View file

@ -14453,10 +14453,10 @@ bool EmulateInstructionARM::TestEmulation(Stream *out_stream, ArchSpec &arch,
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;
}

View file

@ -251,22 +251,32 @@ bool EmulationStateARM::WritePseudoRegister(
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;

View file

@ -36,7 +36,8 @@ public:
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,