On Tue, Feb 14, 2012 at 8:39 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
>>>> - 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? >> >> No. The value at %rcx-8 is total garbage. There no guarantee that >> the call stack leading to this abort has anything in common with the >> call stack that created the jmpbuf, except *above* %rcx, the new CFA. >> >> The new rip is at rsi+56. You can see that in that you jump to it. > > Thanks for the explanation, I will commit the patch with your suggested > change. Now with the patch attached... (please also note that rip is now defined with offset to old CFA, before CFA is updated to new register). Uros.
Index: ChangeLog =================================================================== --- ChangeLog (revision 184197) +++ ChangeLog (working copy) @@ -1,3 +1,7 @@ +2012-02-15 Uros Bizjak <ubiz...@gmail.com> + + * config/x86/target.h (GTM_longjmp): Jump indirect from memory address. + 2012-02-13 Eric Botcazou <ebotca...@adacore.com> * configure.tgt (target_cpu): Handle sparc and sparc64 & sparcv9. Index: config/x86/sjlj.S =================================================================== --- config/x86/sjlj.S (revision 184150) +++ config/x86/sjlj.S (working copy) @@ -119,23 +119,21 @@ movq 32(%rsi), %r13 movq 40(%rsi), %r14 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) #else movl (%edx), %ecx movl 4(%edx), %ebx movl 8(%edx), %esi movl 12(%edx), %edi movl 16(%edx), %ebp - movl 20(%edx), %edx + cfi_offset(%eip, 20) cfi_def_cfa(%ecx, 0) - cfi_register(%eip, %edx) movl %ecx, %esp - jmp *%edx + jmp *20(%edx) #endif cfi_endproc