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, };