Port-mips archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

mcount.c / profile.h and fatal assembler warnings



Hi,

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 ---

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
 /*


Home | Main Index | Thread Index | Old Index