aboutsummaryrefslogtreecommitdiff
path: root/libunwind/src/DwarfParser.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'libunwind/src/DwarfParser.hpp')
-rw-r--r--libunwind/src/DwarfParser.hpp10
1 files changed, 4 insertions, 6 deletions
diff --git a/libunwind/src/DwarfParser.hpp b/libunwind/src/DwarfParser.hpp
index dbd7d65..2b04ae2 100644
--- a/libunwind/src/DwarfParser.hpp
+++ b/libunwind/src/DwarfParser.hpp
@@ -842,12 +842,10 @@ bool CFI_Parser<A>::parseFDEInstructions(A &addressSpace,
results->savedRegisters[UNW_AARCH64_RA_SIGN_STATE].value ^ 0x3;
results->setRegisterValue(UNW_AARCH64_RA_SIGN_STATE, value,
initialState);
- // When calculating the value of the PC, it is assumed that the CFI
- // instruction is placed before the signing instruction, however it is
- // placed after. Because of this, we need to take into account the CFI
- // instruction is one instruction call later than expected, and reduce
- // the PC value by 4 bytes to compensate.
- results->ptrAuthDiversifier = fdeInfo.pcStart + codeOffset - 0x4;
+ // When using Feat_PAuthLR, the PC value needs to be captured so that
+ // during unwinding, the correct PC value is used for re-authentication.
+ // It is assumed that the CFI is placed before the signing instruction.
+ results->ptrAuthDiversifier = fdeInfo.pcStart + codeOffset;
_LIBUNWIND_TRACE_DWARF(
"DW_CFA_AARCH64_negate_ra_state_with_pc(pc=0x%" PRIx64 ")\n",
static_cast<uint64_t>(results->ptrAuthDiversifier));