On Mon, Feb 13, 2012 at 11:57 PM, Richard Henderson <r...@redhat.com> wrote:
> On 02/13/2012 02:54 PM, Uros Bizjak wrote:
>> -     movq    56(%rsi), %rdx
>>       movl    %edi, %eax
>>       cfi_def_cfa(%rcx, 0)
>> -     cfi_register(%rip, %rdx)
>>       movq    %rcx, %rsp
>> -     jmp     *%rdx
>> +     jmp     *56(%rsi)
>
> If you're going to do that, the correct fix for the unwind info is
>
> - cfi_register(%rip, %rdx)
> + cfi_offset(%rip, 56)

Hm, we just defined new CFA as rcx+0, so we should define location of
rip relative to new CFA. Since CFA points to stack slot just before
return address was pushed, new rip lies at CFA-8 for 64bit resp. CFA-4
for x86_32. Did I get these .cfi directives correctly?

SYM(GTM_longjmp):
        cfi_startproc
#ifdef __x86_64__
        movq    (%rsi), %rcx
        movq    8(%rsi), %rbx
        movq    16(%rsi), %rbp
        movq    24(%rsi), %r12
        movq    32(%rsi), %r13
        movq    40(%rsi), %r14
        movq    48(%rsi), %r15
        movl    %edi, %eax
        cfi_def_cfa(%rcx, 0)
        cfi_offset(%rip, -8)
        movq    %rcx, %rsp
        jmp     *56(%rsi)
#else
        movl    (%edx), %ecx
        movl    4(%edx), %ebx
        movl    8(%edx), %esi
        movl    12(%edx), %edi
        movl    16(%edx), %ebp
        cfi_def_cfa(%ecx, 0)
        cfi_offset(%eip, -4)
        movl    %ecx, %esp
        jmp     *20(%edx)
#endif
        cfi_endproc

Uros.

Reply via email to