On 10/27/17 8:59 AM, Martin Storsjo via cfe-commits wrote: > Author: mstorsjo > Date: Fri Oct 27 00:59:01 2017 > New Revision: 316745 > > URL: http://llvm.org/viewvc/llvm-project?rev=316745&view=rev > Log: > 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.
Sorry I didn't realize it during the review, but I've just realized why using HIGHEST_DWARF_REGISTER is not correct in the various Register classes. If you are building without _LIBUNWIND_IS_NATIVE_ONLY defined, then you will end up with all of the Register classes returning the same value (119 from the end of __libunwind_config.h) instead of the architecture-specific value. This is a change in behavior, so the Registers.hpp portion of this change should perhaps be reverted. > Differential Revision: https://reviews.llvm.org/D39281 > > Modified: > libunwind/trunk/include/__libunwind_config.h > libunwind/trunk/src/DwarfInstructions.hpp > libunwind/trunk/src/DwarfParser.hpp > libunwind/trunk/src/Registers.hpp > > Modified: libunwind/trunk/include/__libunwind_config.h > URL: > http://llvm.org/viewvc/llvm-project/libunwind/trunk/include/__libunwind_config.h?rev=316745&r1=316744&r2=316745&view=diff > ============================================================================== > --- libunwind/trunk/include/__libunwind_config.h (original) > +++ libunwind/trunk/include/__libunwind_config.h Fri Oct 27 00:59:01 2017 > @@ -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__ > > Modified: libunwind/trunk/src/DwarfInstructions.hpp > URL: > http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/DwarfInstructions.hpp?rev=316745&r1=316744&r2=316745&view=diff > ============================================================================== > --- libunwind/trunk/src/DwarfInstructions.hpp (original) > +++ libunwind/trunk/src/DwarfInstructions.hpp Fri Oct 27 00:59:01 2017 > @@ -167,7 +167,7 @@ int DwarfInstructions<A, R>::stepWithDwa > 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"); > > Modified: libunwind/trunk/src/DwarfParser.hpp > URL: > http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/DwarfParser.hpp?rev=316745&r1=316744&r2=316745&view=diff > ============================================================================== > --- libunwind/trunk/src/DwarfParser.hpp (original) > +++ libunwind/trunk/src/DwarfParser.hpp Fri Oct 27 00:59:01 2017 > @@ -87,7 +87,7 @@ public: > uint32_t codeOffsetAtStackDecrement; > bool registersInOtherRegisters; > bool sameValueUsed; > - RegisterLocation savedRegisters[kMaxRegisterNumber]; > + RegisterLocation savedRegisters[kMaxRegisterNumber + 1]; > }; > > struct PrologInfoStackEntry { > > Modified: libunwind/trunk/src/Registers.hpp > URL: > http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/Registers.hpp?rev=316745&r1=316744&r2=316745&view=diff > ============================================================================== > --- libunwind/trunk/src/Registers.hpp (original) > +++ libunwind/trunk/src/Registers.hpp Fri Oct 27 00:59:01 2017 > @@ -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; } > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > -- John Baldwin _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits