Skip to content

Commit 652a422

Browse files
authored
Merge pull request #7828 from jasonmolenda/dont-invalidate-registers-after-receiving-expedited-regs
[LLDB] On AArch64, reconfigure register context first (llvm#70742)
2 parents 27d6bdd + e9939c4 commit 652a422

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,9 +1642,20 @@ ThreadSP ProcessGDBRemote::SetThreadStopInfo(
16421642
}
16431643

16441644
ThreadGDBRemote *gdb_thread = static_cast<ThreadGDBRemote *>(thread_sp.get());
1645-
RegisterContextSP gdb_reg_ctx_sp(gdb_thread->GetRegisterContext());
1645+
RegisterContextSP reg_ctx_sp(gdb_thread->GetRegisterContext());
16461646

1647-
gdb_reg_ctx_sp->InvalidateIfNeeded(true);
1647+
reg_ctx_sp->InvalidateIfNeeded(true);
1648+
1649+
// AArch64 SVE/SME specific code below updates SVE and ZA register sizes and
1650+
// offsets if value of VG or SVG registers has changed since last stop.
1651+
const ArchSpec &arch = GetTarget().GetArchitecture();
1652+
if (arch.IsValid() && arch.GetTriple().isAArch64()) {
1653+
GDBRemoteRegisterContext *gdb_remote_reg_ctx =
1654+
static_cast<GDBRemoteRegisterContext *>(reg_ctx_sp.get());
1655+
1656+
if (gdb_remote_reg_ctx)
1657+
gdb_remote_reg_ctx->AArch64SVEReconfigure();
1658+
}
16481659

16491660
auto iter = std::find(m_thread_ids.begin(), m_thread_ids.end(), tid);
16501661
if (iter != m_thread_ids.end())
@@ -1655,24 +1666,10 @@ ThreadSP ProcessGDBRemote::SetThreadStopInfo(
16551666
WritableDataBufferSP buffer_sp(
16561667
new DataBufferHeap(reg_value_extractor.GetStringRef().size() / 2, 0));
16571668
reg_value_extractor.GetHexBytes(buffer_sp->GetData(), '\xcc');
1658-
uint32_t lldb_regnum = gdb_reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
1669+
uint32_t lldb_regnum = reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
16591670
eRegisterKindProcessPlugin, pair.first);
16601671
gdb_thread->PrivateSetRegisterValue(lldb_regnum, buffer_sp->GetData());
16611672
}
1662-
1663-
// AArch64 SVE specific code below calls AArch64SVEReconfigure to update
1664-
// SVE register sizes and offsets if value of VG register has changed
1665-
// since last stop.
1666-
const ArchSpec &arch = GetTarget().GetArchitecture();
1667-
if (arch.IsValid() && arch.GetTriple().isAArch64()) {
1668-
GDBRemoteRegisterContext *reg_ctx_sp =
1669-
static_cast<GDBRemoteRegisterContext *>(
1670-
gdb_thread->GetRegisterContext().get());
1671-
1672-
if (reg_ctx_sp)
1673-
reg_ctx_sp->AArch64SVEReconfigure();
1674-
}
1675-
16761673
thread_sp->SetName(thread_name.empty() ? nullptr : thread_name.c_str());
16771674

16781675
gdb_thread->SetThreadDispatchQAddr(thread_dispatch_qaddr);

0 commit comments

Comments
 (0)