On Tue, Feb 14, 2012 at 7:07 PM, Richard Henderson <[email protected]> wrote:
> On 02/13/2012 11:54 PM, Uros Bizjak wrote:
>> movq 48(%rsi), %r15
>> - movq 56(%rsi), %rdx
>> movl %edi, %eax
>> + cfi_offset(%rip, 56)
>> cfi_def_cfa(%rcx, 0)
>> - cfi_register(%rip, %rdx)
>> movq %rcx, %rsp
>> - jmp *%rdx
>> + jmp *56(%rsi)
>
> I'm sorry, I was mistaken earlier. The rip value is not at CFA+56, it's at
> RSI+56.
> The way to describe this is
>
> cfi_def_cfa(%rsi, 0)
> cfi_offset(%rip, 56)
> cfi_register(%rsp, %rcx)
Yes, IMO this now describes correct CFA handling. Following follow-on
patch corrects this issue (and also puts .cfi directions to the place
where they make most sense, mainly a cosmetic change).
Re-tested on x86_64-pc-linux-gnu {,-m32} and committed.
Thanks,
Uros.
Index: config/x86/sjlj.S
===================================================================
--- config/x86/sjlj.S (revision 184213)
+++ config/x86/sjlj.S (working copy)
@@ -112,6 +112,7 @@
SYM(GTM_longjmp):
cfi_startproc
#ifdef __x86_64__
+ cfi_def_cfa(%rsi, 0)
movq (%rsi), %rcx
movq 8(%rsi), %rbx
movq 16(%rsi), %rbp
@@ -119,20 +120,21 @@
movq 32(%rsi), %r13
movq 40(%rsi), %r14
movq 48(%rsi), %r15
+ cfi_offset(%rip, 56)
movl %edi, %eax
- cfi_offset(%rip, 56)
- cfi_def_cfa(%rcx, 0)
movq %rcx, %rsp
+ cfi_register(%rsp, %rcx)
jmp *56(%rsi)
#else
+ cfi_def_cfa(%edx, 0)
movl (%edx), %ecx
movl 4(%edx), %ebx
movl 8(%edx), %esi
movl 12(%edx), %edi
movl 16(%edx), %ebp
cfi_offset(%eip, 20)
- cfi_def_cfa(%ecx, 0)
movl %ecx, %esp
+ cfi_register(%esp, %ecx)
jmp *20(%edx)
#endif
cfi_endproc