[libcxx-commits] [PATCH] D137599: [libunwind][PowerPC] Fix saving/restoring VSX registers on LE systems

Nemanja Ivanovic via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon Nov 7 16:16:52 PST 2022


nemanjai created this revision.
nemanjai added reviewers: libunwind, xingxue, PowerPC.
nemanjai added a project: libunwind.
Herald added subscribers: libcxx-commits, shchenz, krytarowski.
Herald added 1 blocking reviewer(s): libunwind.
Herald added a project: All.
nemanjai requested review of this revision.
Herald added a project: LLVM.

Currently, libunwind just uses `stxvd2x/lxvd2x` to save/restore VSX registers respectively. This puts the registers in doubleword-reversed order into memory on little endian systems. If both the save and restore are done the same way, this isn't a problem. However if the unwinder is just restoring a callee-saved register, it will restore it in the wrong order (since function prologues save them in the correct order).

This patch fixes the order by:

- Adding a check for ISA 3.0 if the GLIBC used at build time supports such a check
- On machines that support ISA 3.0, it uses non-swapping DQ-Form instructions (`stxv/lxv`)
- On machines that don't support ISA 3.0 (or on builds with GLIBC that is too old) swaps are added after the loads and before the stores


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D137599

Files:
  libunwind/src/UnwindRegistersRestore.S
  libunwind/src/UnwindRegistersSave.S
  libunwind/src/assembly.h

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D137599.473822.patch
Type: text/x-patch
Size: 11180 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20221108/a52e2f92/attachment.bin>


More information about the libcxx-commits mailing list