public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
* need help for mcount for MIPS
@ 2001-02-08  1:51 Scholz Maik (K7/EEM15) *
  0 siblings, 0 replies; only message in thread
From: Scholz Maik (K7/EEM15) * @ 2001-02-08  1:51 UTC (permalink / raw)
  To: gcc-help, gcc

Hi all,
i am using the gnu compiler (gnupro 98r2). 
Our target is mips lsi in mips16/mips32 mode.
With the "-pg" option the compiler adds the 
following code to all C functions.

example C function ...

int main(void) 
#endif
{
 988:	27bdffe8 	addiu	$sp,$sp,-24
 98c:	afbf0010 	sw	$ra,16($sp)
 990:	03e00821 	move	$at,$ra
 994:	0c000000 	jal	_mcount
 998:	27bdfff8 	addiu	$sp,$sp,-8
	...
}
 b8c:	8fbf0010 	lw	$ra,16($sp)
 b90:	00000000 	nop
 b94:	03e00008 	jr	$ra
 b98:	27bd0018 	addiu	$sp,$sp,24

The needed "_mcount" functions, implemented by
my self.

	.text
	.set noat
	.set noreorder
	.globl _mcount
	.ent _mcount
		
_mcount:
	/* trace some data (RA,TIME,...) */
	
_mcount_ret: /* return */	
	addu	sp,sp,8				# _mcount push 2 words from
stack 
	jr	ra
	move    ra,at				# restore return address ra
	
	.set reorder
	.end _mcount

Ok this is working fine. Now i want to trace the 
function end of the calling method. My idea was
to modify the return address (ra) on the stack pointer.
But where can i find the original return address?

_mcount_end:
	/* trace some data (RA,TIME,...) */
	
	move    ra,at
	jr	ra
	nop
	.set reorder
	.end _mcount

Ist there any similar working use of the "-pg" feature.
"-pg" is currently not implemented in the mips16 mode.

gcc/config/mips/mips.h
#define FUNCTION_PROFILER(FILE, LABELNO)				\
{									\
  if (TARGET_MIPS16)							\
    sorry ("mips16 function profiling");				\
  fprintf (FILE, "\t.set\tnoreorder\n");				\
  fprintf (FILE, "\t.set\tnoat\n");					\
  fprintf (FILE, "\tmove\t%s,%s\t\t# save current return address\n",	\
	   reg_names[GP_REG_FIRST + 1], reg_names[GP_REG_FIRST + 31]);	\
  fprintf (FILE, "\tjal\t_mcount\n");					\
  fprintf (FILE,							\
	   "\t%s\t%s,%s,%d\t\t# _mcount pops 2 words from  stack\n",	\
	   TARGET_64BIT ? "dsubu" : "subu",				\
	   reg_names[STACK_POINTER_REGNUM],				\
	   reg_names[STACK_POINTER_REGNUM],				\
	   Pmode == DImode ? 16 : 8);					\
  fprintf (FILE, "\t.set\treorder\n");					\
  fprintf (FILE, "\t.set\tat\n");					\
}

How can i implement this. Is this only change this macro or 
are there any other changes needed in the gcc source code.

Thanks for any help.

Regards

Maik Scholz

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2001-02-08  1:51 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-02-08  1:51 need help for mcount for MIPS Scholz Maik (K7/EEM15) *

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).