[libunwind][MIPS]: Add support for unwinding in N32 processes.
authorJohn Baldwin <jhb@FreeBSD.org>
Tue, 27 Feb 2018 21:24:02 +0000 (21:24 +0000)
committerJohn Baldwin <jhb@FreeBSD.org>
Tue, 27 Feb 2018 21:24:02 +0000 (21:24 +0000)
commit0594aee52fad70d2a0b44b321579b857b8cf9244
tree6f14b96634dacd317fc854d49c16e19c8ce7a905
parent5337efc69cdd59950faf0579043eb7aa8b9a3f2e
[libunwind][MIPS]: Add support for unwinding in N32 processes.

Summary:
N32 uses the same register context as N64.  However, N32 requires one
change to properly fetch addresses from registers stored in memory.
Since N32 is an ILP32 platform, getP() only fetches the first 32-bits
of a stored register.  For a big-endian platform this fetches the
upper 32-bits which will be zero.  To fix this, add a new
getRegister() method to AddressSpace which is responsible for
extracting the address stored in a register in memory.  This matches
getP() for all current ABIs except for N32 where it reads the 64-bit
register and returns the low 32-bits as an address.  The
DwarfInstructions::getSavedRegister() method uses
AddressSpace::getRegister() instead of AddressSpace::getP().

Reviewers: sdardis, compnerd

Reviewed By: sdardis

Differential Revision: https://reviews.llvm.org/D39074

llvm-svn: 326250
libunwind/include/__libunwind_config.h
libunwind/src/AddressSpace.hpp
libunwind/src/DwarfInstructions.hpp
libunwind/src/UnwindRegistersRestore.S
libunwind/src/UnwindRegistersSave.S
libunwind/src/libunwind.cpp