From 2079cde9647da0c4316d3718f1e436ef164f5400 Mon Sep 17 00:00:00 2001 From: Peter Wemm Date: Tue, 18 May 2004 22:52:32 +0000 Subject: [PATCH] The 'call mcount' hooks that gcc inserts when profiling are in a place that cannot handle the scratch registers being trashed. So we have to preserve them ourselves. --- sys/amd64/include/profile.h | 39 +++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/sys/amd64/include/profile.h b/sys/amd64/include/profile.h index 7085547f45e0..6e2ffb90ffc3 100644 --- a/sys/amd64/include/profile.h +++ b/sys/amd64/include/profile.h @@ -76,9 +76,43 @@ extern int mcount_lock; #define FUNCTION_ALIGNMENT 4 -#define _MCOUNT_DECL static __inline void _mcount +#define _MCOUNT_DECL \ +static void _mcount(uintfptr_t frompc, uintfptr_t selfpc) __unused; \ +static void _mcount #ifdef __GNUC__ +#define MCOUNT __asm (" \n\ + .globl .mcount \n\ + .type .mcount @function \n\ +.mcount: \n\ + pushq %rbp \n\ + movq %rsp, %rbp \n\ + pushq %rdi \n\ + pushq %rsi \n\ + pushq %rdx \n\ + pushq %rcx \n\ + pushq %r8 \n\ + pushq %r9 \n\ + movq 8(%rbp),%rsi \n\ + movq (%rbp),%rdi \n\ + movq 8(%rdi),%rdi \n\ + call _mcount \n\ + popq %r9 \n\ + popq %r8 \n\ + popq %rcx \n\ + popq %rdx \n\ + popq %rsi \n\ + popq %rdi \n\ + leave \n\ + ret \n\ + .size .mcount, . - .mcount"); +#if 0 +/* + * We could use this, except it doesn't preserve the registers that were + * being passed with arguments to the function that we were inserted + * into. I've left it here as documentation of what the code above is + * supposed to do. + */ #define MCOUNT \ void \ mcount() \ @@ -97,10 +131,11 @@ mcount() \ * the caller's frame pointer. The caller's raddr is in the \ * caller's frame following the caller's caller's frame pointer.\ */ \ - __asm("movq (%%rbp),%0" : "=r" (frompc)); \ + __asm("movq (%%rbp),%0" : "=r" (frompc)); \ frompc = ((uintfptr_t *)frompc)[1]; \ _mcount(frompc, selfpc); \ } +#endif #else /* __GNUC__ */ #define MCOUNT \ void \