From 23a943b524c63c5bd970e82c8fd678d03b501f96 Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Thu, 2 Nov 2017 08:16:16 +0000 Subject: 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 --- include/__libunwind_config.h | 4 ++-- include/libunwind.h | 2 +- src/Registers.hpp | 9 +++++---- src/UnwindCursor.hpp | 6 ++++++ src/libunwind.cpp | 2 +- 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 -- cgit v1.2.3