diff options
author | marcel <marcel@FreeBSD.org> | 2004-08-25 07:42:34 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2004-08-25 07:42:34 +0000 |
commit | 52736a0a13c8e6e526a15ae80cb713785a0e54e9 (patch) | |
tree | 96140b7210ea2a78aca4308ffa0ac64699660fe9 /lib | |
parent | a2bb055310854876373f4978c9077436ae388a9b (diff) | |
download | FreeBSD-src-52736a0a13c8e6e526a15ae80cb713785a0e54e9.zip FreeBSD-src-52736a0a13c8e6e526a15ae80cb713785a0e54e9.tar.gz |
Make profiling actually work. The gcc compiler emits a call to the
_mcount() stub when profiling is enabled. Emit this code sequence
for assembly routines as welli (MCOUNT definition in <machine/asm.h>.
We do not pass the GOT entry however as the 4th argument, because it's
not used. The _mcount() stub calls __mcount(), which does the actual
work. Define _MCOUNT_DECL to define __mcount. We do not have an
implementation of mcount(), so we define MCOUNT as empty, but have a
weak alias to _mcount() in _mcount.S.
Note that the _mcount() stub in the kernel is slightly different from
the stub in userland. This is because we do not have to worry about
nested routines in the kernel.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc/ia64/gen/Makefile.inc | 8 | ||||
-rw-r--r-- | lib/libc/ia64/gen/_mcount.S | 75 |
2 files changed, 79 insertions, 4 deletions
diff --git a/lib/libc/ia64/gen/Makefile.inc b/lib/libc/ia64/gen/Makefile.inc index 1eb7264..5358ea8 100644 --- a/lib/libc/ia64/gen/Makefile.inc +++ b/lib/libc/ia64/gen/Makefile.inc @@ -1,10 +1,10 @@ # $FreeBSD$ SRCS+= __divdf3.S __divdi3.S __divsf3.S __divsi3.S __moddi3.S __modsi3.S \ - __udivdi3.S __udivsi3.S __umoddi3.S __umodsi3.S _setjmp.S fabs.S \ - _set_tp.c flt_rounds.c fpgetmask.c fpgetround.c fpsetmask.c \ - fpsetround.c infinity.c \ - ldexp.c makecontext.c modf.c setjmp.S signalcontext.c sigsetjmp.S + __udivdi3.S __udivsi3.S __umoddi3.S __umodsi3.S _mcount.S _set_tp.c \ + _setjmp.S fabs.S flt_rounds.c fpgetmask.c fpgetround.c fpsetmask.c \ + fpsetround.c infinity.c ldexp.c makecontext.c modf.c setjmp.S \ + signalcontext.c sigsetjmp.S # The following may go away if function _Unwind_FindTableEntry() # will be part of GCC. diff --git a/lib/libc/ia64/gen/_mcount.S b/lib/libc/ia64/gen/_mcount.S new file mode 100644 index 0000000..d9e9b76 --- /dev/null +++ b/lib/libc/ia64/gen/_mcount.S @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2004 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <machine/asm.h> +__FBSDID("$FreeBSD$"); + + .text + +/* + * Important registers: + * r8 structure return address + * r15 static link (nested routines) + * rp our return address + * in0 caller's ar.pfs + * in1 caller's gp + * in2 caller's rp + * in3 GOT entry + * ar.pfs our pfs + */ +ENTRY_NOPROFILE(_mcount, 4) + alloc loc0 = ar.pfs, 4, 4, 2, 0 + mov loc1 = r8 + mov loc2 = rp + mov loc3 = r15 + ;; + mov out0 = in2 + mov out1 = rp + br.call.sptk rp = __mcount + ;; +1: + mov gp = in1 + mov r14 = ip + mov b7 = loc2 + ;; + add r14 = 2f - 1b, r14 + mov ar.pfs = loc0 + mov rp = in2 + ;; + mov r15 = loc3 + mov b7 = r14 + mov b6 = loc2 + mov r8 = loc1 + mov r14 = in0 + br.ret.sptk b7 + ;; +2: + mov ar.pfs = r14 + br.sptk b6 + ;; +END(_mcount) + +WEAK_ALIAS(mcount, _mcount) |