On Tue, Feb 14, 2012 at 7:07 PM, Richard Henderson <r...@redhat.com> 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

Reply via email to