RE: gprof's broken in 7-CURRENT

From: Luoqi Chen <luoqi_at_FreeBSD.org>
Date: Wed, 28 Nov 2007 23:22:45 GMT
> Luoqi Chen wrote:
> > Has anyone else noticed that gprof no longer works with gcc 4.2
>
> It's a known bug (very irritating!), but I think noone is working on it
> so it won't be fixed in 7.0.

In that case, I'll fix it.

I've looked at glibc's code, it claims that mcount cannot clobber any register.
I don't know if there is a standard for mcount interface, but I guess the gcc
team would use the glibc implementation as the reference. I'll change our code
to do the same.

/* We need a special version of the `mcount' function since for ix86 it
   must not clobber any register.  This has several reasons:
     - there is a bug in gcc as of version 2.7.2.2 which prohibits the
       use of profiling together with nested functions
     - the ELF `fixup' function uses GCC's regparm feature
     - some (future) systems might want to pass parameters in registers.  */

	ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(_mcount)
	ASM_TYPE_DIRECTIVE(C_SYMBOL_NAME(_mcount), _at_function)
	.align ALIGNARG(4)
C_LABEL(_mcount)
	/* Save the caller-clobbered registers.  */
	pushl %eax
	pushl %ecx
	pushl %edx

	movl 12(%esp), %edx
	movl 4(%ebp), %eax

	/* No need to access the PLT or GOT, __mcount_internal is an
	   internal function and we can make a relative call.  */
	call C_SYMBOL_NAME(__mcount_internal)

	/* Pop the saved registers.  Please note that `mcount' has no
	   return value.  */
	popl %edx
	popl %ecx
	popl %eax
	ret
	ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount))

Thanks
-lq 
Received on Wed Nov 28 2007 - 22:22:50 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:23 UTC