summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2017-11-02 08:16:16 +0000
committerMartin Storsjo <martin@martin.st>2017-11-02 08:16:16 +0000
commit23a943b524c63c5bd970e82c8fd678d03b501f96 (patch)
tree69bffa2f5d0f2c576e3c6f0268ebad08fb9cc508
parentfc0a910c25d5415dd72ba9451b7cba380e3cc1e7 (diff)
Fix building for ARM with dwarf exception handling
The previous definition of _LIBUNWIND_HIGHEST_DWARF_REGISTER seems to be a copy of the ARM64 value (introduced in SVN r276128); since the code actually hasn't compiled properly for arm in dwarf mode before, this hasn't actually been used. Set it to the correct value based on the UNW_ARM_* enum values. The iwmmx control variables have to be made mutable, since they are touched from within getRegister (which previously wasn't const), and getRegister is used on a const Registers object in DwarfInstructions.hpp. Differential Revision: https://reviews.llvm.org/D39251 git-svn-id: https://llvm.org/svn/llvm-project/libunwind/trunk@317192 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/__libunwind_config.h4
-rw-r--r--include/libunwind.h2
-rw-r--r--src/Registers.hpp9
-rw-r--r--src/UnwindCursor.hpp6
-rw-r--r--src/libunwind.cpp2
5 files changed, 15 insertions, 8 deletions
diff --git a/include/__libunwind_config.h b/include/__libunwind_config.h
index 6d69085..5e3cf27 100644
--- a/include/__libunwind_config.h
+++ b/include/__libunwind_config.h
@@ -19,7 +19,7 @@
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_X86_64 32
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_PPC 112
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_ARM64 95
-#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_ARM 95
+#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_ARM 287
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_OR1K 31
#if defined(_LIBUNWIND_IS_NATIVE_ONLY)
@@ -75,7 +75,7 @@
# define _LIBUNWIND_TARGET_OR1K 1
# define _LIBUNWIND_CONTEXT_SIZE 128
# define _LIBUNWIND_CURSOR_SIZE 140
-# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 119
+# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 287
#endif // _LIBUNWIND_IS_NATIVE_ONLY
#endif // ____LIBUNWIND_CONFIG_H__
diff --git a/include/libunwind.h b/include/libunwind.h
index 0484044..ece3097 100644
--- a/include/libunwind.h
+++ b/include/libunwind.h
@@ -73,7 +73,7 @@ typedef struct unw_addr_space *unw_addr_space_t;
typedef int unw_regnum_t;
typedef uintptr_t unw_word_t;
-#if defined(_LIBUNWIND_ARM_EHABI)
+#if defined(__arm__)
typedef uint64_t unw_fpreg_t;
#else
typedef double unw_fpreg_t;
diff --git a/src/Registers.hpp b/src/Registers.hpp
index 0c4fecb..bc25675 100644
--- a/src/Registers.hpp
+++ b/src/Registers.hpp
@@ -1386,7 +1386,7 @@ public:
Registers_arm(const void *registers);
bool validRegister(int num) const;
- uint32_t getRegister(int num);
+ uint32_t getRegister(int num) const;
void setRegister(int num, uint32_t value);
bool validFloatRegister(int num) const;
unw_fpreg_t getFloatRegister(int num);
@@ -1399,6 +1399,7 @@ public:
restoreSavedFloatRegisters();
restoreCoreAndJumpTo();
}
+ static int lastDwarfRegNum() { return _LIBUNWIND_HIGHEST_DWARF_REGISTER_ARM; }
uint32_t getSP() const { return _registers.__sp; }
void setSP(uint32_t value) { _registers.__sp = value; }
@@ -1472,11 +1473,11 @@ private:
// Whether iWMMX data registers are saved.
bool _saved_iwmmx;
// Whether iWMMX control registers are saved.
- bool _saved_iwmmx_control;
+ mutable bool _saved_iwmmx_control;
// iWMMX registers
unw_fpreg_t _iwmmx[16];
// iWMMX control registers
- uint32_t _iwmmx_control[4];
+ mutable uint32_t _iwmmx_control[4];
#endif
};
@@ -1533,7 +1534,7 @@ inline bool Registers_arm::validRegister(int regNum) const {
return false;
}
-inline uint32_t Registers_arm::getRegister(int regNum) {
+inline uint32_t Registers_arm::getRegister(int regNum) const {
if (regNum == UNW_REG_SP || regNum == UNW_ARM_SP)
return _registers.__sp;
diff --git a/src/UnwindCursor.hpp b/src/UnwindCursor.hpp
index ab2f542..b2793da 100644
--- a/src/UnwindCursor.hpp
+++ b/src/UnwindCursor.hpp
@@ -583,6 +583,12 @@ private:
}
#endif
+#if defined(_LIBUNWIND_TARGET_ARM)
+ compact_unwind_encoding_t dwarfEncoding(Registers_arm &) const {
+ return 0;
+ }
+#endif
+
#if defined (_LIBUNWIND_TARGET_OR1K)
compact_unwind_encoding_t dwarfEncoding(Registers_or1k &) const {
return 0;
diff --git a/src/libunwind.cpp b/src/libunwind.cpp
index c430817..1039a3b 100644
--- a/src/libunwind.cpp
+++ b/src/libunwind.cpp
@@ -55,7 +55,7 @@ _LIBUNWIND_EXPORT int unw_init_local(unw_cursor_t *cursor,
# define REGISTER_KIND Registers_ppc
#elif defined(__aarch64__)
# define REGISTER_KIND Registers_arm64
-#elif defined(_LIBUNWIND_ARM_EHABI)
+#elif defined(__arm__)
# define REGISTER_KIND Registers_arm
#elif defined(__or1k__)
# define REGISTER_KIND Registers_or1k