gprof's broken in 7-CURRENT
Luoqi Chen
luoqi at FreeBSD.org
Thu Nov 29 12:24:52 PST 2007
> And to think that I mentioned this problem 5-6 months ago with gcc 4.2.x
> and now it finally gets publicity...
Did I just hear someone volunteered to be a guinea pig?
Garrett, would you like to try out my fix? It's actually quite simple,
Index: profile.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/profile.h,v
retrieving revision 1.42
diff -u -r1.42 profile.h
--- profile.h 28 Oct 2006 11:03:03 -0000 1.42
+++ profile.h 29 Nov 2007 20:07:15 -0000
@@ -115,7 +115,17 @@
void \
mcount() \
{ \
- uintfptr_t selfpc, frompc; \
+ uintfptr_t selfpc, frompc, ecx; \
+ /* \
+ * In gcc 4.2, ecx could be used in the caller as arg pointer \
+ * if stack realignment option is set (-mstackrealign) or \
+ * if the caller has the force_align_arg_pointer atrribute \
+ * (stack realignment is ALWAYS on for main). Preserve ecx \
+ * here. Use volatile to prevent this statement from being \
+ * rescheduled with the next two, just in case the compiler \
+ * decides to use ecx for either selfpc or frompc. \
+ */ \
+ __asm __volatile("movl %%ecx,%0" : "=m" (ecx)); \
/* \
* Find the return address for mcount, \
* and the return address for mcount's caller. \
@@ -132,6 +142,7 @@
__asm("movl (%%ebp),%0" : "=r" (frompc)); \
frompc = ((uintfptr_t *)frompc)[1]; \
_mcount(frompc, selfpc); \
+ __asm __volatile("movl %0,%%ecx" : : "m" (ecx)); \
}
#else /* !__GNUCLIKE_ASM */
#define MCOUNT
This file is in the kernel tree, but the change only affects libc build.
If you don't want to redo a world build, you may copy the patched profile.h
to /usr/include/machine and "make all install" inside /usr/src/lib/libc.
Then re-link -pg compiled code and try it out.
Thanks
-lq
More information about the freebsd-current
mailing list