diff options
author | Muhammad Omair Javaid <omair.javaid@linaro.org> | 2021-02-08 14:08:19 +0500 |
---|---|---|
committer | Muhammad Omair Javaid <omair.javaid@linaro.org> | 2021-02-08 14:09:15 +0500 |
commit | 8561ad9296b70b5a2af1574a1576090520d62a7c (patch) | |
tree | aa23871722e3fd37f485ca7c71ab45a35b86a1ff /lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | |
parent | bec6b5e3cec71a9560cc761fd7804f354c3aca02 (diff) | |
download | llvm-8561ad9296b70b5a2af1574a1576090520d62a7c.zip llvm-8561ad9296b70b5a2af1574a1576090520d62a7c.tar.gz llvm-8561ad9296b70b5a2af1574a1576090520d62a7c.tar.bz2 |
Use remote regnums in expedited list, value regs and invalidate regs
Native register descriptions in LLDB specify lldb register numbers in
value_regs and invalidate_regs lists. These register numbers may not
match with Process gdb-remote register numbers which are generated by
native process after counting all registers in its register sets.
It was coincidentally not causing any problems as we never came across
a native target with dynamically changing register sets and register
numbers generated by counter matched with LLDB native register numbers.
This came up while testing target AArch64 SVE which can choose register
sets based on underlying hardware.
This patch fixes this behavior and always tries to use remote register
numbers while reading/writing registers over gdb-remote protocol.
Reviewed By: labath
Differential Revision: https://reviews.llvm.org/D77043
Diffstat (limited to 'lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp')
-rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index aba870c..a2e41e7 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -1748,7 +1748,9 @@ ThreadSP ProcessGDBRemote::SetThreadStopInfo( if (thread_sp) { ThreadGDBRemote *gdb_thread = static_cast<ThreadGDBRemote *>(thread_sp.get()); - gdb_thread->GetRegisterContext()->InvalidateIfNeeded(true); + RegisterContextSP gdb_reg_ctx_sp(gdb_thread->GetRegisterContext()); + + gdb_reg_ctx_sp->InvalidateIfNeeded(true); auto iter = std::find(m_thread_ids.begin(), m_thread_ids.end(), tid); if (iter != m_thread_ids.end()) { @@ -1760,7 +1762,10 @@ ThreadSP ProcessGDBRemote::SetThreadStopInfo( DataBufferSP buffer_sp(new DataBufferHeap( reg_value_extractor.GetStringRef().size() / 2, 0)); reg_value_extractor.GetHexBytes(buffer_sp->GetData(), '\xcc'); - gdb_thread->PrivateSetRegisterValue(pair.first, buffer_sp->GetData()); + uint32_t lldb_regnum = + gdb_reg_ctx_sp->ConvertRegisterKindToRegisterNumber( + eRegisterKindProcessPlugin, pair.first); + gdb_thread->PrivateSetRegisterValue(lldb_regnum, buffer_sp->GetData()); } // AArch64 SVE specific code below calls AArch64SVEReconfigure to update |