On Mon, Jul 28, 2008 at 11:42:34AM +0200, Havard Eidnes wrote: | as should be well-known by now, the compilation of mcount.c now | fails on all our mips ports. The reason this has recently | started happning is that assembler warnings have were recently | made fatal errors, through a change to <bsd.sys.mk>. The warning | emitted is: | | /var/tmp//ccXs67rq.s: Assembler messages: | /var/tmp//ccXs67rq.s:9: Warning: No .cprestore pseudo-op used in PIC code | /var/tmp//ccXs67rq.s:219: Error: 1 warnings, treating warnings as errors | --- mcount.o --- I discussed your proposal with Simon, and he wasn't 100% sure that your suggested fix is correct. I've committed a workaround to gmon/Makefile.inc to disable assembler warnings for mcount.c on mips. Once a fix is available that the MIPS gurus are happy with, we can remove the workaround. I apologise for taking so long to getting to this workaround, and appreciate your effort in trying to fix it despite my slackness. cheers, Luke. | | This traces back to the assembly code in the MCOUNT macro in | sys/arch/mips/include/profile.h, which defines the _mcount symbol | and which calls the __mcount function, which is implemented in C, | and which is in common/lib/libc/gmon/mcount.c. | | Now, if one were to just blindly follow the warnings from the | assembler, one would quickly discover that once you insert | ".cprestore 24" into the assembly code, it next complains there | is no ".frame", and then that there is no ".ent", and lastly that | there is no ".end". | | I have "fixed" all those things in my local source tree, but | since I'm no MIPS assembly expert, I suspect that _mcount() is no | longer working as it should, as it is now more or less a full- | fledged function, and I think the point of the assembly code is | to *not* be a full-fledged function. | | Can anyone please tell me if it's possible to implement _mcount() | on MIPS without getting assembly warnings? | | My feeble and most likely faulty attempt follows attached below. | | Regards, | | - H?vard | Index: profile.h | =================================================================== | RCS file: /u/nb/src/sys/arch/mips/include/profile.h,v | retrieving revision 1.20 | diff -u -p -r1.20 profile.h | --- profile.h 24 Dec 2005 23:24:01 -0000 1.20 | +++ profile.h 28 Jul 2008 08:45:32 -0000 | @@ -52,8 +52,18 @@ | | #ifdef _KERNEL | # define _PROF_CPLOAD "" | +# define _PROF_CPRESTORE "" | +# define _PROF_FRAME "" | +# define _PROF_ENT "" | +# define _PROF_END "" | #else | # define _PROF_CPLOAD ".cpload $25;" | +/* 24 is the next free slot on the stack (sp=$29), ref. code below */ | +# define _PROF_CPRESTORE ".cprestore 24;" | +/* 40 = 6 regs (=24), 2 args (=8), and 8(?) bytes for gp */ | +# define _PROF_FRAME ".frame $sp,40,$31;" | +# define _PROF_ENT ".ent _mcount;" | +# define _PROF_END ".end _mcount; .size _mcount, .-_mcount;" | #endif | | | @@ -64,7 +74,9 @@ | #define MCOUNT \ | __asm(".globl _mcount;" \ | ".type _mcount,@function;" \ | + _PROF_ENT \ | "_mcount:;" \ | + _PROF_FRAME \ | ".set noreorder;" \ | ".set noat;" \ | _PROF_CPLOAD \ | @@ -75,6 +87,7 @@ | "sw $7,20($29);" \ | "sw $1,0($29);" \ | "sw $31,4($29);" \ | + _PROF_CPRESTORE \ | "move $5,$31;" \ | "move $4,$1;" \ | "jal __mcount;" \ | @@ -89,7 +102,9 @@ | "j $31;" \ | "move $31,$1;" \ | ".set reorder;" \ | - ".set at"); | + ".set at;" \ | + _PROF_END \ | + ); | | #ifdef _KERNEL | /*
Attachment:
pgpHtUuBxqaWW.pgp
Description: PGP signature