diff options
author | 2020-12-02 03:09:14 +0500 | |
---|---|---|
committer | 2020-12-02 03:19:39 +0500 | |
commit | 26b8ea2e3782890be96612701866d8ccec616bdc (patch) | |
tree | bce61a27d01eb75e161f3b86e4d4ce1a8c7debfc | |
parent | [OpenMP51][DOCS] Claim "add present modifier in defaultmap clause", NFC. (diff) | |
download | llvm-project-26b8ea2e3782890be96612701866d8ccec616bdc.tar.gz llvm-project-26b8ea2e3782890be96612701866d8ccec616bdc.tar.bz2 llvm-project-26b8ea2e3782890be96612701866d8ccec616bdc.zip |
RegisterInfoPOSIX_arm64 remove unused bytes from g/G packet
This came up while putting together our new strategy to create g/G packets
in compliance with GDB RSP protocol where register offsets are calculated in
increasing order of register numbers without any unused spacing.
RegisterInfoPOSIX_arm64::GPR size was being calculated after alignment
correction to 8 bytes which meant there was a 4 bytes unused space between
last gpr (cpsr) and first vector register V. We have put LLVM_PACKED_START
decorator on RegisterInfoPOSIX_arm64::GPR to make sure single byte
alignment is enforced. Moreover we are now doing to use arm64 user_pt_regs
struct defined in ptrace.h for accessing ptrace user registers.
Reviewed By: labath
Differential Revision: https://reviews.llvm.org/D92063
3 files changed, 11 insertions, 5 deletions
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index 49badd8ef940..6b2dd25ba44d 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -936,9 +936,9 @@ Status NativeRegisterContextLinux_arm64::ReadGPR() { struct iovec ioVec; ioVec.iov_base = GetGPRBuffer(); - ioVec.iov_len = GetGPRSize(); + ioVec.iov_len = GetGPRBufferSize(); - error = ReadRegisterSet(&ioVec, GetGPRSize(), NT_PRSTATUS); + error = ReadRegisterSet(&ioVec, GetGPRBufferSize(), NT_PRSTATUS); if (error.Success()) m_gpr_is_valid = true; @@ -953,11 +953,11 @@ Status NativeRegisterContextLinux_arm64::WriteGPR() { struct iovec ioVec; ioVec.iov_base = GetGPRBuffer(); - ioVec.iov_len = GetGPRSize(); + ioVec.iov_len = GetGPRBufferSize(); m_gpr_is_valid = false; - return WriteRegisterSet(&ioVec, GetGPRSize(), NT_PRSTATUS); + return WriteRegisterSet(&ioVec, GetGPRBufferSize(), NT_PRSTATUS); } Status NativeRegisterContextLinux_arm64::ReadFPR() { diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index 3d0656dceb62..9ba8c7699a56 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -95,6 +95,10 @@ protected: void *GetGPRBuffer() override { return &m_gpr_arm64; } + // GetGPRBufferSize returns sizeof arm64 GPR ptrace buffer, it is different + // from GetGPRSize which returns sizeof RegisterInfoPOSIX_arm64::GPR. + size_t GetGPRBufferSize() { return sizeof(m_gpr_arm64); } + void *GetFPRBuffer() override { return &m_fpr; } size_t GetFPRSize() override { return sizeof(m_fpr); } @@ -106,7 +110,7 @@ private: bool m_sve_header_is_valid; - RegisterInfoPOSIX_arm64::GPR m_gpr_arm64; // 64-bit general purpose registers. + struct user_pt_regs m_gpr_arm64; // 64-bit general purpose registers. RegisterInfoPOSIX_arm64::FPU m_fpr; // floating-point registers including extended register sets. diff --git a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h index 37f7c23b62c5..1cbed5acb41c 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h +++ b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h @@ -29,6 +29,7 @@ public: }; // based on RegisterContextDarwin_arm64.h + LLVM_PACKED_START struct GPR { uint64_t x[29]; // x0-x28 uint64_t fp; // x29 @@ -37,6 +38,7 @@ public: uint64_t pc; // pc uint32_t cpsr; // cpsr }; + LLVM_PACKED_END // based on RegisterContextDarwin_arm64.h struct VReg { |