> 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 _at__at_ -115,7 +115,17 _at__at_ 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. \ _at__at_ -132,6 +142,7 _at__at_ __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 -lqReceived on Thu Nov 29 2007 - 19:24:52 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:23 UTC