summaryrefslogtreecommitdiff
path: root/sysdeps/x86_64/_mcount.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/x86_64/_mcount.S')
-rw-r--r--sysdeps/x86_64/_mcount.S65
1 files changed, 43 insertions, 22 deletions
diff --git a/sysdeps/x86_64/_mcount.S b/sysdeps/x86_64/_mcount.S
index 5d7edd2a29..a2f4068b61 100644
--- a/sysdeps/x86_64/_mcount.S
+++ b/sysdeps/x86_64/_mcount.S
@@ -1,5 +1,5 @@
/* Machine-specific calling sequence for `mcount' profiling function. x86-64 version.
- Copyright (C) 2002-2016 Free Software Foundation, Inc.
+ Copyright (C) 2002-2018 Free Software Foundation, Inc.
Contributed by Andreas Jaeger <aj@suse.de>.
This file is part of the GNU C Library.
@@ -24,81 +24,102 @@
#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. */
movq 56(%rsp),%rsi
/* Get frompc via the frame pointer. */
movq 8(%rbp),%rdi
-#ifdef PIC
- call C_SYMBOL_NAME(__mcount_internal)@PLT
-#else
call C_SYMBOL_NAME(__mcount_internal)
-#endif
/* 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. */
movq 64(%rsp),%rsi
/* caller is the return address above it */
movq 72(%rsp),%rdi
-#ifdef PIC
- call C_SYMBOL_NAME(__mcount_internal)@PLT
-#else
call C_SYMBOL_NAME(__mcount_internal)
-#endif
/* 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__)