1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- - 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.
|