I think that this is safe enough and does make libunwind work on x86 Linux, so lets go for it.
On Thu, Jan 26, 2017 at 10:10 AM, Hans Wennborg <h...@chromium.org> wrote: > MichaĆ suggested on the PR that this should be merged to the release > branch. > > Saleem, what do you think? > > On Sat, Jan 21, 2017 at 8:22 AM, Saleem Abdulrasool via cfe-commits > <cfe-commits@lists.llvm.org> wrote: > > 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 > -- Saleem Abdulrasool compnerd (at) compnerd (dot) org
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits