[llvm-branch-commits] [lldb] [lldb][AArch64][Linux] Add function to get size of register set (PR #213976)
David Spickett via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Aug 4 08:13:10 PDT 2026
https://github.com/DavidSpickett created https://github.com/llvm/llvm-project/pull/213976
Another one to be used in a generic read/write function later.
Replaces all the Get<thing>Size() methods.
---
<sub>Stack created with <a href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub>
>From f1a4b834752e73316553f18b34f6236a4909c4c8 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 13:57:52 +0000
Subject: [PATCH 01/12] [lldb][AArch64][Linux] Add function to get size of
register set
Another one to be used in a generic read/write function later.
Replaces all the Get<thing>Size() methods.
---
.../NativeRegisterContextLinux_arm64.cpp | 34 +++++++++++++++++++
.../Linux/NativeRegisterContextLinux_arm64.h | 2 ++
2 files changed, 36 insertions(+)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index b6a220e8c19f2..72b2c58ba4ac7 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -123,6 +123,40 @@ unsigned int NativeRegisterContextLinux_arm64::GetPtraceSet(
}
}
+size_t NativeRegisterContextLinux_arm64::GetSetSize(
+ NativeRegisterContextLinux_arm64::RegisterSetType set) const {
+ switch (set) {
+ case RegisterSetType::GPR:
+ // Returns sizeof arm64 GPR ptrace buffer, which is different
+ // from GetGPRSize which returns sizeof RegisterInfoPOSIX_arm64::GPR.
+ return sizeof(m_gpr_arm64);
+ case RegisterSetType::FPR:
+ return sizeof(m_fpr);
+ case RegisterSetType::SVE:
+ return m_sve_ptrace_payload.size();
+ case RegisterSetType::SVE_HEADER:
+ return sizeof(m_sve_header);
+ case RegisterSetType::PAC:
+ return sizeof(m_pac_mask);
+ case RegisterSetType::MTE:
+ return sizeof(m_mte_ctrl_reg);
+ case RegisterSetType::TLS:
+ return m_tls_size;
+ case RegisterSetType::ZA:
+ return m_za_ptrace_payload.size();
+ case RegisterSetType::ZA_HEADER:
+ return sizeof(m_za_header);
+ case RegisterSetType::ZT:
+ return m_zt_reg.size();
+ case RegisterSetType::FPMR:
+ return sizeof(m_fpmr_reg);
+ case RegisterSetType::GCS:
+ return sizeof(m_gcs_regs);
+ case RegisterSetType::POE:
+ return sizeof(m_poe_regs);
+ }
+}
+
// A NativeRegisterContext is constructed per thread, but all threads' registers
// will contain the same fields. Therefore this mutex prevents each instance
// competing with the other, and subsequent instances from having to detect the
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index 8e6b2d793bf6f..53fca1f10ab0f 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -120,6 +120,8 @@ class NativeRegisterContextLinux_arm64
// Returns the ptrace register set number for the given register set.
unsigned int GetPtraceSet(RegisterSetType set) const;
+ size_t GetSetSize(RegisterSetType set) const;
+
void MakeValid(RegisterSetType set) { m_validity |= set; }
[[nodiscard]] bool IsValid(RegisterSetType set) const {
>From ecdb2dffd28e746eedca6e33b31d6864f610c799 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:01:52 +0000
Subject: [PATCH 02/12] replace za_header
---
.../Linux/NativeRegisterContextLinux_arm64.cpp | 12 ++++++------
.../Process/Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index 72b2c58ba4ac7..2a71201e0592e 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -505,7 +505,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info,
// ZA is a square of VL * VL and the ptrace buffer also includes the
// header itself.
m_za_ptrace_payload.resize(((m_za_header.vl) * (m_za_header.vl)) +
- GetZAHeaderSize());
+ GetSetSize(RegisterSetType::ZA_HEADER));
std::fill(m_za_ptrace_payload.begin(), m_za_ptrace_payload.end(), 0);
} else {
// ZA is active, read the real register.
@@ -517,7 +517,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info,
// ZA is part of the SME set but uses a separate member buffer for
// storage. Therefore its effective byte offset is always 0 even if it
// isn't 0 within the SME register set.
- src = (uint8_t *)GetZABuffer() + GetZAHeaderSize();
+ src = (uint8_t *)GetZABuffer() + GetSetSize(RegisterSetType::ZA_HEADER);
} else if (GetRegisterInfo().IsSMERegZT(reg)) {
// Unlike ZA, the kernel will return register data for ZT0 when ZA is not
// enabled. This data will be all 0s so we don't have to invent anything
@@ -802,7 +802,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
// ZA is part of the SME set but not stored with the other SME registers.
// So its byte offset is effectively always 0.
- dst = (uint8_t *)GetZABuffer() + GetZAHeaderSize();
+ dst = (uint8_t *)GetZABuffer() + GetSetSize(RegisterSetType::ZA_HEADER);
::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size);
// While this is writing a header that contains a vector length, the only
@@ -1259,7 +1259,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
// ZA header size you pass in. Therefore we must write header and register
// data (if present) in one go every time. Read the header only first just
// to get the size.
- ::memcpy(GetZAHeader(), src, GetZAHeaderSize());
+ ::memcpy(GetZAHeader(), src, GetSetSize(RegisterSetType::ZA_HEADER));
// Read the header and register data. Can't use the buffer size here, it
// may be incorrect due to being filled with dummy data previously. Resize
// this so WriteZA uses the correct size.
@@ -1663,9 +1663,9 @@ Status NativeRegisterContextLinux_arm64::ReadZAHeader() {
struct iovec ioVec;
ioVec.iov_base = GetZAHeader();
- ioVec.iov_len = GetZAHeaderSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::ZA_HEADER);
- error = ReadRegisterSet(&ioVec, GetZAHeaderSize(),
+ error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::ZA_HEADER),
GetPtraceSet(RegisterSetType::ZA));
if (error.Success())
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index 53fca1f10ab0f..57e25d408e6f6 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -254,8 +254,6 @@ class NativeRegisterContextLinux_arm64
void *GetZAHeader() { return &m_za_header; }
- size_t GetZAHeaderSize() { return sizeof(m_za_header); }
-
void *GetPACMask() { return &m_pac_mask; }
void *GetMTEControl() { return &m_mte_ctrl_reg; }
>From 97f0aa854ec4bc20b38707a53ab6695efd66be76 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:04:02 +0000
Subject: [PATCH 03/12] replace sve header
---
.../Process/Linux/NativeRegisterContextLinux_arm64.cpp | 10 +++++-----
.../Process/Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index 2a71201e0592e..17cdb5188de31 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -1155,7 +1155,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
// First write SVE header. We do not use RestoreRegisters because we do
// not want src to be modified yet.
- ::memcpy(GetSVEHeader(), src, GetSVEHeaderSize());
+ ::memcpy(GetSVEHeader(), src, GetSetSize(RegisterSetType::SVE_HEADER));
if (!sve::vl_valid(m_sve_header.vl)) {
Invalidate(RegisterSetType::SVE_HEADER);
error = Status::FromErrorStringWithFormat(
@@ -1446,9 +1446,9 @@ Status NativeRegisterContextLinux_arm64::ReadSVEHeader() {
struct iovec ioVec;
ioVec.iov_base = GetSVEHeader();
- ioVec.iov_len = GetSVEHeaderSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::SVE_HEADER);
- error = ReadRegisterSet(&ioVec, GetSVEHeaderSize(),
+ error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::SVE_HEADER),
GetPtraceSet(RegisterSetType::SVE_HEADER));
if (error.Success())
@@ -1485,11 +1485,11 @@ Status NativeRegisterContextLinux_arm64::WriteSVEHeader() {
struct iovec ioVec;
ioVec.iov_base = GetSVEHeader();
- ioVec.iov_len = GetSVEHeaderSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::SVE_HEADER);
Invalidate(RegisterSetType::SVE_HEADER);
- return WriteRegisterSet(&ioVec, GetSVEHeaderSize(),
+ return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::SVE_HEADER),
GetPtraceSet(RegisterSetType::SVE_HEADER));
}
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index 57e25d408e6f6..c8bfa6ad1b4de 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -272,8 +272,6 @@ class NativeRegisterContextLinux_arm64
void *GetPOEBuffer() { return &m_poe_regs; }
- size_t GetSVEHeaderSize() { return sizeof(m_sve_header); }
-
size_t GetPACMaskSize() { return sizeof(m_pac_mask); }
size_t GetSVEBufferSize() { return m_sve_ptrace_payload.size(); }
>From effd5e4e03afd7c17561e849de21acd4656661ee Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:08:27 +0000
Subject: [PATCH 04/12] replace PAC
---
.../Process/Linux/NativeRegisterContextLinux_arm64.cpp | 6 +++---
.../Process/Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index 17cdb5188de31..4a3a2ea258662 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -482,7 +482,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info,
return error;
offset = reg_info->byte_offset - GetRegisterInfo().GetPAuthOffset();
- assert(offset < GetPACMaskSize());
+ assert(offset < GetSetSize(RegisterSetType::PAC));
src = (uint8_t *)GetPACMask() + offset;
} else if (GetRegisterInfo().IsMTEReg(reg)) {
error = ReadMTEControl();
@@ -1465,9 +1465,9 @@ Status NativeRegisterContextLinux_arm64::ReadPAuthMask() {
struct iovec ioVec;
ioVec.iov_base = GetPACMask();
- ioVec.iov_len = GetPACMaskSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::PAC);
- error = ReadRegisterSet(&ioVec, GetPACMaskSize(),
+ error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::PAC),
GetPtraceSet(RegisterSetType::PAC));
if (error.Success())
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index c8bfa6ad1b4de..4059724f1525e 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -272,8 +272,6 @@ class NativeRegisterContextLinux_arm64
void *GetPOEBuffer() { return &m_poe_regs; }
- size_t GetPACMaskSize() { return sizeof(m_pac_mask); }
-
size_t GetSVEBufferSize() { return m_sve_ptrace_payload.size(); }
void *GetZABuffer() { return m_za_ptrace_payload.data(); };
>From 54f52364c3e33519da1392dba294b9253e853e27 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:09:42 +0000
Subject: [PATCH 05/12] remove sve buffer size
---
.../NativeRegisterContextLinux_arm64.cpp | 29 ++++++++++---------
.../Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index 4a3a2ea258662..9ef4afcdf0c37 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -387,7 +387,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info,
offset = CalculateSVEOffset(GetRegisterInfoAtIndex(sve_reg_num));
}
- assert(offset < GetSVEBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::SVE));
src = (uint8_t *)GetSVEBuffer() + offset;
}
} else if (GetRegisterInfo().IsTLSReg(reg)) {
@@ -466,13 +466,13 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info,
if (GetRegisterInfo().IsSVEZReg(reg)) {
offset = CalculateSVEOffset(reg_info);
- assert(offset < GetSVEBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::SVE));
::memcpy(sve_reg_non_live.data(), (uint8_t *)GetSVEBuffer() + offset,
16);
}
} else {
offset = CalculateSVEOffset(reg_info);
- assert(offset < GetSVEBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::SVE));
src = (uint8_t *)GetSVEBuffer() + offset;
}
}
@@ -650,7 +650,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
offset = CalculateSVEOffset(GetRegisterInfoAtIndex(sve_reg_num));
}
- assert(offset < GetSVEBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::SVE));
dst = (uint8_t *)GetSVEBuffer() + offset;
::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size);
return WriteAllSVE();
@@ -756,7 +756,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
// We are writing a Z register which is zero beyond 16 bytes so copy
// first 16 bytes only as SVE payload mirrors legacy fpsimd structure
offset = CalculateSVEOffset(reg_info);
- assert(offset < GetSVEBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::SVE));
dst = (uint8_t *)GetSVEBuffer() + offset;
::memcpy(dst, reg_value.GetBytes(), 16);
@@ -766,7 +766,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
"SVE state change operation not supported");
} else {
offset = CalculateSVEOffset(reg_info);
- assert(offset < GetSVEBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::SVE));
dst = (uint8_t *)GetSVEBuffer() + offset;
::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size);
return WriteAllSVE();
@@ -922,8 +922,8 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) {
if ((GetRegisterInfo().IsSVEPresent() || GetRegisterInfo().IsSSVEPresent()) &&
m_sve_state != SVEState::StreamingFPSIMD) {
// Store mode and register data.
- cached_size +=
- sizeof(RegisterSetType) + sizeof(m_sve_state) + GetSVEBufferSize();
+ cached_size += sizeof(RegisterSetType) + sizeof(m_sve_state) +
+ GetSetSize(RegisterSetType::SVE);
error = ReadAllSVE();
} else {
cached_size += sizeof(RegisterSetType) + GetFPRSize();
@@ -1034,7 +1034,8 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues(
dst = AddRegisterSetType(dst, RegisterSetType::SVE);
std::memcpy(dst, &m_sve_state, sizeof(m_sve_state));
dst += sizeof(m_sve_state);
- dst = AddSavedRegistersData(dst, GetSVEBuffer(), GetSVEBufferSize());
+ dst = AddSavedRegistersData(dst, GetSVEBuffer(),
+ GetSetSize(RegisterSetType::SVE));
} else {
dst = AddSavedRegisters(dst, RegisterSetType::FPR, GetFPRBuffer(),
GetFPRSize());
@@ -1176,7 +1177,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
// Write header and register data, incrementing src this time.
error = RestoreRegisters(
- GetSVEBuffer(), &src, GetSVEBufferSize(), kind,
+ GetSVEBuffer(), &src, GetSetSize(RegisterSetType::SVE), kind,
std::bind(&NativeRegisterContextLinux_arm64::WriteAllSVE, this));
break;
case RegisterSetType::FPR: {
@@ -1500,9 +1501,9 @@ Status NativeRegisterContextLinux_arm64::ReadAllSVE() {
struct iovec ioVec;
ioVec.iov_base = GetSVEBuffer();
- ioVec.iov_len = GetSVEBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::SVE);
- error = ReadRegisterSet(&ioVec, GetSVEBufferSize(),
+ error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::SVE),
GetPtraceSet(RegisterSetType::SVE));
if (error.Success())
@@ -1521,11 +1522,11 @@ Status NativeRegisterContextLinux_arm64::WriteAllSVE() {
struct iovec ioVec;
ioVec.iov_base = GetSVEBuffer();
- ioVec.iov_len = GetSVEBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::SVE);
Invalidate(RegisterSetType::SVE);
- return WriteRegisterSet(&ioVec, GetSVEBufferSize(),
+ return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::SVE),
GetPtraceSet(RegisterSetType::SVE));
}
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index 4059724f1525e..fc78968869205 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -272,8 +272,6 @@ class NativeRegisterContextLinux_arm64
void *GetPOEBuffer() { return &m_poe_regs; }
- size_t GetSVEBufferSize() { return m_sve_ptrace_payload.size(); }
-
void *GetZABuffer() { return m_za_ptrace_payload.data(); };
size_t GetZABufferSize() { return m_za_ptrace_payload.size(); }
>From 52dabda3b85e3c708487544151ef9014902033e1 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:10:45 +0000
Subject: [PATCH 06/12] convert ZA buffer
---
.../Linux/NativeRegisterContextLinux_arm64.cpp | 16 ++++++++--------
.../Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 8 insertions(+), 10 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index 9ef4afcdf0c37..e980342213e44 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -1024,7 +1024,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues(
if ((m_sve_state != SVEState::Streaming) && GetRegisterInfo().IsZAPresent()) {
// Use the header size not the buffer size, as we may be using the buffer
// for fake data, which we do not want to write out.
- assert(m_za_header.size <= GetZABufferSize());
+ assert(m_za_header.size <= GetSetSize(RegisterSetType::ZA));
dst = AddSavedRegisters(dst, RegisterSetType::ZA, GetZABuffer(),
m_za_header.size);
}
@@ -1042,7 +1042,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues(
}
if ((m_sve_state == SVEState::Streaming) && GetRegisterInfo().IsZAPresent()) {
- assert(m_za_header.size <= GetZABufferSize());
+ assert(m_za_header.size <= GetSetSize(RegisterSetType::ZA));
dst = AddSavedRegisters(dst, RegisterSetType::ZA, GetZABuffer(),
m_za_header.size);
}
@@ -1265,7 +1265,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
// may be incorrect due to being filled with dummy data previously. Resize
// this so WriteZA uses the correct size.
m_za_ptrace_payload.resize(m_za_header.size);
- ::memcpy(GetZABuffer(), src, GetZABufferSize());
+ ::memcpy(GetZABuffer(), src, GetSetSize(RegisterSetType::ZA));
MakeValid(RegisterSetType::ZA);
error = WriteZA();
@@ -1279,7 +1279,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
// ZA buffer now has proper size, read back the data we wrote above, from
// ptrace.
error = ReadZA();
- src += GetZABufferSize();
+ src += GetSetSize(RegisterSetType::ZA);
break;
case RegisterSetType::ZT:
// Doing this would activate an inactive ZA, however we will only get here
@@ -1683,9 +1683,9 @@ Status NativeRegisterContextLinux_arm64::ReadZA() {
struct iovec ioVec;
ioVec.iov_base = GetZABuffer();
- ioVec.iov_len = GetZABufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::ZA);
- error = ReadRegisterSet(&ioVec, GetZABufferSize(),
+ error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::ZA),
GetPtraceSet(RegisterSetType::ZA));
if (error.Success())
@@ -1706,11 +1706,11 @@ Status NativeRegisterContextLinux_arm64::WriteZA() {
struct iovec ioVec;
ioVec.iov_base = GetZABuffer();
- ioVec.iov_len = GetZABufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::ZA);
Invalidate(RegisterSetType::ZA);
- return WriteRegisterSet(&ioVec, GetZABufferSize(),
+ return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::ZA),
GetPtraceSet(RegisterSetType::ZA));
}
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index fc78968869205..c81662aa56aee 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -274,8 +274,6 @@ class NativeRegisterContextLinux_arm64
void *GetZABuffer() { return m_za_ptrace_payload.data(); };
- size_t GetZABufferSize() { return m_za_ptrace_payload.size(); }
-
size_t GetMTEControlSize() { return sizeof(m_mte_ctrl_reg); }
size_t GetTLSBufferSize() { return m_tls_size; }
>From d9ebe65ff032d4dd2f4b9fa79f3206d059be9542 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:12:00 +0000
Subject: [PATCH 07/12] convert MTE
---
.../Linux/NativeRegisterContextLinux_arm64.cpp | 18 +++++++++---------
.../Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index e980342213e44..de091eaf09d4e 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -490,7 +490,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info,
return error;
offset = reg_info->byte_offset - GetRegisterInfo().GetMTEOffset();
- assert(offset < GetMTEControlSize());
+ assert(offset < GetSetSize(RegisterSetType::MTE));
src = (uint8_t *)GetMTEControl() + offset;
} else if (GetRegisterInfo().IsSMEReg(reg)) {
if (GetRegisterInfo().IsSMERegZA(reg)) {
@@ -778,7 +778,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
return error;
offset = reg_info->byte_offset - GetRegisterInfo().GetMTEOffset();
- assert(offset < GetMTEControlSize());
+ assert(offset < GetSetSize(RegisterSetType::MTE));
dst = (uint8_t *)GetMTEControl() + offset;
::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size);
@@ -933,7 +933,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) {
return error;
if (GetRegisterInfo().IsMTEPresent()) {
- cached_size += sizeof(RegisterSetType) + GetMTEControlSize();
+ cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::MTE);
error = ReadMTEControl();
if (error.Fail())
return error;
@@ -1062,7 +1062,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues(
if (GetRegisterInfo().IsMTEPresent()) {
dst = AddSavedRegisters(dst, RegisterSetType::MTE, GetMTEControl(),
- GetMTEControlSize());
+ GetSetSize(RegisterSetType::MTE));
}
if (GetRegisterInfo().IsFPMRPresent()) {
@@ -1246,7 +1246,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
}
case RegisterSetType::MTE:
error = RestoreRegisters(
- GetMTEControl(), &src, GetMTEControlSize(), kind,
+ GetMTEControl(), &src, GetSetSize(RegisterSetType::MTE), kind,
std::bind(&NativeRegisterContextLinux_arm64::WriteMTEControl, this));
break;
case RegisterSetType::TLS:
@@ -1556,9 +1556,9 @@ Status NativeRegisterContextLinux_arm64::ReadMTEControl() {
struct iovec ioVec;
ioVec.iov_base = GetMTEControl();
- ioVec.iov_len = GetMTEControlSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::MTE);
- error = ReadRegisterSet(&ioVec, GetMTEControlSize(),
+ error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::MTE),
GetPtraceSet(RegisterSetType::MTE));
if (error.Success())
@@ -1576,11 +1576,11 @@ Status NativeRegisterContextLinux_arm64::WriteMTEControl() {
struct iovec ioVec;
ioVec.iov_base = GetMTEControl();
- ioVec.iov_len = GetMTEControlSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::MTE);
Invalidate(RegisterSetType::MTE);
- return WriteRegisterSet(&ioVec, GetMTEControlSize(),
+ return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::MTE),
GetPtraceSet(RegisterSetType::MTE));
}
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index c81662aa56aee..5cbb8aaac1cd4 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -274,8 +274,6 @@ class NativeRegisterContextLinux_arm64
void *GetZABuffer() { return m_za_ptrace_payload.data(); };
- size_t GetMTEControlSize() { return sizeof(m_mte_ctrl_reg); }
-
size_t GetTLSBufferSize() { return m_tls_size; }
size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); }
>From 8a810109085de132483077ccfb9046622614a5f7 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:13:07 +0000
Subject: [PATCH 08/12] convert TLS
---
.../Linux/NativeRegisterContextLinux_arm64.cpp | 18 +++++++++---------
.../Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index de091eaf09d4e..218336ce93a4e 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -396,7 +396,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info,
return error;
offset = reg_info->byte_offset - GetRegisterInfo().GetTLSOffset();
- assert(offset < GetTLSBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::TLS));
src = (uint8_t *)GetTLSBuffer() + offset;
} else if (GetRegisterInfo().IsSVEReg(reg)) {
if (m_sve_state == SVEState::Disabled || m_sve_state == SVEState::Unknown)
@@ -789,7 +789,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
return error;
offset = reg_info->byte_offset - GetRegisterInfo().GetTLSOffset();
- assert(offset < GetTLSBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::TLS));
dst = (uint8_t *)GetTLSBuffer() + offset;
::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size);
@@ -961,7 +961,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) {
}
// tpidr is always present but tpidr2 depends on SME.
- cached_size += sizeof(RegisterSetType) + GetTLSBufferSize();
+ cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::TLS);
error = ReadTLS();
return error;
@@ -1081,7 +1081,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues(
}
dst = AddSavedRegisters(dst, RegisterSetType::TLS, GetTLSBuffer(),
- GetTLSBufferSize());
+ GetSetSize(RegisterSetType::TLS));
return error;
}
@@ -1251,7 +1251,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
break;
case RegisterSetType::TLS:
error = RestoreRegisters(
- GetTLSBuffer(), &src, GetTLSBufferSize(), kind,
+ GetTLSBuffer(), &src, GetSetSize(RegisterSetType::TLS), kind,
std::bind(&NativeRegisterContextLinux_arm64::WriteTLS, this));
break;
case RegisterSetType::ZA:
@@ -1592,9 +1592,9 @@ Status NativeRegisterContextLinux_arm64::ReadTLS() {
struct iovec ioVec;
ioVec.iov_base = GetTLSBuffer();
- ioVec.iov_len = GetTLSBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::TLS);
- error = ReadRegisterSet(&ioVec, GetTLSBufferSize(),
+ error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::TLS),
GetPtraceSet(RegisterSetType::TLS));
if (error.Success())
@@ -1612,11 +1612,11 @@ Status NativeRegisterContextLinux_arm64::WriteTLS() {
struct iovec ioVec;
ioVec.iov_base = GetTLSBuffer();
- ioVec.iov_len = GetTLSBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::TLS);
Invalidate(RegisterSetType::TLS);
- return WriteRegisterSet(&ioVec, GetTLSBufferSize(),
+ return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::TLS),
GetPtraceSet(RegisterSetType::TLS));
}
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index 5cbb8aaac1cd4..b38ab9647ecaf 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -274,8 +274,6 @@ class NativeRegisterContextLinux_arm64
void *GetZABuffer() { return m_za_ptrace_payload.data(); };
- size_t GetTLSBufferSize() { return m_tls_size; }
-
size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); }
size_t GetZTBufferSize() { return m_zt_reg.size(); }
>From 7441268637e29e02cc270388139153ae97576c5e Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:14:15 +0000
Subject: [PATCH 09/12] convert ZT
---
.../Linux/NativeRegisterContextLinux_arm64.cpp | 14 +++++++-------
.../Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index 218336ce93a4e..c67076c82ec08 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -907,7 +907,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) {
GetRegisterInfo().IsZTPresent() &&
// And ZA is active, which means that ZT0 is also active.
m_za_header.size > sizeof(m_za_header)) {
- cached_size += sizeof(RegisterSetType) + GetZTBufferSize();
+ cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::ZT);
// The kernel handles an inactive ZT0 for us, and it will read as 0s if
// inactive (unlike ZA where we fake that behaviour).
error = ReadZT();
@@ -1058,7 +1058,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues(
// And ZA is enabled.
m_za_header.size > sizeof(m_za_header))
dst = AddSavedRegisters(dst, RegisterSetType::ZT, GetZTBuffer(),
- GetZTBufferSize());
+ GetSetSize(RegisterSetType::ZT));
if (GetRegisterInfo().IsMTEPresent()) {
dst = AddSavedRegisters(dst, RegisterSetType::MTE, GetMTEControl(),
@@ -1286,7 +1286,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
// if the state we are restoring had an active ZA. Restoring ZT0 will
// always come after restoring ZA.
error = RestoreRegisters(
- GetZTBuffer(), &src, GetZTBufferSize(), kind,
+ GetZTBuffer(), &src, GetSetSize(RegisterSetType::ZT), kind,
std::bind(&NativeRegisterContextLinux_arm64::WriteZT, this));
break;
case RegisterSetType::FPMR:
@@ -1722,9 +1722,9 @@ Status NativeRegisterContextLinux_arm64::ReadZT() {
struct iovec ioVec;
ioVec.iov_base = GetZTBuffer();
- ioVec.iov_len = GetZTBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::ZT);
- error = ReadRegisterSet(&ioVec, GetZTBufferSize(),
+ error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::ZT),
GetPtraceSet(RegisterSetType::ZT));
if (error.Success())
MakeValid(RegisterSetType::ZT);
@@ -1741,11 +1741,11 @@ Status NativeRegisterContextLinux_arm64::WriteZT() {
struct iovec ioVec;
ioVec.iov_base = GetZTBuffer();
- ioVec.iov_len = GetZTBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::ZT);
Invalidate(RegisterSetType::ZT);
- return WriteRegisterSet(&ioVec, GetZTBufferSize(),
+ return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::ZT),
GetPtraceSet(RegisterSetType::ZT));
}
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index b38ab9647ecaf..7943f62957863 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -276,8 +276,6 @@ class NativeRegisterContextLinux_arm64
size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); }
- size_t GetZTBufferSize() { return m_zt_reg.size(); }
-
size_t GetFPMRBufferSize() { return sizeof(m_fpmr_reg); }
size_t GetGCSBufferSize() { return sizeof(m_gcs_regs); }
>From fd2306b95034ef007303f2fe35505c71969a9d45 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:15:13 +0000
Subject: [PATCH 10/12] convert FPMR
---
.../Linux/NativeRegisterContextLinux_arm64.cpp | 18 +++++++++---------
.../Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index c67076c82ec08..06b17880d5380 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -545,7 +545,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info,
return error;
offset = reg_info->byte_offset - GetRegisterInfo().GetFPMROffset();
- assert(offset < GetFPMRBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::FPMR));
src = (uint8_t *)GetFPMRBuffer() + offset;
} else if (GetRegisterInfo().IsGCSReg(reg)) {
error = ReadGCS();
@@ -827,7 +827,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
return error;
offset = reg_info->byte_offset - GetRegisterInfo().GetFPMROffset();
- assert(offset < GetFPMRBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::FPMR));
dst = (uint8_t *)GetFPMRBuffer() + offset;
::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size);
@@ -940,7 +940,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) {
}
if (GetRegisterInfo().IsFPMRPresent()) {
- cached_size += sizeof(RegisterSetType) + GetFPMRBufferSize();
+ cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::FPMR);
error = ReadFPMR();
if (error.Fail())
return error;
@@ -1067,7 +1067,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues(
if (GetRegisterInfo().IsFPMRPresent()) {
dst = AddSavedRegisters(dst, RegisterSetType::FPMR, GetFPMRBuffer(),
- GetFPMRBufferSize());
+ GetSetSize(RegisterSetType::FPMR));
}
if (GetRegisterInfo().IsGCSPresent()) {
@@ -1291,7 +1291,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
break;
case RegisterSetType::FPMR:
error = RestoreRegisters(
- GetFPMRBuffer(), &src, GetFPMRBufferSize(), kind,
+ GetFPMRBuffer(), &src, GetSetSize(RegisterSetType::FPMR), kind,
std::bind(&NativeRegisterContextLinux_arm64::WriteFPMR, this));
break;
case RegisterSetType::GCS: {
@@ -1757,9 +1757,9 @@ Status NativeRegisterContextLinux_arm64::ReadFPMR() {
struct iovec ioVec;
ioVec.iov_base = GetFPMRBuffer();
- ioVec.iov_len = GetFPMRBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::FPMR);
- error = ReadRegisterSet(&ioVec, GetFPMRBufferSize(),
+ error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::FPMR),
GetPtraceSet(RegisterSetType::FPMR));
if (error.Success())
@@ -1777,11 +1777,11 @@ Status NativeRegisterContextLinux_arm64::WriteFPMR() {
struct iovec ioVec;
ioVec.iov_base = GetFPMRBuffer();
- ioVec.iov_len = GetFPMRBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::FPMR);
Invalidate(RegisterSetType::FPMR);
- return WriteRegisterSet(&ioVec, GetFPMRBufferSize(),
+ return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::FPMR),
GetPtraceSet(RegisterSetType::FPMR));
}
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index 7943f62957863..69b74240c8325 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -276,8 +276,6 @@ class NativeRegisterContextLinux_arm64
size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); }
- size_t GetFPMRBufferSize() { return sizeof(m_fpmr_reg); }
-
size_t GetGCSBufferSize() { return sizeof(m_gcs_regs); }
size_t GetPOEBufferSize() { return sizeof(m_poe_regs); }
>From 52e0e72d9a9309f4693a272e0da579b091711889 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:15:55 +0000
Subject: [PATCH 11/12] convert gcs
---
.../NativeRegisterContextLinux_arm64.cpp | 20 +++++++++----------
.../Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 10 insertions(+), 12 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index 06b17880d5380..f2d2997945f5b 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -553,7 +553,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info,
return error;
offset = reg_info->byte_offset - GetRegisterInfo().GetGCSOffset();
- assert(offset < GetGCSBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::GCS));
src = (uint8_t *)GetGCSBuffer() + offset;
} else if (GetRegisterInfo().IsPOEReg(reg)) {
error = ReadPOE();
@@ -838,7 +838,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
return error;
offset = reg_info->byte_offset - GetRegisterInfo().GetGCSOffset();
- assert(offset < GetGCSBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::GCS));
dst = (uint8_t *)GetGCSBuffer() + offset;
::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size);
@@ -947,7 +947,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) {
}
if (GetRegisterInfo().IsGCSPresent()) {
- cached_size += sizeof(RegisterSetType) + GetGCSBufferSize();
+ cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::GCS);
error = ReadGCS();
if (error.Fail())
return error;
@@ -1072,7 +1072,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues(
if (GetRegisterInfo().IsGCSPresent()) {
dst = AddSavedRegisters(dst, RegisterSetType::GCS, GetGCSBuffer(),
- GetGCSBufferSize());
+ GetSetSize(RegisterSetType::GCS));
}
if (GetRegisterInfo().IsPOEPresent()) {
@@ -1313,9 +1313,9 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
const uint8_t *new_gcs_src =
reinterpret_cast<const uint8_t *>(&new_gcs_regs);
error = RestoreRegisters(
- GetGCSBuffer(), &new_gcs_src, GetGCSBufferSize(), kind,
+ GetGCSBuffer(), &new_gcs_src, GetSetSize(RegisterSetType::GCS), kind,
std::bind(&NativeRegisterContextLinux_arm64::WriteGCS, this));
- src += GetGCSBufferSize();
+ src += GetSetSize(RegisterSetType::GCS);
break;
}
@@ -1628,9 +1628,9 @@ Status NativeRegisterContextLinux_arm64::ReadGCS() {
struct iovec ioVec;
ioVec.iov_base = GetGCSBuffer();
- ioVec.iov_len = GetGCSBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::GCS);
- error = ReadRegisterSet(&ioVec, GetGCSBufferSize(),
+ error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::GCS),
GetPtraceSet(RegisterSetType::GCS));
if (error.Success())
@@ -1648,11 +1648,11 @@ Status NativeRegisterContextLinux_arm64::WriteGCS() {
struct iovec ioVec;
ioVec.iov_base = GetGCSBuffer();
- ioVec.iov_len = GetGCSBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::GCS);
Invalidate(RegisterSetType::GCS);
- return WriteRegisterSet(&ioVec, GetGCSBufferSize(),
+ return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::GCS),
GetPtraceSet(RegisterSetType::GCS));
}
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index 69b74240c8325..4474d463504bc 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -276,8 +276,6 @@ class NativeRegisterContextLinux_arm64
size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); }
- size_t GetGCSBufferSize() { return sizeof(m_gcs_regs); }
-
size_t GetPOEBufferSize() { return sizeof(m_poe_regs); }
llvm::Error ReadHardwareDebugInfo() override;
>From 2043662c2c0a111dee658b5f1d66859f606ab340 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:16:41 +0000
Subject: [PATCH 12/12] convert POE
---
.../Linux/NativeRegisterContextLinux_arm64.cpp | 18 +++++++++---------
.../Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index f2d2997945f5b..a7bad1ef7004a 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -561,7 +561,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info,
return error;
offset = reg_info->byte_offset - GetRegisterInfo().GetPOEOffset();
- assert(offset < GetPOEBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::POE));
src = (uint8_t *)GetPOEBuffer() + offset;
} else
return Status::FromErrorString(
@@ -849,7 +849,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
return error;
offset = reg_info->byte_offset - GetRegisterInfo().GetPOEOffset();
- assert(offset < GetPOEBufferSize());
+ assert(offset < GetSetSize(RegisterSetType::POE));
dst = (uint8_t *)GetPOEBuffer() + offset;
::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size);
@@ -954,7 +954,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) {
}
if (GetRegisterInfo().IsPOEPresent()) {
- cached_size += sizeof(RegisterSetType) + GetPOEBufferSize();
+ cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::POE);
error = ReadPOE();
if (error.Fail())
return error;
@@ -1077,7 +1077,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues(
if (GetRegisterInfo().IsPOEPresent()) {
dst = AddSavedRegisters(dst, RegisterSetType::POE, GetPOEBuffer(),
- GetPOEBufferSize());
+ GetSetSize(RegisterSetType::POE));
}
dst = AddSavedRegisters(dst, RegisterSetType::TLS, GetTLSBuffer(),
@@ -1321,7 +1321,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
}
case RegisterSetType::POE:
error = RestoreRegisters(
- GetPOEBuffer(), &src, GetPOEBufferSize(), kind,
+ GetPOEBuffer(), &src, GetSetSize(RegisterSetType::POE), kind,
std::bind(&NativeRegisterContextLinux_arm64::WritePOE, this));
break;
case RegisterSetType::PAC:
@@ -1793,9 +1793,9 @@ Status NativeRegisterContextLinux_arm64::ReadPOE() {
struct iovec ioVec;
ioVec.iov_base = GetPOEBuffer();
- ioVec.iov_len = GetPOEBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::POE);
- error = ReadRegisterSet(&ioVec, GetPOEBufferSize(),
+ error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::POE),
GetPtraceSet(RegisterSetType::POE));
if (error.Success())
@@ -1813,11 +1813,11 @@ Status NativeRegisterContextLinux_arm64::WritePOE() {
struct iovec ioVec;
ioVec.iov_base = GetPOEBuffer();
- ioVec.iov_len = GetPOEBufferSize();
+ ioVec.iov_len = GetSetSize(RegisterSetType::POE);
Invalidate(RegisterSetType::POE);
- return WriteRegisterSet(&ioVec, GetPOEBufferSize(),
+ return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::POE),
GetPtraceSet(RegisterSetType::POE));
}
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index 4474d463504bc..f9e7de073da6d 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -276,8 +276,6 @@ class NativeRegisterContextLinux_arm64
size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); }
- size_t GetPOEBufferSize() { return sizeof(m_poe_regs); }
-
llvm::Error ReadHardwareDebugInfo() override;
llvm::Error WriteHardwareDebugRegs(DREGType hwbType) override;
More information about the llvm-branch-commits
mailing list