|991108.13||R||I||J. Merrill||Processor||Unwinding stacks|
At Cygnus, we've run into a couple of situations where we've
extend the dwarf2 unwind info specification:
1) The CFA is not always computable as register+offset. One of our targets
uses an 'and' to align the stack pointer in the prologue, and then
stores the old value into the stack; the saved register values are then
at a constant offset from the saved value, but not from the new $sp. To
deal with this, we added DW_CFA_def_cfa_loc, which takes a standard
dwarf2 location expression.
2) Targets that use register windows (i.e. SPARC) save their registers into
the previous stack frame, violating the principle that all register save
locations are to one side of the CFA. This could be handled by defining
the CFA to be at the top of the register window from the previous frame,
but we dealt with it by adding a DW_CFA_window_save, which is also more
compact than writing DW_CFA_offset's for each of the window registers.
This issue has been addressed by proposals 000330.1 and 001012.1.