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