[libunwind] r366587 - [libunwind][ARM] Fix loading FP registers on big-endian targets
Mikhail Maltsev via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 19 08:20:32 PDT 2019
Author: miyuki
Date: Fri Jul 19 08:20:32 2019
New Revision: 366587
URL: http://llvm.org/viewvc/llvm-project?rev=366587&view=rev
Log:
[libunwind][ARM] Fix loading FP registers on big-endian targets
Summary:
The function Unwind-EHABI.cpp:_Unwind_VRS_Pop loads the saved values of
64-bit FP registers as two 32-bit words because they might not be
8-byte aligned. Combining these words into a 64-bit value has to be
done differently on big-endian platforms.
Reviewers: ostannard, john.brawn, dmgreen
Reviewed By: ostannard
Subscribers: kristof.beyls, christof, libcxx-commits
Tags: #libc
Differential Revision: https://reviews.llvm.org/D64996
Modified:
libunwind/trunk/src/Unwind-EHABI.cpp
Modified: libunwind/trunk/src/Unwind-EHABI.cpp
URL: http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/Unwind-EHABI.cpp?rev=366587&r1=366586&r2=366587&view=diff
==============================================================================
--- libunwind/trunk/src/Unwind-EHABI.cpp (original)
+++ libunwind/trunk/src/Unwind-EHABI.cpp Fri Jul 19 08:20:32 2019
@@ -941,8 +941,13 @@ _Unwind_VRS_Pop(_Unwind_Context *context
// format 1", which is equivalent to FSTMD + a padding word.
for (uint32_t i = first; i < end; ++i) {
// SP is only 32-bit aligned so don't copy 64-bit at a time.
- uint64_t value = *sp++;
- value |= ((uint64_t)(*sp++)) << 32;
+ uint32_t w0 = *sp++;
+ uint32_t w1 = *sp++;
+#ifdef __LITTLE_ENDIAN__
+ uint64_t value = (w1 << 32) | w0;
+#else
+ uint64_t value = (w0 << 32) | w1;
+#endif
if (_Unwind_VRS_Set(context, regclass, i, representation, &value) !=
_UVRSR_OK)
return _UVRSR_FAILED;
More information about the cfe-commits
mailing list