[libunwind] r316745 - Express Registers_*::lastDwarfReg using _LIBUNWIND_HIGHEST_DWARF_REGISTER
John Baldwin via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 27 09:05:14 PDT 2017
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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
--
John Baldwin
More information about the cfe-commits
mailing list