This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
MIPS, profiling, and not working
- To: linux-mips at oss dot sgi dot com, gcc-bugs at gcc dot gnu dot org
- Subject: MIPS, profiling, and not working
- From: Daniel Jacobowitz <dan at debian dot org>
- Date: Tue, 14 Aug 2001 15:09:24 -0700
- Cc: Simon Gee <simong at oz dot agile dot tv>
I'm having some interesting problems with getting _mcount() to work on
mips*-*-linux. Most of them are easily correctable within _mcount itself,
but one deals with how it's called. The sequence looks like this:
.set noreorder
.set noat
move $1,$31 # save current return address
jal _mcount
subu $sp,$sp,8 # _mcount pops 2 words from stack
.set reorder
.set at
Suppose we have a function with no frame pointer, though - one which would
otherwise be a leaf. We have a small problem based on the fact that
GCC considers it to be a leaf despite calling _mcount. If it uses $sp for
its frame register, then when the jal expands:
0x404550 <__libc_start_main+16>: sw $gp,16($sp)
...
0x404574 <__libc_start_main+52>: move $at,$ra
0x404578 <__libc_start_main+56>: lw $t9,-32584($gp)
0x40457c <__libc_start_main+60>: nop
0x404580 <__libc_start_main+64>: jalr $t9
0x404584 <__libc_start_main+68>: nop
0x404588 <__libc_start_main+72>: lw $gp,16($sp)
0x40458c <__libc_start_main+76>: addiu $sp,$sp,-8
Note that we saved $gp at 16($sp), then tried to restore it before we fixed
$sp up again.
Does anyone have a good idea? The best I can think of is to emit the jalr
from GCC directly, so that we can restore the GP after restoring the stack
pointer properly.
--
Daniel Jacobowitz Carnegie Mellon University
MontaVista Software Debian GNU/Linux Developer