This patch rearranges emission of CFI instructions, so the resulting DWARF and .eh_frame information is
precise at every instruction.
The current state is that the unwind info is emitted only after the function prologue. This is fine for synchronous (e.g. C++) exceptions, but
the information is generally incorrect when the program counter is at an instruction in the prologue or the epilogue, for example:
stp x29, x30, [sp, #-16]! // 16-byte Folded Spill mov x29, sp .cfi_def_cfa w29, 16 ...
after the stp is executed the (initial) rule for the CFA still says the CFA is in the sp, even though it's already offset by 16 bytes
A correct unwind info could look like:
stp x29, x30, [sp, #-16]! // 16-byte Folded Spill .cfi_def_cfa_offset 16 mov x29, sp .cfi_def_cfa w29, 16 ...
Having this information precise up to an instruction is useful for sampling profilers that would like to get a stack backtrace. The end goal
(towards this patch is just a step) is to have fully working -fasynchronous-unwind-tables.
clang-format: please reformat the code