Author: compnerd Date: Sat Jan 21 10:22:59 2017 New Revision: 292723 URL: http://llvm.org/viewvc/llvm-project?rev=292723&view=rev Log: 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/trunk/include/libunwind.h libunwind/trunk/src/Registers.hpp Modified: libunwind/trunk/include/libunwind.h URL: http://llvm.org/viewvc/llvm-project/libunwind/trunk/include/libunwind.h?rev=292723&r1=292722&r2=292723&view=diff ============================================================================== --- libunwind/trunk/include/libunwind.h (original) +++ libunwind/trunk/include/libunwind.h Sat Jan 21 10:22:59 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/trunk/src/Registers.hpp URL: http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/Registers.hpp?rev=292723&r1=292722&r2=292723&view=diff ============================================================================== --- libunwind/trunk/src/Registers.hpp (original) +++ libunwind/trunk/src/Registers.hpp Sat Jan 21 10:22:59 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: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits