[all-commits] [llvm/llvm-project] fd4241: [lldb] Allow fetching of RA register when above fa...
Jason Molenda via All-commits
all-commits at lists.llvm.org
Fri Jul 12 10:44:40 PDT 2024
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: fd424179dcb3417fc0675f77d2bf06c750dd1c33
https://github.com/llvm/llvm-project/commit/fd424179dcb3417fc0675f77d2bf06c750dd1c33
Author: Jason Molenda <jmolenda at apple.com>
Date: 2024-07-12 (Fri, 12 Jul 2024)
Changed paths:
M lldb/source/Target/RegisterContextUnwind.cpp
Log Message:
-----------
[lldb] Allow fetching of RA register when above fault handler (#98566)
In RegisterContextUnwind::SavedLocationForRegister we have special logic
for retrieving the Return Address register when it has the caller's
return address in it. An example would be the lr register on AArch64.
This register is never retrieved from a newer stack frame because it is
necessarly overwritten by a normal ABI function call. We allow frame 0
to provide its lr value to get the caller's return address, if it has
not been overwritten/saved to stack yet.
When a function is interrupted asynchronously by a POSIX signal
(sigtramp), or a fault handler more generally, the sigtramp/fault
handler has the entire register context available. In this situation, if
the fault handler is frame 0, the function that was async interrupted is
frame 1 and frame 2's return address may still be stored in lr. We need
to get the lr value for frame 1 from the fault handler in frame 0, to
get the return address for frame 2.
Without this fix, a frameless function that faults in a firmware
environment (that's where we've seen this issue most commonly) hasn't
spilled lr to stack, so we need to retrieve it from the fault handler's
full-register-context to find the caller of the frameless function that
faulted.
It's an unsurprising fix, all of the work was finding exactly where in
RegisterContextUnwind we were only allowing RA register use for frame 0,
when it should have been frame 0 or above a fault handler function.
rdar://127518945
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