mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-11-24 08:17:38 +01:00
444b815950
(Logical change 1.4)
65 lines
1.9 KiB
Text
65 lines
1.9 KiB
Text
- the frame state consists of the following:
|
|
|
|
- ip current instruction pointer
|
|
- sp current stack pointer value
|
|
- bsp current backing store pointer
|
|
- cfm current frame mask
|
|
|
|
these are derived from the next younger (more deeply nested) frame
|
|
as follows:
|
|
|
|
- ip == saved return-link (may be b0 or an alternate branch-reg)
|
|
- sp == if younger frame has a fixed-sized frame, sp + size-of-frame,
|
|
else saved sp
|
|
- cfm == saved ar.pfs
|
|
- bsp == if ar.bsp has been saved, saved ar.bsp, otherwise,
|
|
ar.bsp \ominus saved ar.pfs.pfm.sol
|
|
|
|
The unwind cursor should represent the machine state as it existed at
|
|
the address contained in register ip. This state consists of the
|
|
*current* frame state and the save locations in the next younger
|
|
frame.
|
|
|
|
An unwind script current takes the old save locations and updates them
|
|
for the next older frame. With the new setup, we need to update the
|
|
frame state first, without updating the other save locations. For this
|
|
to work, we need the following info:
|
|
|
|
- save location of return-link
|
|
- save location of ar.pfs
|
|
- save location of bsp (if it has been saved)
|
|
- size of stack frame (fixed case) or save location of sp
|
|
|
|
|
|
setup:
|
|
|
|
func: ...
|
|
...
|
|
...
|
|
br.call foo <-- call site
|
|
... <-- ip
|
|
...
|
|
|
|
initial state:
|
|
|
|
The unwind cursor represents the (preserved) machine state
|
|
as it existed at "ip".
|
|
|
|
Evaluating the unwind descriptors for "ip" yields the following
|
|
info:
|
|
|
|
- frame size at call site (or previous sp)
|
|
- what registers where saved where by func before
|
|
the call site was reached
|
|
|
|
|
|
Note that there is some procedure info that needs to be obtained
|
|
for the new "ip" which is contained in the unwind descriptors.
|
|
Specifically, the following is needed:
|
|
|
|
- procedure's start address
|
|
- personality address
|
|
- pointer to language-specific data area
|
|
|
|
This info is stored in a separate proc_info structure and needs
|
|
to be obtained right after running the unwind script for func.
|