]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
2016-03-03 Paul Pluzhnikov <ppluzhnikov@google.com>
authorPaul Pluzhnikov <ppluzhnikov@google.com>
Thu, 3 Mar 2016 17:53:49 +0000 (09:53 -0800)
committerPaul Pluzhnikov <ppluzhnikov@google.com>
Thu, 3 Mar 2016 17:53:49 +0000 (09:53 -0800)
[BZ #19490]
* sysdeps/x86_64/_mcount.S (_mcount): Add unwind descriptor.
(__fentry__): Likewise

ChangeLog
sysdeps/x86_64/_mcount.S

index a31f95a80de16236b947a9570c17514d2805f2c5..24c2b65cb0d55bb60712502d897aa811db4b43de 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-03  Paul Pluzhnikov  <ppluzhnikov@google.com>
+
+       [BZ #19490]
+       * sysdeps/x86_64/_mcount.S (_mcount): Add unwind descriptor.
+       (__fentry__): Likewise
+
 2016-03-03  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gmon/Makefile (noprof): Add $(sysdep_noprof).
index ba13643464c63f16b17650839c35dbe4e67d9e2c..a506d21dcdc9c36a0f27ee7b20ca4d6fe70f0d21 100644 (file)
 
 #include <sysdep.h>
 
-       .globl C_SYMBOL_NAME(_mcount)
-       .type C_SYMBOL_NAME(_mcount), @function
-       .align ALIGNARG(4)
-C_LABEL(_mcount)
+ENTRY(_mcount)
        /* 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)
        movq    %rsi,24(%rsp)
+       cfi_rel_offset (rsi, 24)
        movq    %rdi,32(%rsp)
+       cfi_rel_offset (rdi, 32)
        movq    %r8,40(%rsp)
+       cfi_rel_offset (r8, 40)
        movq    %r9,48(%rsp)
+       cfi_rel_offset (r9, 48)
 
        /* Setup parameter for __mcount_internal.  */
        /* selfpc is the return address on the stack.  */
@@ -47,33 +52,50 @@ C_LABEL(_mcount)
        /* Pop the saved registers.  Please note that `mcount' has no
           return value.  */
        movq    48(%rsp),%r9
+       cfi_restore (r9)
        movq    40(%rsp),%r8
+       cfi_restore (r8)
        movq    32(%rsp),%rdi
+       cfi_restore (rdi)
        movq    24(%rsp),%rsi
+       cfi_restore (rsi)
        movq    16(%rsp),%rdx
+       cfi_restore (rdx)
        movq    8(%rsp),%rcx
+       cfi_restore (rcx)
        movq    (%rsp),%rax
+       cfi_restore (rax)
        addq    $56,%rsp
+       cfi_adjust_cfa_offset (-56)
        ret
-
-       ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount))
+END(_mcount)
 
 #undef mcount
 weak_alias (_mcount, mcount)
 
-       .globl C_SYMBOL_NAME(__fentry__)
-       .type C_SYMBOL_NAME(__fentry__), @function
-       .align ALIGNARG(4)
-C_LABEL(__fentry__)
-       /* Allocate space for 7 registers.  */
+/* __fentry__ is different from _mcount in that it is called before
+   function prolog.  This means (among other things) that it has non-standard
+   stack alignment on entry: (%RSP & 0xF) == 0.  */
+
+ENTRY(__fentry__)
+       /* Allocate space for 7 registers
+          (+8 bytes for proper stack alignment).  */
        subq    $64,%rsp
+       cfi_adjust_cfa_offset (64)
        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)
        movq    %rsi,24(%rsp)
+       cfi_rel_offset (rsi, 24)
        movq    %rdi,32(%rsp)
+       cfi_rel_offset (rdi, 32)
        movq    %r8,40(%rsp)
+       cfi_rel_offset (r8, 40)
        movq    %r9,48(%rsp)
+       cfi_rel_offset (r9, 48)
 
        /* Setup parameter for __mcount_internal.  */
        /* selfpc is the return address on the stack.  */
@@ -84,13 +106,20 @@ C_LABEL(__fentry__)
        /* Pop the saved registers.  Please note that `__fentry__' has no
           return value.  */
        movq    48(%rsp),%r9
+       cfi_restore (r9)
        movq    40(%rsp),%r8
+       cfi_restore (r8)
        movq    32(%rsp),%rdi
+       cfi_restore (rdi)
        movq    24(%rsp),%rsi
+       cfi_restore (rsi)
        movq    16(%rsp),%rdx
+       cfi_restore (rdx)
        movq    8(%rsp),%rcx
+       cfi_restore (rcx)
        movq    (%rsp),%rax
+       cfi_restore (rax)
        addq    $64,%rsp
+       cfi_adjust_cfa_offset (-64)
        ret
-
-       ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(__fentry__))
+END(__fentry__)