Mercurial > hg > CbC > CbC_llvm
diff libunwind/src/DwarfInstructions.hpp @ 207:2e18cbf3894f
LLVM12
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 08 Jun 2021 06:07:14 +0900 |
parents | 1d019706d866 |
children | c4bab56944e8 |
line wrap: on
line diff
--- a/libunwind/src/DwarfInstructions.hpp Mon May 25 11:55:54 2020 +0900 +++ b/libunwind/src/DwarfInstructions.hpp Tue Jun 08 06:07:14 2021 +0900 @@ -93,7 +93,8 @@ case CFI_Parser<A>::kRegisterInRegister: return registers.getRegister((int)savedReg.value); - + case CFI_Parser<A>::kRegisterUndefined: + return 0; case CFI_Parser<A>::kRegisterUnused: case CFI_Parser<A>::kRegisterOffsetFromCFA: // FIX ME @@ -117,6 +118,7 @@ case CFI_Parser<A>::kRegisterIsExpression: case CFI_Parser<A>::kRegisterUnused: + case CFI_Parser<A>::kRegisterUndefined: case CFI_Parser<A>::kRegisterOffsetFromCFA: case CFI_Parser<A>::kRegisterInRegister: // FIX ME @@ -140,6 +142,7 @@ case CFI_Parser<A>::kRegisterIsExpression: case CFI_Parser<A>::kRegisterUnused: + case CFI_Parser<A>::kRegisterUndefined: case CFI_Parser<A>::kRegisterOffsetFromCFA: case CFI_Parser<A>::kRegisterInRegister: // FIX ME @@ -190,6 +193,10 @@ prolog.savedRegisters[i])); else return UNW_EBADREG; + } else if (i == (int)cieInfo.returnAddressRegister) { + // Leaf function keeps the return address in register and there is no + // explicit intructions how to restore it. + returnAddress = registers.getRegister(cieInfo.returnAddressRegister); } } @@ -206,7 +213,8 @@ // restored. autia1716 is used instead of autia as autia1716 assembles // to a NOP on pre-v8.3a architectures. if ((R::getArch() == REGISTERS_ARM64) && - prolog.savedRegisters[UNW_ARM64_RA_SIGN_STATE].value) { + prolog.savedRegisters[UNW_ARM64_RA_SIGN_STATE].value && + returnAddress != 0) { #if !defined(_LIBUNWIND_IS_NATIVE_ONLY) return UNW_ECROSSRASIGNING; #else