Skip to content

Commit

Permalink
Fix building for ARM with dwarf exception handling
Browse files Browse the repository at this point in the history
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

llvm-svn: 317192
  • Loading branch information
mstorsjo committed Nov 2, 2017
1 parent 965602a commit 6a3ed9b
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 8 deletions.
4 changes: 2 additions & 2 deletions libunwind/include/__libunwind_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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__
2 changes: 1 addition & 1 deletion libunwind/include/libunwind.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
9 changes: 5 additions & 4 deletions libunwind/src/Registers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1386,7 +1386,7 @@ class _LIBUNWIND_HIDDEN Registers_arm {
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);
Expand All @@ -1399,6 +1399,7 @@ class _LIBUNWIND_HIDDEN Registers_arm {
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; }
Expand Down Expand Up @@ -1472,11 +1473,11 @@ class _LIBUNWIND_HIDDEN Registers_arm {
// 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
};

Expand Down Expand Up @@ -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;

Expand Down
6 changes: 6 additions & 0 deletions libunwind/src/UnwindCursor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,12 @@ class UnwindCursor : public AbstractUnwindCursor{
}
#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;
Expand Down
2 changes: 1 addition & 1 deletion libunwind/src/libunwind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 6a3ed9b

Please sign in to comment.