gprof on powerpc fails if compiled with older gcc

Brad Parker brad at parker.boston.ma.us
Fri Mar 31 06:40:19 EST 2000


Hi

this is pretty scarey (for me) but perhaps someone who knows more about
gcc knows why...  I assume it's a known bug.

I could not get gprof to work on powerpc linux.  It would crash somewhere
in malloc.  Turns out the real crash is caused by a bug in gcc which
messes up a structure copy if the lvalue is a post incremented pointer...

(this must not be something people do much)

Hopefully this helps the other people who were trying to get gprof to
work on powerpc.  Just recompile binutils with gcc 2.95.2...

-brad

bad compiler:
gcc version egcs-2.91.66 19990314 (egcs-1.1.2 release)

working compile:
gcc version 2.95.2 19991024 (release)

code fragment: (gprof/symtab.c, line 126)

...
      else
	{
	  if (dst > tab->base && dst[-1].end_addr == 0)
	    {
	      dst[-1].end_addr = src->addr - 1;
	    }

	  /* retain sym only if it has a non-empty address range: */

	  if (!src->end_addr || src->addr <= src->end_addr)
	    {
#if 1
	      *dst++ = *src;   <-- works only in later gcc
#else
	      *dst = *src;     <-- works for both
	      dst++;
#endif
	      prev_addr = src->addr;
	    }
	}
    }
...


bad asm fragment:
.stabn 68,0,137,.LM43-symtab_finalize
.LM43:
	addi 9,31,16
	lwz 11,0(9)
	lwz 0,12(31)
	addi 11,11,216
	stw 11,0(9)
	mr 3,11			<-- woa.  this is after the ++
	mr 4,0
	li 5,216
	crxor 6,6,6
	bl memcpy
	mr 0,3
.stabn 68,0,142,.LM44-symtab_finalize


good asm fragment:
.stabn 68,0,137,.LM43-symtab_finalize
.LM43:
	addi 9,31,16
	lwz 11,0(9)
	lwz 10,12(31)
	mr 0,11			<-- save old ptr in r0
	li 8,216
	addi 11,11,216
	stw 11,0(9)
	mr 3,0			<-- use old ptr
	mr 4,10
	mr 5,8
	bl memcpy
	mr 0,3

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/





More information about the Linuxppc-dev mailing list