On 2025-11-13 20:40, H. Peter Anvin wrote:
>
> For 64 bits, if you need frame pointer support *and* frob %rsp, using:
>
> xchg %[arg],%%rbp
> <stuff>
> xchg %[arg],%%rbp
>
> ... is probably easiest, with %[arg] in a register.
>
Incidentally, ORC is one thing, but if you need DWARF information to be
correct for user space, it is definitely "fun". With the xchg hack for 64
bits it is just a matter of using .cfi_def_cfa_register to change the frame
pointer around, but in the 32-bit case the best I could come up with was:
.cfi_remember_state
push %ebp
.cfi_escape 0x0f,3,0x74,0,0x06 // CFA address in *%esp
mov %eax, %ebp
mov $syscall_no, %eax
int $0x80
pop %ebp
.cfi_restore_state
Note that in both cases you need to *NOT* put in any of these CFI directives
when compiling without frame pointers (in which case you need to let gcc take
care of it if you want any hope of getting the CFI correct.)
-hpa