[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