summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2017-10-27 07:59:01 +0000
committerMartin Storsjo <martin@martin.st>2017-10-27 07:59:01 +0000
commitaf4b7dd015efae2d12d7387c39eab470d981113a (patch)
treed9af8fcf3ab530c369afe5697ffb5ff2a8e102d5
parent1f034adc84a9957ca3ed7a816ff23ad4584ad645 (diff)
Express Registers_*::lastDwarfReg using _LIBUNWIND_HIGHEST_DWARF_REGISTER
This avoids having to keep the same information duplicated in multiple places. Adjust _LIBUNWIND_HIGHEST_DWARF_REGISTER to actually have the value of the highest used register and only use the value _LIBUNWIND_HIGHEST_DWARF_REGISTER + 1 (kMaxRegisterNumber + 1) for allocating the savedRegisters array. Differential Revision: https://reviews.llvm.org/D39281 git-svn-id: https://llvm.org/svn/llvm-project/libunwind/trunk@316745 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/__libunwind_config.h14
-rw-r--r--src/DwarfInstructions.hpp2
-rw-r--r--src/DwarfParser.hpp2
-rw-r--r--src/Registers.hpp10
4 files changed, 14 insertions, 14 deletions
diff --git a/include/__libunwind_config.h b/include/__libunwind_config.h
index 0be7bf1..8043a22 100644
--- a/include/__libunwind_config.h
+++ b/include/__libunwind_config.h
@@ -20,22 +20,22 @@
# define _LIBUNWIND_TARGET_I386
# define _LIBUNWIND_CONTEXT_SIZE 8
# define _LIBUNWIND_CURSOR_SIZE 19
-# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 9
+# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 8
# elif defined(__x86_64__)
# define _LIBUNWIND_TARGET_X86_64 1
# define _LIBUNWIND_CONTEXT_SIZE 21
# define _LIBUNWIND_CURSOR_SIZE 33
-# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 17
+# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 16
# elif defined(__ppc__)
# define _LIBUNWIND_TARGET_PPC 1
# define _LIBUNWIND_CONTEXT_SIZE 117
# define _LIBUNWIND_CURSOR_SIZE 128
-# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 113
+# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 112
# elif defined(__aarch64__)
# define _LIBUNWIND_TARGET_AARCH64 1
# define _LIBUNWIND_CONTEXT_SIZE 66
# define _LIBUNWIND_CURSOR_SIZE 78
-# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 96
+# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 95
# elif defined(__arm__)
# define _LIBUNWIND_TARGET_ARM 1
# if defined(__ARM_WMMX)
@@ -45,12 +45,12 @@
# define _LIBUNWIND_CONTEXT_SIZE 42
# define _LIBUNWIND_CURSOR_SIZE 49
# endif
-# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 96
+# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 95
# elif defined(__or1k__)
# define _LIBUNWIND_TARGET_OR1K 1
# define _LIBUNWIND_CONTEXT_SIZE 16
# define _LIBUNWIND_CURSOR_SIZE 28
-# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 32
+# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 31
# else
# error "Unsupported architecture."
# endif
@@ -63,7 +63,7 @@
# define _LIBUNWIND_TARGET_OR1K 1
# define _LIBUNWIND_CONTEXT_SIZE 128
# define _LIBUNWIND_CURSOR_SIZE 140
-# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 120
+# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 119
#endif // _LIBUNWIND_IS_NATIVE_ONLY
#endif // ____LIBUNWIND_CONFIG_H__
diff --git a/src/DwarfInstructions.hpp b/src/DwarfInstructions.hpp
index a428633..bd1448b 100644
--- a/src/DwarfInstructions.hpp
+++ b/src/DwarfInstructions.hpp
@@ -167,7 +167,7 @@ int DwarfInstructions<A, R>::stepWithDwarf(A &addressSpace, pint_t pc,
R newRegisters = registers;
pint_t returnAddress = 0;
const int lastReg = R::lastDwarfRegNum();
- assert((int)CFI_Parser<A>::kMaxRegisterNumber > lastReg &&
+ assert(static_cast<int>(CFI_Parser<A>::kMaxRegisterNumber) >= lastReg &&
"register range too large");
assert(lastReg >= (int)cieInfo.returnAddressRegister &&
"register range does not contain return address register");
diff --git a/src/DwarfParser.hpp b/src/DwarfParser.hpp
index d45ad49..95af7a6 100644
--- a/src/DwarfParser.hpp
+++ b/src/DwarfParser.hpp
@@ -87,7 +87,7 @@ public:
uint32_t codeOffsetAtStackDecrement;
bool registersInOtherRegisters;
bool sameValueUsed;
- RegisterLocation savedRegisters[kMaxRegisterNumber];
+ RegisterLocation savedRegisters[kMaxRegisterNumber + 1];
};
struct PrologInfoStackEntry {
diff --git a/src/Registers.hpp b/src/Registers.hpp
index ff57c60..760818f 100644
--- a/src/Registers.hpp
+++ b/src/Registers.hpp
@@ -44,7 +44,7 @@ public:
void setVectorRegister(int num, v128 value);
const char *getRegisterName(int num);
void jumpto();
- static int lastDwarfRegNum() { return 8; }
+ static int lastDwarfRegNum() { return _LIBUNWIND_HIGHEST_DWARF_REGISTER; }
uint32_t getSP() const { return _registers.__esp; }
void setSP(uint32_t value) { _registers.__esp = value; }
@@ -250,7 +250,7 @@ public:
void setVectorRegister(int num, v128 value);
const char *getRegisterName(int num);
void jumpto();
- static int lastDwarfRegNum() { return 16; }
+ static int lastDwarfRegNum() { return _LIBUNWIND_HIGHEST_DWARF_REGISTER; }
uint64_t getSP() const { return _registers.__rsp; }
void setSP(uint64_t value) { _registers.__rsp = value; }
@@ -500,7 +500,7 @@ public:
void setVectorRegister(int num, v128 value);
const char *getRegisterName(int num);
void jumpto();
- static int lastDwarfRegNum() { return 112; }
+ static int lastDwarfRegNum() { return _LIBUNWIND_HIGHEST_DWARF_REGISTER; }
uint64_t getSP() const { return _registers.__r1; }
void setSP(uint32_t value) { _registers.__r1 = value; }
@@ -1066,7 +1066,7 @@ public:
void setVectorRegister(int num, v128 value);
const char *getRegisterName(int num);
void jumpto();
- static int lastDwarfRegNum() { return 95; }
+ static int lastDwarfRegNum() { return _LIBUNWIND_HIGHEST_DWARF_REGISTER; }
uint64_t getSP() const { return _registers.__sp; }
void setSP(uint64_t value) { _registers.__sp = value; }
@@ -1815,7 +1815,7 @@ public:
void setVectorRegister(int num, v128 value);
const char *getRegisterName(int num);
void jumpto();
- static int lastDwarfRegNum() { return 31; }
+ static int lastDwarfRegNum() { return _LIBUNWIND_HIGHEST_DWARF_REGISTER; }
uint64_t getSP() const { return _registers.__r[1]; }
void setSP(uint32_t value) { _registers.__r[1] = value; }