[Lldb-commits] [lldb] [lldb][AArch64][Linux] Add function to lookup ptrace set number (PR #213975)
David Spickett via lldb-commits
lldb-commits at lists.llvm.org
Wed Aug 12 03:51:42 PDT 2026
https://github.com/DavidSpickett updated https://github.com/llvm/llvm-project/pull/213975
>From f0c21b9c51179af46de610ec9954bec297a18aeb Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 13:35:52 +0000
Subject: [PATCH 1/4] [lldb][AArch64][Linux] Add function to lookup ptrace set
number
This will be part of a set of RegisterSetType -> thing lookup
functions later used to implement generic read and write functions.
This replaces GetSVERegSet and any other direct uses of ptrace
set numbers. Apart from a couple where we are trying to detect
SVE and SME regardless of what the current mode is.
---
.../NativeRegisterContextLinux_arm64.cpp | 36 +++++++++++++++++++
.../Linux/NativeRegisterContextLinux_arm64.h | 3 ++
2 files changed, 39 insertions(+)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index caac1c6da17c0..c88f6bb07005e 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -87,6 +87,42 @@ NativeRegisterContextLinux_arm64::GetInvalidationMask(
}
}
+unsigned int NativeRegisterContextLinux_arm64::GetPtraceSet(
+ NativeRegisterContextLinux_arm64::RegisterSetType set) const {
+ switch (set) {
+ case RegisterSetType::GPR:
+ return llvm::ELF::NT_PRSTATUS;
+ case RegisterSetType::FPR:
+ return llvm::ELF::NT_FPREGSET;
+ case RegisterSetType::SVE:
+ case RegisterSetType::SVE_HEADER:
+ switch (m_sve_state) {
+ case SVEState::Streaming:
+ case SVEState::StreamingFPSIMD:
+ return llvm::ELF::NT_ARM_SSVE;
+ default:
+ return llvm::ELF::NT_ARM_SVE;
+ }
+ case RegisterSetType::PAC:
+ return llvm::ELF::NT_ARM_PAC_MASK;
+ case RegisterSetType::MTE:
+ return llvm::ELF::NT_ARM_TAGGED_ADDR_CTRL;
+ case RegisterSetType::TLS:
+ return llvm::ELF::NT_ARM_TLS;
+ case RegisterSetType::ZA:
+ case RegisterSetType::ZA_HEADER:
+ return llvm::ELF::NT_ARM_ZA;
+ case RegisterSetType::ZT:
+ return llvm::ELF::NT_ARM_ZT;
+ case RegisterSetType::FPMR:
+ return llvm::ELF::NT_ARM_FPMR;
+ case RegisterSetType::GCS:
+ return llvm::ELF::NT_ARM_GCS;
+ case RegisterSetType::POE:
+ return llvm::ELF::NT_ARM_POE;
+ }
+}
+
// 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 a9f34399f2a34..1db2ac91af253 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -117,6 +117,9 @@ class NativeRegisterContextLinux_arm64
RegisterSetType m_validity = static_cast<RegisterSetType>(0);
+ // Returns the ptrace register set number for the given register set.
+ unsigned int GetPtraceSet(RegisterSetType set) const;
+
void MakeValid(RegisterSetType set) { m_validity |= set; }
[[nodiscard]] bool IsValid(RegisterSetType set) const {
>From 465a52b4d9f25304cf4d7c8d9317e1a39f848c26 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 13:38:55 +0000
Subject: [PATCH 2/4] remove GetSVERegSet
---
.../NativeRegisterContextLinux_arm64.cpp | 22 +++++++------------
.../Linux/NativeRegisterContextLinux_arm64.h | 2 --
2 files changed, 8 insertions(+), 16 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index c88f6bb07005e..6a53ca2e33bdd 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -1400,16 +1400,6 @@ void NativeRegisterContextLinux_arm64::InvalidateAllRegisters() {
ConfigureRegisterContext();
}
-unsigned NativeRegisterContextLinux_arm64::GetSVERegSet() {
- switch (m_sve_state) {
- case SVEState::Streaming:
- case SVEState::StreamingFPSIMD:
- return llvm::ELF::NT_ARM_SSVE;
- default:
- return llvm::ELF::NT_ARM_SVE;
- }
-}
-
Status NativeRegisterContextLinux_arm64::ReadSVEHeader() {
Status error;
@@ -1420,7 +1410,8 @@ Status NativeRegisterContextLinux_arm64::ReadSVEHeader() {
ioVec.iov_base = GetSVEHeader();
ioVec.iov_len = GetSVEHeaderSize();
- error = ReadRegisterSet(&ioVec, GetSVEHeaderSize(), GetSVERegSet());
+ error = ReadRegisterSet(&ioVec, GetSVEHeaderSize(),
+ GetPtraceSet(RegisterSetType::SVE));
if (error.Success())
MakeValid(RegisterSetType::SVE_HEADER);
@@ -1459,7 +1450,8 @@ Status NativeRegisterContextLinux_arm64::WriteSVEHeader() {
Invalidate(RegisterSetType::SVE_HEADER);
- return WriteRegisterSet(&ioVec, GetSVEHeaderSize(), GetSVERegSet());
+ return WriteRegisterSet(&ioVec, GetSVEHeaderSize(),
+ GetPtraceSet(RegisterSetType::SVE));
}
Status NativeRegisterContextLinux_arm64::ReadAllSVE() {
@@ -1471,7 +1463,8 @@ Status NativeRegisterContextLinux_arm64::ReadAllSVE() {
ioVec.iov_base = GetSVEBuffer();
ioVec.iov_len = GetSVEBufferSize();
- error = ReadRegisterSet(&ioVec, GetSVEBufferSize(), GetSVERegSet());
+ error = ReadRegisterSet(&ioVec, GetSVEBufferSize(),
+ GetPtraceSet(RegisterSetType::SVE));
if (error.Success())
MakeValid(RegisterSetType::SVE);
@@ -1493,7 +1486,8 @@ Status NativeRegisterContextLinux_arm64::WriteAllSVE() {
Invalidate(RegisterSetType::SVE);
- return WriteRegisterSet(&ioVec, GetSVEBufferSize(), GetSVERegSet());
+ return WriteRegisterSet(&ioVec, GetSVEBufferSize(),
+ GetPtraceSet(RegisterSetType::SVE));
}
Status NativeRegisterContextLinux_arm64::ReadSMEControl() {
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
index 1db2ac91af253..8e6b2d793bf6f 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h
@@ -278,8 +278,6 @@ class NativeRegisterContextLinux_arm64
size_t GetSVEBufferSize() { return m_sve_ptrace_payload.size(); }
- unsigned GetSVERegSet();
-
void *GetZABuffer() { return m_za_ptrace_payload.data(); };
size_t GetZABufferSize() { return m_za_ptrace_payload.size(); }
>From 95f7454b528e08889bf1f526737464139c16588d Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 13:48:40 +0000
Subject: [PATCH 3/4] convert uses of constants
---
.../NativeRegisterContextLinux_arm64.cpp | 58 ++++++++++++-------
1 file changed, 38 insertions(+), 20 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index 6a53ca2e33bdd..d048c8a7a9d8b 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -1340,7 +1340,8 @@ Status NativeRegisterContextLinux_arm64::ReadGPR() {
ioVec.iov_base = GetGPRBuffer();
ioVec.iov_len = GetGPRBufferSize();
- error = ReadRegisterSet(&ioVec, GetGPRBufferSize(), llvm::ELF::NT_PRSTATUS);
+ error = ReadRegisterSet(&ioVec, GetGPRBufferSize(),
+ GetPtraceSet(RegisterSetType::GPR));
if (error.Success())
MakeValid(RegisterSetType::GPR);
@@ -1359,7 +1360,8 @@ Status NativeRegisterContextLinux_arm64::WriteGPR() {
Invalidate(RegisterSetType::GPR);
- return WriteRegisterSet(&ioVec, GetGPRBufferSize(), llvm::ELF::NT_PRSTATUS);
+ return WriteRegisterSet(&ioVec, GetGPRBufferSize(),
+ GetPtraceSet(RegisterSetType::GPR));
}
Status NativeRegisterContextLinux_arm64::ReadFPR() {
@@ -1372,7 +1374,8 @@ Status NativeRegisterContextLinux_arm64::ReadFPR() {
ioVec.iov_base = GetFPRBuffer();
ioVec.iov_len = GetFPRSize();
- error = ReadRegisterSet(&ioVec, GetFPRSize(), llvm::ELF::NT_FPREGSET);
+ error =
+ ReadRegisterSet(&ioVec, GetFPRSize(), GetPtraceSet(RegisterSetType::FPR));
if (error.Success())
MakeValid(RegisterSetType::FPR);
@@ -1390,7 +1393,8 @@ Status NativeRegisterContextLinux_arm64::WriteFPR() {
Invalidate(RegisterSetType::FPR);
- return WriteRegisterSet(&ioVec, GetFPRSize(), llvm::ELF::NT_FPREGSET);
+ return WriteRegisterSet(&ioVec, GetFPRSize(),
+ GetPtraceSet(RegisterSetType::FPR));
}
void NativeRegisterContextLinux_arm64::InvalidateAllRegisters() {
@@ -1429,7 +1433,8 @@ Status NativeRegisterContextLinux_arm64::ReadPAuthMask() {
ioVec.iov_base = GetPACMask();
ioVec.iov_len = GetPACMaskSize();
- error = ReadRegisterSet(&ioVec, GetPACMaskSize(), llvm::ELF::NT_ARM_PAC_MASK);
+ error = ReadRegisterSet(&ioVec, GetPACMaskSize(),
+ GetPtraceSet(RegisterSetType::PAC));
if (error.Success())
MakeValid(RegisterSetType::PAC);
@@ -1519,7 +1524,7 @@ Status NativeRegisterContextLinux_arm64::ReadMTEControl() {
ioVec.iov_len = GetMTEControlSize();
error = ReadRegisterSet(&ioVec, GetMTEControlSize(),
- llvm::ELF::NT_ARM_TAGGED_ADDR_CTRL);
+ GetPtraceSet(RegisterSetType::MTE));
if (error.Success())
MakeValid(RegisterSetType::MTE);
@@ -1541,7 +1546,7 @@ Status NativeRegisterContextLinux_arm64::WriteMTEControl() {
Invalidate(RegisterSetType::MTE);
return WriteRegisterSet(&ioVec, GetMTEControlSize(),
- llvm::ELF::NT_ARM_TAGGED_ADDR_CTRL);
+ GetPtraceSet(RegisterSetType::MTE));
}
Status NativeRegisterContextLinux_arm64::ReadTLS() {
@@ -1554,7 +1559,8 @@ Status NativeRegisterContextLinux_arm64::ReadTLS() {
ioVec.iov_base = GetTLSBuffer();
ioVec.iov_len = GetTLSBufferSize();
- error = ReadRegisterSet(&ioVec, GetTLSBufferSize(), llvm::ELF::NT_ARM_TLS);
+ error = ReadRegisterSet(&ioVec, GetTLSBufferSize(),
+ GetPtraceSet(RegisterSetType::TLS));
if (error.Success())
MakeValid(RegisterSetType::TLS);
@@ -1575,7 +1581,8 @@ Status NativeRegisterContextLinux_arm64::WriteTLS() {
Invalidate(RegisterSetType::TLS);
- return WriteRegisterSet(&ioVec, GetTLSBufferSize(), llvm::ELF::NT_ARM_TLS);
+ return WriteRegisterSet(&ioVec, GetTLSBufferSize(),
+ GetPtraceSet(RegisterSetType::TLS));
}
Status NativeRegisterContextLinux_arm64::ReadGCS() {
@@ -1588,7 +1595,8 @@ Status NativeRegisterContextLinux_arm64::ReadGCS() {
ioVec.iov_base = GetGCSBuffer();
ioVec.iov_len = GetGCSBufferSize();
- error = ReadRegisterSet(&ioVec, GetGCSBufferSize(), llvm::ELF::NT_ARM_GCS);
+ error = ReadRegisterSet(&ioVec, GetGCSBufferSize(),
+ GetPtraceSet(RegisterSetType::GCS));
if (error.Success())
MakeValid(RegisterSetType::GCS);
@@ -1609,7 +1617,8 @@ Status NativeRegisterContextLinux_arm64::WriteGCS() {
Invalidate(RegisterSetType::GCS);
- return WriteRegisterSet(&ioVec, GetGCSBufferSize(), llvm::ELF::NT_ARM_GCS);
+ return WriteRegisterSet(&ioVec, GetGCSBufferSize(),
+ GetPtraceSet(RegisterSetType::GCS));
}
Status NativeRegisterContextLinux_arm64::ReadZAHeader() {
@@ -1622,7 +1631,8 @@ Status NativeRegisterContextLinux_arm64::ReadZAHeader() {
ioVec.iov_base = GetZAHeader();
ioVec.iov_len = GetZAHeaderSize();
- error = ReadRegisterSet(&ioVec, GetZAHeaderSize(), llvm::ELF::NT_ARM_ZA);
+ error = ReadRegisterSet(&ioVec, GetZAHeaderSize(),
+ GetPtraceSet(RegisterSetType::ZA));
if (error.Success())
MakeValid(RegisterSetType::ZA_HEADER);
@@ -1640,7 +1650,8 @@ Status NativeRegisterContextLinux_arm64::ReadZA() {
ioVec.iov_base = GetZABuffer();
ioVec.iov_len = GetZABufferSize();
- error = ReadRegisterSet(&ioVec, GetZABufferSize(), llvm::ELF::NT_ARM_ZA);
+ error = ReadRegisterSet(&ioVec, GetZABufferSize(),
+ GetPtraceSet(RegisterSetType::ZA));
if (error.Success())
MakeValid(RegisterSetType::ZA);
@@ -1664,7 +1675,8 @@ Status NativeRegisterContextLinux_arm64::WriteZA() {
Invalidate(RegisterSetType::ZA);
- return WriteRegisterSet(&ioVec, GetZABufferSize(), llvm::ELF::NT_ARM_ZA);
+ return WriteRegisterSet(&ioVec, GetZABufferSize(),
+ GetPtraceSet(RegisterSetType::ZA));
}
Status NativeRegisterContextLinux_arm64::ReadZT() {
@@ -1677,7 +1689,8 @@ Status NativeRegisterContextLinux_arm64::ReadZT() {
ioVec.iov_base = GetZTBuffer();
ioVec.iov_len = GetZTBufferSize();
- error = ReadRegisterSet(&ioVec, GetZTBufferSize(), llvm::ELF::NT_ARM_ZT);
+ error = ReadRegisterSet(&ioVec, GetZTBufferSize(),
+ GetPtraceSet(RegisterSetType::ZT));
if (error.Success())
MakeValid(RegisterSetType::ZT);
@@ -1697,7 +1710,8 @@ Status NativeRegisterContextLinux_arm64::WriteZT() {
Invalidate(RegisterSetType::ZT);
- return WriteRegisterSet(&ioVec, GetZTBufferSize(), llvm::ELF::NT_ARM_ZT);
+ return WriteRegisterSet(&ioVec, GetZTBufferSize(),
+ GetPtraceSet(RegisterSetType::ZT));
}
Status NativeRegisterContextLinux_arm64::ReadFPMR() {
@@ -1710,7 +1724,8 @@ Status NativeRegisterContextLinux_arm64::ReadFPMR() {
ioVec.iov_base = GetFPMRBuffer();
ioVec.iov_len = GetFPMRBufferSize();
- error = ReadRegisterSet(&ioVec, GetFPMRBufferSize(), llvm::ELF::NT_ARM_FPMR);
+ error = ReadRegisterSet(&ioVec, GetFPMRBufferSize(),
+ GetPtraceSet(RegisterSetType::FPMR));
if (error.Success())
MakeValid(RegisterSetType::FPMR);
@@ -1731,7 +1746,8 @@ Status NativeRegisterContextLinux_arm64::WriteFPMR() {
Invalidate(RegisterSetType::FPMR);
- return WriteRegisterSet(&ioVec, GetFPMRBufferSize(), llvm::ELF::NT_ARM_FPMR);
+ return WriteRegisterSet(&ioVec, GetFPMRBufferSize(),
+ GetPtraceSet(RegisterSetType::FPMR));
}
Status NativeRegisterContextLinux_arm64::ReadPOE() {
@@ -1744,7 +1760,8 @@ Status NativeRegisterContextLinux_arm64::ReadPOE() {
ioVec.iov_base = GetPOEBuffer();
ioVec.iov_len = GetPOEBufferSize();
- error = ReadRegisterSet(&ioVec, GetPOEBufferSize(), llvm::ELF::NT_ARM_POE);
+ error = ReadRegisterSet(&ioVec, GetPOEBufferSize(),
+ GetPtraceSet(RegisterSetType::POE));
if (error.Success())
MakeValid(RegisterSetType::POE);
@@ -1765,7 +1782,8 @@ Status NativeRegisterContextLinux_arm64::WritePOE() {
Invalidate(RegisterSetType::POE);
- return WriteRegisterSet(&ioVec, GetPOEBufferSize(), llvm::ELF::NT_ARM_POE);
+ return WriteRegisterSet(&ioVec, GetPOEBufferSize(),
+ GetPtraceSet(RegisterSetType::POE));
}
void NativeRegisterContextLinux_arm64::ConfigureRegisterContext() {
>From ec0b232a3af32a93524bc4a5372ddc02ef1a8b40 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Tue, 4 Aug 2026 14:05:12 +0000
Subject: [PATCH 4/4] SVE -> SVE_HEADER
---
.../Process/Linux/NativeRegisterContextLinux_arm64.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
index d048c8a7a9d8b..a870c07aa0459 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp
@@ -1415,7 +1415,7 @@ Status NativeRegisterContextLinux_arm64::ReadSVEHeader() {
ioVec.iov_len = GetSVEHeaderSize();
error = ReadRegisterSet(&ioVec, GetSVEHeaderSize(),
- GetPtraceSet(RegisterSetType::SVE));
+ GetPtraceSet(RegisterSetType::SVE_HEADER));
if (error.Success())
MakeValid(RegisterSetType::SVE_HEADER);
@@ -1456,7 +1456,7 @@ Status NativeRegisterContextLinux_arm64::WriteSVEHeader() {
Invalidate(RegisterSetType::SVE_HEADER);
return WriteRegisterSet(&ioVec, GetSVEHeaderSize(),
- GetPtraceSet(RegisterSetType::SVE));
+ GetPtraceSet(RegisterSetType::SVE_HEADER));
}
Status NativeRegisterContextLinux_arm64::ReadAllSVE() {
More information about the lldb-commits
mailing list