[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