[BZ,#19490] Add unwind descriptors for x86_64 _mcount and __fentry__
Commit Message
Greetings,
Attached patch adds unwind descriptors for x86_64 _mcount and __fentry__.
Tested on Linux/x86_64, no failures.
Assuming this is OK, should I wait for lifting of the freeze?
Thanks,
2016-01-23 Paul Pluzhnikov <ppluzhnikov@google.com>
[BZ #19490]
* sysdeps/x86_64/_mcount.S (_mcount): Add unwind descriptor.
(__fentry__): Likewise
Comments
On 23 Jan 2016 14:52, Paul Pluzhnikov wrote:
> --- a/sysdeps/x86_64/_mcount.S
> +++ b/sysdeps/x86_64/_mcount.S
> @@ -28,8 +28,10 @@
> .type C_SYMBOL_NAME(_mcount), @function
> .align ALIGNARG(4)
> C_LABEL(_mcount)
> + cfi_startproc
> /* Allocate space for 7 registers. */
> subq $56,%rsp
> + cfi_adjust_cfa_offset (56)
> movq %rax,(%rsp)
> movq %rcx,8(%rsp)
> movq %rdx,16(%rsp)
> @@ -37,6 +39,13 @@ C_LABEL(_mcount)
> movq %rdi,32(%rsp)
> movq %r8,40(%rsp)
> movq %r9,48(%rsp)
> + cfi_rel_offset (rax, 0)
> + cfi_rel_offset (rcx, 8)
> + cfi_rel_offset (rdx, 16)
> + cfi_rel_offset (rsi, 24)
> + cfi_rel_offset (rdi, 32)
> + cfi_rel_offset (r8, 40)
> + cfi_rel_offset (r9, 48)
don't we usually interleave the insns & cfi calls so that it's harder
for them to get out of sync ?
C_LABEL(_mcount)
cfi_startproc
/* Allocate space for 7 registers. */
subq $56,%rsp
cfi_adjust_cfa_offset (56)
movq %rax,(%rsp)
cfi_rel_offset (rax, 0)
movq %rcx,8(%rsp)
cfi_rel_offset (rcx, 8)
movq %rdx,16(%rsp)
cfi_rel_offset (rdx, 16)
...
ignoring that, the actual patch looks fine
> .type C_SYMBOL_NAME(__fentry__), @function
> .align ALIGNARG(4)
> C_LABEL(__fentry__)
> - /* Allocate space for 7 registers. */
> + cfi_startproc
> + /* Allocate space for 7 registers (+8 for proper stack alignment). */
> subq $64,%rsp
mmm, 56 is used above w/_mcount and is 8 byte aligned. are you saying
we need 16 byte alignment and thus _mcount should be fixed ?
-mike
@@ -28,8 +28,10 @@
.type C_SYMBOL_NAME(_mcount), @function
.align ALIGNARG(4)
C_LABEL(_mcount)
+ cfi_startproc
/* Allocate space for 7 registers. */
subq $56,%rsp
+ cfi_adjust_cfa_offset (56)
movq %rax,(%rsp)
movq %rcx,8(%rsp)
movq %rdx,16(%rsp)
@@ -37,6 +39,13 @@ C_LABEL(_mcount)
movq %rdi,32(%rsp)
movq %r8,40(%rsp)
movq %r9,48(%rsp)
+ cfi_rel_offset (rax, 0)
+ cfi_rel_offset (rcx, 8)
+ cfi_rel_offset (rdx, 16)
+ cfi_rel_offset (rsi, 24)
+ cfi_rel_offset (rdi, 32)
+ cfi_rel_offset (r8, 40)
+ cfi_rel_offset (r9, 48)
/* Setup parameter for __mcount_internal. */
/* selfpc is the return address on the stack. */
@@ -58,7 +67,16 @@ C_LABEL(_mcount)
movq 8(%rsp),%rcx
movq (%rsp),%rax
addq $56,%rsp
+ cfi_restore (r9)
+ cfi_restore (r8)
+ cfi_restore (rdi)
+ cfi_restore (rsi)
+ cfi_restore (rdx)
+ cfi_restore (rcx)
+ cfi_restore (rax)
+ cfi_adjust_cfa_offset (-56)
ret
+ cfi_endproc
ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount))
@@ -69,8 +87,10 @@ weak_alias (_mcount, mcount)
.type C_SYMBOL_NAME(__fentry__), @function
.align ALIGNARG(4)
C_LABEL(__fentry__)
- /* Allocate space for 7 registers. */
+ cfi_startproc
+ /* Allocate space for 7 registers (+8 for proper stack alignment). */
subq $64,%rsp
+ cfi_adjust_cfa_offset (64)
movq %rax,(%rsp)
movq %rcx,8(%rsp)
movq %rdx,16(%rsp)
@@ -78,6 +98,13 @@ C_LABEL(__fentry__)
movq %rdi,32(%rsp)
movq %r8,40(%rsp)
movq %r9,48(%rsp)
+ cfi_rel_offset (rax, 0)
+ cfi_rel_offset (rcx, 8)
+ cfi_rel_offset (rdx, 16)
+ cfi_rel_offset (rsi, 24)
+ cfi_rel_offset (rdi, 32)
+ cfi_rel_offset (r8, 40)
+ cfi_rel_offset (r9, 48)
/* Setup parameter for __mcount_internal. */
/* selfpc is the return address on the stack. */
@@ -98,7 +125,16 @@ C_LABEL(__fentry__)
movq 16(%rsp),%rdx
movq 8(%rsp),%rcx
movq (%rsp),%rax
+ cfi_restore (r9)
+ cfi_restore (r8)
+ cfi_restore (rdi)
+ cfi_restore (rsi)
+ cfi_restore (rdx)
+ cfi_restore (rcx)
+ cfi_restore (rax)
addq $64,%rsp
+ cfi_adjust_cfa_offset (-64)
ret
+ cfi_endproc
ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(__fentry__))