1/* Machine-specific calling sequence for `mcount' profiling function. x86-64 version.
2 Copyright (C) 2002-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19/* Assembly stub to invoke _mcount(). Compiler generated code calls
20 this stub after executing a function's prologue and without saving any
21 registers. It is therefore necessary to preserve %rcx, %rdx, %rsi, %rdi,
22 %r8, %r9 as they may contain function arguments. */
23
24#include <sysdep.h>
25
26ENTRY(_mcount)
27 /* Allocate space for 7 registers. */
28 subq $56,%rsp
29 cfi_adjust_cfa_offset (56)
30 movq %rax,(%rsp)
31 cfi_rel_offset (rax, 0)
32 movq %rcx,8(%rsp)
33 cfi_rel_offset (rcx, 8)
34 movq %rdx,16(%rsp)
35 cfi_rel_offset (rdx, 16)
36 movq %rsi,24(%rsp)
37 cfi_rel_offset (rsi, 24)
38 movq %rdi,32(%rsp)
39 cfi_rel_offset (rdi, 32)
40 movq %r8,40(%rsp)
41 cfi_rel_offset (r8, 40)
42 movq %r9,48(%rsp)
43 cfi_rel_offset (r9, 48)
44
45 /* Setup parameter for __mcount_internal. */
46 /* selfpc is the return address on the stack. */
47 movq 56(%rsp),%rsi
48 /* Get frompc via the frame pointer. */
49 movq 8(%rbp),%rdi
50 call C_SYMBOL_NAME(__mcount_internal)
51 /* Pop the saved registers. Please note that `mcount' has no
52 return value. */
53 movq 48(%rsp),%r9
54 cfi_restore (r9)
55 movq 40(%rsp),%r8
56 cfi_restore (r8)
57 movq 32(%rsp),%rdi
58 cfi_restore (rdi)
59 movq 24(%rsp),%rsi
60 cfi_restore (rsi)
61 movq 16(%rsp),%rdx
62 cfi_restore (rdx)
63 movq 8(%rsp),%rcx
64 cfi_restore (rcx)
65 movq (%rsp),%rax
66 cfi_restore (rax)
67 addq $56,%rsp
68 cfi_adjust_cfa_offset (-56)
69 ret
70END(_mcount)
71
72#undef mcount
73weak_alias (_mcount, mcount)
74
75/* __fentry__ is different from _mcount in that it is called before
76 function prolog. This means (among other things) that it has non-standard
77 stack alignment on entry: (%RSP & 0xF) == 0. */
78
79ENTRY(__fentry__)
80 /* Allocate space for 7 registers
81 (+8 bytes for proper stack alignment). */
82 subq $64,%rsp
83 cfi_adjust_cfa_offset (64)
84 movq %rax,(%rsp)
85 cfi_rel_offset (rax, 0)
86 movq %rcx,8(%rsp)
87 cfi_rel_offset (rcx, 8)
88 movq %rdx,16(%rsp)
89 cfi_rel_offset (rdx, 16)
90 movq %rsi,24(%rsp)
91 cfi_rel_offset (rsi, 24)
92 movq %rdi,32(%rsp)
93 cfi_rel_offset (rdi, 32)
94 movq %r8,40(%rsp)
95 cfi_rel_offset (r8, 40)
96 movq %r9,48(%rsp)
97 cfi_rel_offset (r9, 48)
98
99 /* Setup parameter for __mcount_internal. */
100 /* selfpc is the return address on the stack. */
101 movq 64(%rsp),%rsi
102 /* caller is the return address above it */
103 movq 72(%rsp),%rdi
104 call C_SYMBOL_NAME(__mcount_internal)
105 /* Pop the saved registers. Please note that `__fentry__' has no
106 return value. */
107 movq 48(%rsp),%r9
108 cfi_restore (r9)
109 movq 40(%rsp),%r8
110 cfi_restore (r8)
111 movq 32(%rsp),%rdi
112 cfi_restore (rdi)
113 movq 24(%rsp),%rsi
114 cfi_restore (rsi)
115 movq 16(%rsp),%rdx
116 cfi_restore (rdx)
117 movq 8(%rsp),%rcx
118 cfi_restore (rcx)
119 movq (%rsp),%rax
120 cfi_restore (rax)
121 addq $64,%rsp
122 cfi_adjust_cfa_offset (-64)
123 ret
124END(__fentry__)
125

source code of glibc/sysdeps/x86_64/_mcount.S