[PATCH, libitm]: GTM_longjmp: Jump indirect from memory address
Richard Henderson
rth@redhat.com
Tue Feb 14 20:20:00 GMT 2012
On 02/14/2012 10:26 AM, Uros Bizjak wrote:
> #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)
No, your changes are incorrect. All three markers needed to be together
in order to provide a consistent and coherent unwind. What you committed
was much worse than simply not describing anything at all.
Fixed as below. Committed.
r~
diff --git a/libitm/config/x86/sjlj.S b/libitm/config/x86/sjlj.S
index 554ec98..8844228 100644
--- a/libitm/config/x86/sjlj.S
+++ b/libitm/config/x86/sjlj.S
@@ -112,7 +112,6 @@ SYM(_ITM_beginTransaction):
SYM(GTM_longjmp):
cfi_startproc
#ifdef __x86_64__
- cfi_def_cfa(%rsi, 0)
movq (%rsi), %rcx
movq 8(%rsi), %rbx
movq 16(%rsi), %rbp
@@ -120,21 +119,22 @@ SYM(GTM_longjmp):
movq 32(%rsi), %r13
movq 40(%rsi), %r14
movq 48(%rsi), %r15
- cfi_offset(%rip, 56)
movl %edi, %eax
- movq %rcx, %rsp
+ cfi_def_cfa(%rsi, 0)
+ cfi_offset(%rip, 56)
cfi_register(%rsp, %rcx)
+ movq %rcx, %rsp
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_def_cfa(%edx, 0)
cfi_offset(%eip, 20)
- movl %ecx, %esp
cfi_register(%esp, %ecx)
+ movl %ecx, %esp
jmp *20(%edx)
#endif
cfi_endproc
More information about the Gcc-patches
mailing list