[libunwind] r293298 - Merging r292723:
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 27 08:27:43 PST 2017
Author: hans
Date: Fri Jan 27 10:27:43 2017
New Revision: 293298
URL: http://llvm.org/viewvc/llvm-project?rev=293298&view=rev
Log:
Merging r292723:
------------------------------------------------------------------------
r292723 | compnerd | 2017-01-21 08:22:59 -0800 (Sat, 21 Jan 2017) | 17 lines
X86: swap EBP, ESP on !APPLE
Restore the `libunwind.h` enumeration values back to the inverted
values. This diverges from the DWARF definition of the register values.
However, this allows our header to be compatible with other unwind
implementations (e.g. HP, GNU Savannah, GCC).
The register IDs are only swapped in the header and need to be unswapped
when accessing the unwind register file. The flipped EBP and ESP only
applies on non-Apple x86 targets.
When optimizations were enabled, EBP and ESP would no longer be
equivalent. As a result, the incorrect access on Linux would manifest
as a failure to unwind the stack. We can now unwind the stack with and
without FPO on Linux x86.
Resolves PR30879!
------------------------------------------------------------------------
Modified:
libunwind/branches/release_40/ (props changed)
libunwind/branches/release_40/include/libunwind.h
libunwind/branches/release_40/src/Registers.hpp
Propchange: libunwind/branches/release_40/
------------------------------------------------------------------------------
svn:mergeinfo = /libunwind/trunk:292723
Modified: libunwind/branches/release_40/include/libunwind.h
URL: http://llvm.org/viewvc/llvm-project/libunwind/branches/release_40/include/libunwind.h?rev=293298&r1=293297&r2=293298&view=diff
==============================================================================
--- libunwind/branches/release_40/include/libunwind.h (original)
+++ libunwind/branches/release_40/include/libunwind.h Fri Jan 27 10:27:43 2017
@@ -165,13 +165,8 @@ enum {
UNW_X86_ECX = 1,
UNW_X86_EDX = 2,
UNW_X86_EBX = 3,
-#if defined(__CloudABI__) || defined(__FreeBSD__)
- UNW_X86_ESP = 4,
- UNW_X86_EBP = 5,
-#else
UNW_X86_EBP = 4,
UNW_X86_ESP = 5,
-#endif
UNW_X86_ESI = 6,
UNW_X86_EDI = 7
};
Modified: libunwind/branches/release_40/src/Registers.hpp
URL: http://llvm.org/viewvc/llvm-project/libunwind/branches/release_40/src/Registers.hpp?rev=293298&r1=293297&r2=293298&view=diff
==============================================================================
--- libunwind/branches/release_40/src/Registers.hpp (original)
+++ libunwind/branches/release_40/src/Registers.hpp Fri Jan 27 10:27:43 2017
@@ -122,9 +122,17 @@ inline uint32_t Registers_x86::getRegist
return _registers.__edx;
case UNW_X86_EBX:
return _registers.__ebx;
+#if !defined(__APPLE__)
+ case UNW_X86_ESP:
+#else
case UNW_X86_EBP:
+#endif
return _registers.__ebp;
+#if !defined(__APPLE__)
+ case UNW_X86_EBP:
+#else
case UNW_X86_ESP:
+#endif
return _registers.__esp;
case UNW_X86_ESI:
return _registers.__esi;
@@ -154,10 +162,18 @@ inline void Registers_x86::setRegister(i
case UNW_X86_EBX:
_registers.__ebx = value;
return;
+#if !defined(__APPLE__)
+ case UNW_X86_ESP:
+#else
case UNW_X86_EBP:
+#endif
_registers.__ebp = value;
return;
+#if !defined(__APPLE__)
+ case UNW_X86_EBP:
+#else
case UNW_X86_ESP:
+#endif
_registers.__esp = value;
return;
case UNW_X86_ESI:
More information about the cfe-commits
mailing list