summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Albert <danalbert@google.com>2015-08-26 16:31:12 -0700
committerDan Albert <danalbert@google.com>2015-08-26 23:35:45 +0000
commit7e7767c4fa112705f6145568dc6808d5bac41e61 (patch)
treec18de87e7048f854aca5fe42c4dcccc601c01930
parent09306e9178fdd1dae850cc6613917a3bb7132788 (diff)
parent7a61b66a65505b63781e5c538c3ea1253e1a717d (diff)
downloadlibunwind_llvm-7e7767c4fa112705f6145568dc6808d5bac41e61.tar.gz
Merge to upstream r245665.
Change-Id: I9dfd89231b605362874fa3f390b05dcbb532583b
-rw-r--r--src/DwarfInstructions.hpp2
-rw-r--r--src/Registers.hpp2
-rw-r--r--src/config.h3
-rw-r--r--src/libunwind.cpp4
4 files changed, 7 insertions, 4 deletions
diff --git a/src/DwarfInstructions.hpp b/src/DwarfInstructions.hpp
index dfe45fb..ce90aa0 100644
--- a/src/DwarfInstructions.hpp
+++ b/src/DwarfInstructions.hpp
@@ -170,7 +170,7 @@ int DwarfInstructions<A, R>::stepWithDwarf(A &addressSpace, pint_t pc,
const int lastReg = R::lastDwarfRegNum();
assert((int)CFI_Parser<A>::kMaxRegisterNumber > lastReg &&
"register range too large");
- assert(lastReg <= (int)cieInfo.returnAddressRegister &&
+ assert(lastReg >= (int)cieInfo.returnAddressRegister &&
"register range does not contain return address register");
for (int i = 0; i <= lastReg; ++i) {
if (prolog.savedRegisters[i].location !=
diff --git a/src/Registers.hpp b/src/Registers.hpp
index 4a441b7..d01ebf0 100644
--- a/src/Registers.hpp
+++ b/src/Registers.hpp
@@ -1689,7 +1689,7 @@ inline void Registers_arm::setFloatRegister(int regNum, unw_fpreg_t value) {
_saved_vfp_d16_d31 = true;
saveVFPv3(_vfp_d16_d31);
}
- _vfp_d16_d31[regNum - UNW_ARM_D0] = value;
+ _vfp_d16_d31[regNum - UNW_ARM_D16] = value;
} else if (regNum >= UNW_ARM_WR0 && regNum <= UNW_ARM_WR15) {
if (!_saved_iwmmx) {
_saved_iwmmx = true;
diff --git a/src/config.h b/src/config.h
index c9ec087..9b24634 100644
--- a/src/config.h
+++ b/src/config.h
@@ -72,7 +72,8 @@
#define _LIBUNWIND_BUILD_ZERO_COST_APIS (defined(__i386__) || \
defined(__x86_64__) || \
- defined(__arm__))
+ defined(__arm__) || \
+ defined(__aarch64__))
#define _LIBUNWIND_BUILD_SJLJ_APIS 0
#define _LIBUNWIND_SUPPORT_FRAME_APIS (defined(__i386__) || \
defined(__x86_64__))
diff --git a/src/libunwind.cpp b/src/libunwind.cpp
index 9a16e48..c408e06 100644
--- a/src/libunwind.cpp
+++ b/src/libunwind.cpp
@@ -58,12 +58,14 @@ _LIBUNWIND_EXPORT int unw_init_local(unw_cursor_t *cursor,
#elif defined(__ppc__)
new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_ppc>(
context, LocalAddressSpace::sThisAddressSpace);
-#elif defined(__arm64__)
+#elif defined(__arm64__) || defined(__aarch64__)
new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_arm64>(
context, LocalAddressSpace::sThisAddressSpace);
#elif _LIBUNWIND_ARM_EHABI
new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_arm>(
context, LocalAddressSpace::sThisAddressSpace);
+#else
+#error Architecture not supported
#endif
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
co->setInfoBasedOnIPRegister();