[all-commits] [llvm/llvm-project] e897cb: [lldb] Provide lr value in faulting frame on arm64...
Jason Molenda via All-commits
all-commits at lists.llvm.org
Fri May 9 20:07:33 PDT 2025
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: e897cb139ee6ef5c145fed5394c4d96baa658e6b
https://github.com/llvm/llvm-project/commit/e897cb139ee6ef5c145fed5394c4d96baa658e6b
Author: Jason Molenda <jmolenda at apple.com>
Date: 2025-05-09 (Fri, 09 May 2025)
Changed paths:
M lldb/source/Target/RegisterContextUnwind.cpp
A lldb/test/API/functionalities/unwind/frameless-faulted/Makefile
A lldb/test/API/functionalities/unwind/frameless-faulted/TestUnwindFramelessFaulted.py
A lldb/test/API/functionalities/unwind/frameless-faulted/interrupt-and-trap-funcs.c
A lldb/test/API/functionalities/unwind/frameless-faulted/main.c
Log Message:
-----------
[lldb] Provide lr value in faulting frame on arm64 (#138805)
When a frameless function faults or is interrupted asynchronously, the
UnwindPlan MAY have no register location rule for the return address
register (lr on arm64); the value is simply live in the lr register when
it was interrupted, and the frame below this on the stack -- e.g.
sigtramp on a Unix system -- has the full register context, including
that register.
RegisterContextUnwind::SavedLocationForRegister, when asked to find the
caller's pc value, will first see if there is a pc register location. If
there isn't, on a Return Address Register architecture like
arm/mips/riscv, we rewrite the register request from "pc" to "RA
register", and search for a location.
On frame 0 (the live frame) and an interrupted frame, the UnwindPlan may
have no register location rule for the RA Reg, that is valid. A
frameless function that never calls another may simply keep the return
address in the live register the whole way. Our instruction emulation
unwind plans explicitly add a rule (see Pavel's May 2024 change
https://github.com/llvm/llvm-project/pull/91321 ), but an UnwindPlan
sourced from debug_frame may not.
I've got a case where this exactly happens - clang debug_frame for arm64
where there is no register location for the lr in a frameless function.
There is a fault in the middle of this frameless function and we only
get the lr value from the fault handler below this frame if lr has a
register location of `IsSame`, in line with Pavel's 2024 change.
Similar to how we see a request of the RA Reg from frame 0 after failing
to find an unwind location for the pc register, the same style of
special casing is needed when this is a function that was interrupted.
Without this change, we can find the pc of the frame that was executing
when it was interrupted, but we need $lr to find its caller, and we
don't descend down to the trap handler to get that value, truncating the
stack.
rdar://145614545
To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications
More information about the All-commits
mailing list