diff options
| author | Michal Gorny <mgorny@gentoo.org> | 2019-06-21 13:19:34 +0000 |
|---|---|---|
| committer | Michal Gorny <mgorny@gentoo.org> | 2019-06-21 13:19:34 +0000 |
| commit | 8805829289202e282f931e1ab9af60c5fecb2712 (patch) | |
| tree | df9e6ef71a8876368d6daee19e810f4509f39dbc /lldb/source/Plugins/Process/Linux | |
| parent | 0c7af66450bae7eedde53c7cdbd6457a205307e3 (diff) | |
| download | bcm5719-llvm-8805829289202e282f931e1ab9af60c5fecb2712.tar.gz bcm5719-llvm-8805829289202e282f931e1ab9af60c5fecb2712.zip | |
[lldb] [Process] Introduce common helpers to split/recombine YMM data
Introduce two common helpers to take care of splitting and recombining
YMM registers to/from XSAVE-like data. Since FreeBSD, Linux and NetBSD
all use XSAVE-like data structures but with potentially different field
layouts, the function takes two pointers -- to XMM register and to YMM
high bits, and copies the data from/to YMMReg type.
While at it, remove support for big endian. To mine and Pavel Labath's
combined knowledge, there is no such thing on x86. Furthermore,
assuming that the YMM register data would be swapped for big endian
seems to be a weird assumption.
Differential Revision: https://reviews.llvm.org/D63610
llvm-svn: 364042
Diffstat (limited to 'lldb/source/Plugins/Process/Linux')
| -rw-r--r-- | lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp | 38 |
1 files changed, 8 insertions, 30 deletions
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp index 029bdf48b12..3c5326898b0 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp @@ -903,26 +903,13 @@ bool NativeRegisterContextLinux_x86_64::CopyXSTATEtoYMM( return false; if (byte_order == lldb::eByteOrderLittle) { - ::memcpy(m_ymm_set.ymm[reg_index - m_reg_info.first_ymm].bytes, - m_xstate->fxsave.xmm[reg_index - m_reg_info.first_ymm].bytes, - sizeof(XMMReg)); - ::memcpy(m_ymm_set.ymm[reg_index - m_reg_info.first_ymm].bytes + - sizeof(XMMReg), - m_xstate->xsave.ymmh[reg_index - m_reg_info.first_ymm].bytes, - sizeof(YMMHReg)); + uint32_t reg_no = reg_index - m_reg_info.first_ymm; + m_ymm_set.ymm[reg_no] = XStateToYMM( + m_xstate->fxsave.xmm[reg_no].bytes, + m_xstate->xsave.ymmh[reg_no].bytes); return true; } - if (byte_order == lldb::eByteOrderBig) { - ::memcpy(m_ymm_set.ymm[reg_index - m_reg_info.first_ymm].bytes + - sizeof(XMMReg), - m_xstate->fxsave.xmm[reg_index - m_reg_info.first_ymm].bytes, - sizeof(XMMReg)); - ::memcpy(m_ymm_set.ymm[reg_index - m_reg_info.first_ymm].bytes, - m_xstate->xsave.ymmh[reg_index - m_reg_info.first_ymm].bytes, - sizeof(YMMHReg)); - return true; - } return false; // unsupported or invalid byte order } @@ -932,22 +919,13 @@ bool NativeRegisterContextLinux_x86_64::CopyYMMtoXSTATE( return false; if (byte_order == lldb::eByteOrderLittle) { - ::memcpy(m_xstate->fxsave.xmm[reg - m_reg_info.first_ymm].bytes, - m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes, sizeof(XMMReg)); - ::memcpy(m_xstate->xsave.ymmh[reg - m_reg_info.first_ymm].bytes, - m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes + sizeof(XMMReg), - sizeof(YMMHReg)); + uint32_t reg_no = reg - m_reg_info.first_ymm; + YMMToXState(m_ymm_set.ymm[reg_no], + m_xstate->fxsave.xmm[reg_no].bytes, + m_xstate->xsave.ymmh[reg_no].bytes); return true; } - if (byte_order == lldb::eByteOrderBig) { - ::memcpy(m_xstate->fxsave.xmm[reg - m_reg_info.first_ymm].bytes, - m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes + sizeof(XMMReg), - sizeof(XMMReg)); - ::memcpy(m_xstate->xsave.ymmh[reg - m_reg_info.first_ymm].bytes, - m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes, sizeof(YMMHReg)); - return true; - } return false; // unsupported or invalid byte order } |

