forked from OSchip/llvm-project
The semantics of DW_CFA_GNU_args_size have changed subtile over the
years. Adopt the new convention that it is call-site specific and that it should be applied before moving the IP by personality routines, but not during normal unwinding. Differential Revision: https://reviews.llvm.org/D38680 llvm-svn: 337312
This commit is contained in:
parent
97ba3b64dd
commit
d0166a0a93
|
@ -1411,8 +1411,6 @@ int UnwindCursor<A, R>::step() {
|
|||
this->setInfoBasedOnIPRegister(true);
|
||||
if (_unwindInfoMissing)
|
||||
return UNW_STEP_END;
|
||||
if (_info.gp)
|
||||
setReg(UNW_REG_SP, getReg(UNW_REG_SP) + _info.gp);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
|
@ -188,8 +188,20 @@ _LIBUNWIND_EXPORT int unw_set_reg(unw_cursor_t *cursor, unw_regnum_t regNum,
|
|||
co->setReg(regNum, (pint_t)value);
|
||||
// specical case altering IP to re-find info (being called by personality
|
||||
// function)
|
||||
if (regNum == UNW_REG_IP)
|
||||
if (regNum == UNW_REG_IP) {
|
||||
unw_proc_info_t info;
|
||||
// First, get the FDE for the old location and then update it.
|
||||
co->getInfo(&info);
|
||||
co->setInfoBasedOnIPRegister(false);
|
||||
// If the original call expects stack adjustment, perform this now.
|
||||
// Normal frame unwinding would have included the offset already in the
|
||||
// CFA computation.
|
||||
// Note: for PA-RISC and other platforms where the stack grows up,
|
||||
// this should actually be - info.gp. LLVM doesn't currently support
|
||||
// any such platforms and Clang doesn't export a macro for them.
|
||||
if (info.gp)
|
||||
co->setReg(UNW_REG_SP, co->getReg(UNW_REG_SP) + info.gp);
|
||||
}
|
||||
return UNW_ESUCCESS;
|
||||
}
|
||||
return UNW_EBADREG;
|
||||
|
|
Loading…
Reference in New Issue