Module Name:    src
Committed By:   joerg
Date:           Sat Apr 26 23:17:38 UTC 2014

Modified Files:
        src/sys/lib/libunwind: DwarfInstructions.hpp DwarfParser.hpp
            Registers.hpp

Log Message:
Use the return address register from the CIE. Based on patch from Nick
Kledzik.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/lib/libunwind/DwarfInstructions.hpp
cvs rdiff -u -r1.3 -r1.4 src/sys/lib/libunwind/DwarfParser.hpp
cvs rdiff -u -r1.14 -r1.15 src/sys/lib/libunwind/Registers.hpp

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/lib/libunwind/DwarfInstructions.hpp
diff -u src/sys/lib/libunwind/DwarfInstructions.hpp:1.4 src/sys/lib/libunwind/DwarfInstructions.hpp:1.5
--- src/sys/lib/libunwind/DwarfInstructions.hpp:1.4	Mon Apr 14 18:15:17 2014
+++ src/sys/lib/libunwind/DwarfInstructions.hpp	Sat Apr 26 23:17:38 2014
@@ -48,9 +48,6 @@ private:
                           const typename CFI_Parser<A, R>::RegisterLocation &);
 
   static int lastRestoreReg(const R &) { return R::LAST_RESTORE_REG; }
-  static bool isReturnAddressRegister(int regno, const R &) {
-    return regno == R::RETURN_REG;
-  }
 
   static pint_t getCFA(A &addressSpace,
                        const typename CFI_Parser<A, R>::PrologInfo &prolog,
@@ -139,7 +136,7 @@ step_result DwarfInstructions<A, R>::ste
   for (int i = 0; i <= lastRestoreReg(newRegisters); ++i) {
     if (prolog.savedRegisters[i].location == CFI_Parser<A, R>::kRegisterUnused)
       continue;
-    if (isReturnAddressRegister(i, registers))
+    if (i == (int)cieInfo.returnAddressRegister)
       returnAddress = getSavedRegister(addressSpace, registers, cfa,
                                        prolog.savedRegisters[i]);
     else if (registers.validRegister(i))

Index: src/sys/lib/libunwind/DwarfParser.hpp
diff -u src/sys/lib/libunwind/DwarfParser.hpp:1.3 src/sys/lib/libunwind/DwarfParser.hpp:1.4
--- src/sys/lib/libunwind/DwarfParser.hpp:1.3	Tue Apr 15 11:44:26 2014
+++ src/sys/lib/libunwind/DwarfParser.hpp	Sat Apr 26 23:17:38 2014
@@ -43,6 +43,7 @@ public:
     uint8_t personalityOffsetInCIE;
     bool isSignalFrame;
     bool fdesHaveAugmentationData;
+    uint8_t returnAddressRegister;
   };
 
   /// Information about an FDE (Frame Description Entry)
@@ -238,7 +239,7 @@ bool CFI_Parser<A, R>::parseCIE(A &addre
   // Parse data alignment factor
   cieInfo->dataAlignFactor = addressSpace.getSLEB128(p, cieContentEnd);
   // Parse return address register
-  addressSpace.getULEB128(p, cieContentEnd);
+  cieInfo->returnAddressRegister = (uint8_t)addressSpace.getULEB128(p, cieContentEnd);
   // Parse augmentation data based on augmentation string.
   if (addressSpace.get8(strStart) == 'z') {
     // parse augmentation data length

Index: src/sys/lib/libunwind/Registers.hpp
diff -u src/sys/lib/libunwind/Registers.hpp:1.14 src/sys/lib/libunwind/Registers.hpp:1.15
--- src/sys/lib/libunwind/Registers.hpp:1.14	Sat Apr 26 20:15:48 2014
+++ src/sys/lib/libunwind/Registers.hpp	Sat Apr 26 23:17:38 2014
@@ -34,7 +34,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_X86_EIP,
     LAST_RESTORE_REG = REGNO_X86_EIP,
-    RETURN_REG = REGNO_X86_EIP,
     RETURN_OFFSET = 0,
   };
 
@@ -100,7 +99,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_X86_64_RIP,
     LAST_RESTORE_REG = REGNO_X86_64_RIP,
-    RETURN_REG = REGNO_X86_64_RIP,
     RETURN_OFFSET = 0,
   };
 
@@ -169,7 +167,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_PPC32_V31,
     LAST_RESTORE_REG = REGNO_PPC32_V31,
-    RETURN_REG = REGNO_PPC32_LR,
     RETURN_OFFSET = 0,
   };
 
@@ -258,7 +255,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_ARM32_D31,
     LAST_RESTORE_REG = REGNO_ARM32_SPSR,
-    RETURN_REG = REGNO_ARM32_SPSR,
     RETURN_OFFSET = 0,
   };
 
@@ -328,7 +324,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_VAX_PSW,
     LAST_RESTORE_REG = REGNO_VAX_PSW,
-    RETURN_REG = REGNO_VAX_R15,
     RETURN_OFFSET = 0,
   };
 
@@ -400,7 +395,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_M68K_FP7,
     LAST_RESTORE_REG = REGNO_M68K_FP7,
-    RETURN_REG = REGNO_M68K_PC,
     RETURN_OFFSET = 0,
   };
 
@@ -477,7 +471,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_SH3_PR,
     LAST_RESTORE_REG = REGNO_SH3_PR,
-    RETURN_REG = REGNO_SH3_PR,
     RETURN_OFFSET = 0,
   };
 
@@ -542,7 +535,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_SPARC64_PC,
     LAST_RESTORE_REG = REGNO_SPARC64_PC,
-    RETURN_REG = REGNO_SPARC64_R15,
     RETURN_OFFSET = 8,
   };
   typedef uint64_t reg_t;
@@ -606,7 +598,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_SPARC_PC,
     LAST_RESTORE_REG = REGNO_SPARC_PC,
-    RETURN_REG = REGNO_SPARC_R15,
     RETURN_OFFSET = 8,
   };
   typedef uint32_t reg_t;
@@ -672,7 +663,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_ALPHA_F30,
     LAST_RESTORE_REG = REGNO_ALPHA_F30,
-    RETURN_REG = REGNO_ALPHA_R26,
     RETURN_OFFSET = 0,
   };
   typedef uint32_t reg_t;
@@ -740,7 +730,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_HPPA_FR31H,
     LAST_RESTORE_REG = REGNO_HPPA_FR31H,
-    RETURN_REG = REGNO_HPPA_R2,
     RETURN_OFFSET = -3, // strictly speaking, this is a mask
   };
 
@@ -812,7 +801,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_MIPS_F31,
     LAST_RESTORE_REG = REGNO_MIPS_F31,
-    RETURN_REG = REGNO_MIPS_R31,
     RETURN_OFFSET = 0,
   };
 
@@ -884,7 +872,6 @@ public:
   enum {
     LAST_REGISTER = REGNO_MIPS64_F31,
     LAST_RESTORE_REG = REGNO_MIPS64_F31,
-    RETURN_REG = REGNO_MIPS64_R31,
     RETURN_OFFSET = 0,
   };
 

Reply via email to