Move ARM EABI mcount into a separate .S file.
[glibc-ports.git] / sysdeps / arm / eabi / arm-mcount.S
blob2aa50b70e70623248a168ee6056c3325d7a655c7
1 /* Implementation of profiling support.  ARM EABI version.
2    Copyright (C) 2008, 2009 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
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.
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.
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.  */
20 /* Don't call mcount when calling mcount...  */
21 #undef PROF
23 #include <sysdep.h>
26 #ifdef __thumb2__
27         .thumb
28         .syntax unified
29 #endif
32 /* Use an assembly stub with a special ABI.  The calling lr has been
33    pushed to the stack (which will be misaligned).  We should preserve
34    all registers except ip and pop a word off the stack.
36    NOTE: This assumes mcount_internal does not clobber any non-core
37    (coprocessor) registers.  Currently this is true, but may require
38    additional attention in the future.
40    The calling sequence looks something like:
41 func:
42    push {lr}
43    bl __gnu_mount_nc
44    <function body>
47 ENTRY(__gnu_mcount_nc)
48         push {r0, r1, r2, r3, lr}
49         bic r1, lr, #1
50         ldr r0, [sp, #20]
51         bl __mcount_internal
52         pop {r0, r1, r2, r3, ip, lr}
53         bx ip
54 END(__gnu_mcount_nc)
57 /* Provide old mcount for backwards compatibility.  This requires
58    code be compiled with APCS frame pointers.  */
60 ENTRY(_mcount)
61         stmdb sp!, {r0, r1, r2, r3, fp, lr}
62 #ifdef __thumb2__
63         movs r0, fp
64         ittt ne
65         ldrne r0, [r0, #-4]
66 #else
67         movs fp, fp
68         ldrne r0, [fp, #-4]
69 #endif
70         movnes r1, lr
71         blne __mcount_internal
72 #ifdef __thumb2__
73         ldmia sp!, {r0, r1, r2, r3, fp, pc}
74 #else
75         ldmia sp!, {r0, r1, r2, r3, fp, lr}
76         bx lr
77 #endif
78 END(_mcount)
80 /* The canonical name for the function is `_mcount' in both C and asm,
81    but some old asm code might assume it's `mcount'.  */
82 #undef mcount
83 weak_alias (_mcount, mcount)