]>
Commit | Line | Data |
---|---|---|
0a54e401 | 1 | /* Machine-dependent definitions for profiling support. ARM version. |
3f62b69a | 2 | Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. |
0a54e401 UD |
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 | |
41bdb6e2 AJ |
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. | |
0a54e401 UD |
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 | |
41bdb6e2 | 13 | Lesser General Public License for more details. |
0a54e401 | 14 | |
41bdb6e2 AJ |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with the GNU C Library; if not, write to the Free | |
17 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | |
18 | 02111-1307 USA. */ | |
0a54e401 UD |
19 | |
20 | /* GCC for the ARM cannot compile __builtin_return_address(N) for N != 0, | |
21 | so we must use an assembly stub. */ | |
22 | ||
23 | #include <sysdep.h> | |
24 | #ifndef NO_UNDERSCORES | |
25 | /* The asm symbols for C functions are `_function'. | |
26 | The canonical name for the counter function is `mcount', no _. */ | |
27 | void _mcount (void) asm ("mcount"); | |
28 | #else | |
29 | /* The canonical name for the function is `_mcount' in both C and asm, | |
30 | but some old asm code might assume it's `mcount'. */ | |
31 | void _mcount (void); | |
32 | weak_alias (_mcount, mcount) | |
33 | #endif | |
34 | ||
913e79f5 | 35 | static void mcount_internal (u_long frompc, u_long selfpc) __attribute_used__; |
0a54e401 UD |
36 | |
37 | #define _MCOUNT_DECL(frompc, selfpc) \ | |
38 | static void mcount_internal (u_long frompc, u_long selfpc) | |
39 | ||
3f62b69a UD |
40 | /* This macro/func MUST save r0, r1 because the compiler inserts |
41 | blind calls to _mount(), ignoring the fact that _mcount may | |
42 | clobber registers; therefore, _mcount may NOT clobber registers */ | |
43 | /* if (this_fp!=0) { | |
8c93cd99 UD |
44 | r0 = this_fp |
45 | r1 = this_lr | |
46 | r1 = [r1-4] which is caller's lr | |
3f62b69a UD |
47 | if (r1!=0) |
48 | r1 = caller's lr | |
49 | call mcount_internal(this_lr, caller's_lr) | |
50 | } | |
8c93cd99 UD |
51 | */ |
52 | ||
3f62b69a UD |
53 | #define MCOUNT \ |
54 | void _mcount (void) \ | |
55 | { \ | |
56 | __asm__("stmdb sp!, {r0, r1, r2, r3};" \ | |
57 | "movs fp, fp;" \ | |
8c93cd99 UD |
58 | "moveq r1, #0;" \ |
59 | "ldrne r1, [fp, $-4];" \ | |
60 | "ldrne r0, [fp, $-12];" \ | |
61 | "movnes r0, r0;" \ | |
62 | "ldrne r0, [r0, $-4];" \ | |
63 | "movs r0, r0;" \ | |
3f62b69a UD |
64 | "blne mcount_internal;" \ |
65 | "ldmia sp!, {r0, r1, r2, r3}"); \ | |
0a54e401 | 66 | } |
8c93cd99 | 67 |